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

本文介绍了并发控制的概念及其在操作系统中的实现方法,包括中断屏蔽、自旋锁和信号量等,并详细阐述了中断机制、阻塞机制、异步机制以及设备的打开与读写流程。此外还提到了内核定时器和内存映射的相关概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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. 内存映射

 

 

注:个人学习,不妥望指正,持续改善中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值