您的位置:首页 > 运维架构 > Linux

linux设备驱动的文件操作机制

2013-02-25 21:58 183 查看

1. 并发控制

1.1 起因

并发:多个执行单元同时被执行。
竞态:并发的执行单元同时访问同一个共享资源。
举例:对称多处理器(SMP)竞态、单CPU内进程与抢占它的进程竞态、中断(硬中断、软中断、tasklet、底半部)与进程之间竞态。

1.2 控制方法

中断屏蔽
原子操作
自旋锁
信号量

2. 中断机制

申请和释放中断
使能和屏蔽中断
底半部机制

3. 阻塞机制

阻塞机制(等待队列)

1. 定义等待队列头变量(全局);

2. open()中初始化等待队列头;

3. read()中进入休眠(插入队列、改变状态、进程调度);

4. irq_handle()唤醒进程;

5. read()执行完。

poll机制(轮询机制:多文件)

1. 定义一个等待队列头(全局);

2. open()初始化等待队列头;

3. poll()插入等待队列(挂入队列、查询是否有事件);

4. irq_handle()唤醒;

5. read();

4. 异步机制

4.1应用编程

1.将信号与信号处理函数绑定;

2.实现信号处理函数;

3.设置信号的拥有者为本进程,将file结构体与pid绑定fcntl(fd,F_SETOWN,getpid());

4.设置为异步通知的模式。

4.2 驱动编程

1.定义一个Struct fasync_struct 结构体;

2.fasync()设置fasync_struct结构体;

3.irq_handle()发信号。

5. 设备打开

fd =open("设备文件",权限),完成了如下任务:

1.创建file和fd;

2.根据设备文件路径找到设备文件对应的inode结构体;

3.将inode结构体中的i_fop成员赋值给file结构体中的f_op成员;

f->f_op = fops_get(inode->i_fop)

4.调用file中的f_op成员中的open函数;

6.搜索内核中的一个哈希表,根据主设备号找到对应的cdev结构体;

7.将cdev结构体中的ops赋值给file中的f_op成员,

filp->f_op = fops_get(p->ops);

8.调用file中的f_op成员中的open函数,实际就是驱动人员写的xxx_open函数。

6. 设备读写

write(fd,&val,1) read(fd, &val, 1),完成了如下任务:

1. 根据fd找到相应的file结构体;

2. 调用file中的f_op成员中的write/read函数,实际就是调用xxx_write函数。

7. 内核定时器

8. 内存映射

注:个人学习,不妥望指正,持续改善中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: