【1】信号驱动IO

应用程序:1)应用程序要捕捉SIGIO信号
           signal(SIGIO, handler);

2)应用程序要指定进程为文件的属主,设置当前的文件描述为当前的调用进程
           fcntl(STDIN_FILENO, F_SETOWN, getpid());
           与之对应,在驱动,在struct file结构体,f_owner被设置成当前进程

3)应用程序通过fcntl函数在设备中设置FASYNC标志
           oflags = fcntl(fd, F_GETFL);
           fcntl(fd, F_SETFL, oflags | FASYNC);

驱动:    1)支持F_SETOWN命令,能在这个控制命令处理中设置filp->f_owner为对应进程ID。
              不过此项工作已由内核完成,设备驱动无须处理。

2)支持F_SETFL命令的处理,每当FASYNC标志改变时,驱动程序中的fasync()函数将得以执行。
              因此,驱动中应该实现fasync()函数。
              int (*fasync) (int, struct file *, int);

int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)
              功能:将fd添加或删除,到异步通知队列

void kill_fasync(struct fasync_struct **fp, int sig, int band)
              功能:发送信号
              参数:fp   异步通知队列
                    sig  信号的类型
                    band   位掩码   POLLIN  可以读
                                    POLLOUT 可以写
              
【2】Linux设备模型 platform
     linux设备模型,分为三个实体:驱动,设备,总线

集成在SOC中读的设备,都可以称之为platform设备,通过总线将驱动和设备完成匹配,当向内核注册设备,通过总线匹配对应驱动程序
     当内核注册驱动,通过总线匹配相对应的设备

总线:
     总线可以是物理存在的,也可以是虚拟的。内核中对应的结构为struct bus_type。

struct bus_type {
    const char        *name;  总线名称
        int (*match)(struct device *dev, struct device_driver *drv);  匹配方式
     设备:
     设备是连接到某条物理或者虚拟总线上的对象。可能是真正物理对象,也可能是虚拟对象。内核中对应的结构为struct device。
     struct device {
             struct bus_type    *bus;
                struct device_driver *driver;    /* which driver has allocated this    
     驱动:
     驱动是用来和设备通信的软件程序。驱动可以从设备中获取数据,也可以把相应数据发给设备进行处理。内核中对应的结构为struct devicc_driver

platform架构:

总线
    struct bus_type platform_bus_type = {
    .name        = "platform",   总线
    .dev_groups    = platform_dev_groups,
    .match        = platform_match,  匹配方式

驱动
    struct platform_driver {
    int (*probe)(struct platform_device *);  回调函数,一旦设备与驱动匹配成功,调用此函数
    int (*remove)(struct platform_device *); 移除函数
    struct device_driver driver;             继承device_driver
    const struct platform_device_id *id_table;  匹配表

};

设备
    struct platform_device {
    const char    *name;   设备名称
    int        id;      设备名的后缀
    struct device    dev;     继承
    u32        num_resources;  资源的数量
    struct resource    *resource;      设备资源
    const struct platform_device_id    *id_entry;  匹配表
};
    描述硬件资源
   struct resource {
    resource_size_t start;   设备的起始地址
    resource_size_t end;     设备的末尾地址
    const char *name;
    unsigned long flags;     标志位
    struct resource *parent, *sibling, *child;
   };

#define IORESOURCE_MEM        0x00000200
    #define IORESOURCE_IRQ        0x00000400

platform驱动开发流程:

1)定义注册总线
    2)定义注册设备
       int platform_device_register(struct platform_device *pdev)
       int platform_device_unregister(struct platform_device *pdev)
    3)定义注册驱动
     
       #define platform_driver_register(drv) \
    __platform_driver_register(drv, THIS_MODULE

int __platform_driver_register(struct platform_driver *drv,
                struct module *owner)

void platform_driver_unregister(struct platform_driver *drv)

信号驱动IO的更多相关文章

  1. 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll

    关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...

  2. Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 上一讲 Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 我们讲解了多路复用等方面的知识,以及有关例程. ...

  3. 【网络IO系列】IO的五种模型,BIO、NIO、AIO、IO多路复用、 信号驱动IO

    前言 在上一篇文章中,我们了解了操作系统中内核程序和用户程序之间的区别和联系,还提到了内核空间和用户空间,当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后 , ...

  4. 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?

    通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...

  5. UDP信号驱动IO

    SIGIO信号 信号驱动式I/O不适用于TCP套接字, 因为产生的信号过于频繁且不能准确判断信号产生的原因. 设置信号驱动需把sockfd的非阻塞与信号驱动属性都打开 server sockfd单独提 ...

  6. IO的多路复用和信号驱动

    Linux为多路复用IO提供了较多的接口,有select(),pselect(),poll()的方式,继承自BSD和System V 两大派系. select模型比较简单,“轮询”检测fd_set的状 ...

  7. IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO

    最近看到OVS用户态的代码,在接收内核态信息的时候,使用了Epoll多路复用机制,对其十分不解,于是从网上找了一些资料,学习了一下<UNIX网络变成卷1:套接字联网API>这本书对应的章节 ...

  8. 🍛 餐厅吃饭版理解 IO 模型:阻塞 / 非阻塞 / IO 复用 / 信号驱动 / 异步

    IO 概念 一个基本的 IO,它会涉及到两个系统对象,一个是调用这个 IO 的进程对象,另一个就是系统内核 (kernel).当一个 read 操作发生时,它会经历两个阶段: 通过 read 系统调用 ...

  9. UNIX网络编程——信号驱动式I/O

    信号驱动式I/O是指进程预先告知内核,使得当某个描述符上发生某事时,内核使用信号通知相关进程. 针对一个套接字使用信号驱动式I/O,要求进程执行以下3个步骤: 建立SIGIO信号的信号处理函数. 设置 ...

随机推荐

  1. [洛谷P4889]kls与flag

    题目大意:有$n$根竹竿,第$i$根竹竿在$i$位置,第​$i$根竹竿高度为​$h_i$,每根竹竿可以向左倒或向右倒,问有几对竹竿倒下后顶端重合. 题解:求出每根竹竿倒下后的位置,离散化,记录一下每个 ...

  2. HDU - 3072 Intelligence System

    题意: 给出一个N个节点的有向图.图中任意两点进行通信的代价为路径上的边权和.如果两个点能互相到达那么代价为0.问从点0开始向其余所有点通信的最小代价和.保证能向所有点通信. 题解: 求出所有的强连通 ...

  3. 《c程序设计语言》读书笔记-第二个字符串任意一个在第一个字符串出现的位置,未出先返回-1

    #include <stdio.h> #include <string.h> #define Num 1000 int main() { int c,i,j = 0,m = 0 ...

  4. freemarker的简单入门程序

    本文主要介绍了freemarker的常用标签<#list>   <#import>  <#assign>  <#if> <#else> &l ...

  5. java爬虫--使用正则表达式获取网页中的email

    package com.enation.newtest; import java.io.*; import java.util.regex.*; import java.net.*; public c ...

  6. openGL初学函数解释汇总

    openGL初学函数解释汇总 1.GLUT工具包提供的函数 //GLUT工具包所提供的函数 glutInit(&argc, argv);//对GLUT进行初始化,这个函数必须在其它的GLUT使 ...

  7. CodeVs1515 跳

    题目描述 Description 邪教喜欢在各种各样空间内跳. 现在,邪教来到了一个二维平面.在这个平面内,如果邪教当前跳到了(x,y),那么他下一步可以选择跳到以下4个点:(x-1,y), (x+1 ...

  8. Duplicate the UIButton and Move it

    http://stackoverflow.com/questions/19241208/duplicate-the-uibutton-and-move-it/26438692#26438692 1do ...

  9. VS2013 更改MFC标题栏图标和生成的执行文件图标

    创建一个新工程,可以什么都不加.打开.rc,  创建或打开Icon资源(以下都以Icon为例).     单击工程窗口的资源视图标签,选中资源ID为IDR_MAINFRAME图标资源,然后按Delet ...

  10. FreeRTOS系列第2篇---FreeRTOS入门指南【转】

    转自:http://blog.csdn.net/zhzht19861011/article/details/49819309 版权声明:本文为博主原创文章,未经博主允许不得转载.联系邮箱:zhzhch ...