- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE3 / NUMPAGES15
完整的内存设备驱动程序
目录
TOC \o 1-3 \u 一、设备驱动中的并发控制 2
1、并发 2
2、自旋锁 2
2.1、自旋锁的使用 2
3、信号量 2
3.1、信号量的相关操作 3
3.2、信号量用于同步 3
二、设备驱动中的阻塞与非阻塞 3
1、阻塞操作 3
2、非阻塞操作 3
3、等待队列 3
3.1、等待队列的相关操作 3
4、轮询操作 4
三、设备驱动中的异步通知 4
1、异步通知 4
2、信号的接收 4
3、信号的释放 4
3.1、异步通知编程用到一项数据结构和两个函数 4
四、设备I/O端口和I/O内存的访问 5
1、I/O端口与I/O内存 5
2、可以使用以下函数访问定位于I/O空间端口 5
2.1、I/O内存 5
2.2、对设备内存映射的虚拟地址的读写 5
3、申请与释放设备I/O端口和I/O内存 5
4、设备I/O端口和I/O内存访问流程 5
4.1、设备I/O端口访问流程 5
4.2、I/O内存访问流程 5
五、globalfifo驱动涉及的结构体、操作及代码 5
1、globalfifo设备结构体 5
1.1、cdev结构体 6
1.2、设备号的分配和释放 6
1.3、struct file_operations结构体 6
2、使globalfifo驱动实现异步通知 7
3、文件打开函数于释放函数 7
4、读写函数 7
4.1读函数 7
4.2、写函数 8
5、ioctl设备控制函数 10
6、轮询操作 10
7、初始化并注册cdev 11
8、文件操作结构体 11
9、设备驱动模块加载函数 12
9.1自动创建设备文件 13
10、模块卸载函数 13
11、其他代码 13
11.1、必要的头文件 13
11.2模块的相关信息 14
六、Makefile 14
七、模块加载 14
1、直接编译内核 14
2、使用模块法 15
设备驱动最通俗的理解是“驱使硬件设备行动”。驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询、中断处理、DMA通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据。
现以globalfifo设备驱动为例介绍完整的内存设备驱动程序。首先描述一下该驱动中所涉及到的并发控制、自旋锁、信号量、阻塞与非阻塞I/O、轮询操作、异步通知与异步I/O和I/O访问等。
一、设备驱动中的并发控制
1、并发
指的是多个执行单元同时、并行被执行。而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问很容易导致竞态。处理并发的常用技术是加锁或者互斥,即确保在任何时候只有一个执行单元可以操作共享资源。在Linux内核中主要通过信号量机制和自旋锁机制实现。
2、自旋锁
可以从它的工作方式理解,即,在某CPU上运行的代码需要先执行一个原子操作,该操作测试并设置某个内存变量,由于它是原子操作,所以在该操作完成之前其他执行单元不可能访问这个内存变量。如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行;如果测试结果表明锁仍被占用,程序将在一个小的循环内重复这个“测试并设置”操作,即进行所谓的“自旋锁”。自旋锁最多只能被一个可执行单元持有。
2.1、自旋锁的使用
a.定义自旋锁
spinlock_t lock;
b.初始化自旋锁
spin_lock_init(lock)
该宏用于动态初始化自旋锁lock。
c.获得自旋锁
spin_lock(lock)
该宏用于获得自旋锁lock,如果能立即获得锁,马上返回,否则,它将自旋在那里,直到该自旋锁的保持者释放。
d.释放自旋锁
spin_unlock(lock)
3、信号量
它主要提供对进程间共享资源访问控制机制。与自旋锁类似,只有得到信号量的进程才能执行临界区代码。与自旋锁不同的是,当获得不到信号量时,进程不会原地打转而是进入休眠等待状态。
3.1、信号量的相关操作
a.定义信号量
struct semaphore sem;
定义名为sem的信号量。
b.初始化信号量
void sema_init(struct semaphore *sem,int val);
该函数初始化信号量,并设置信号量sem的值为val。
c.获得信号量
void down(struct semaphore *sem);
该函数用于获得信号量sem,它可能会导致睡眠。
d.释放信号量
void up(struct semaphore *sem);
该函数释放信号量sem,唤醒等待者。
3.2、信号量用于同步
您可能关注的文档
最近下载
- _【石油修井】特殊井大修工艺技术.pdf VIP
- 《0~3岁婴幼儿教育活动设计与指导》项目四 婴幼儿认知发展教育活动设计与指导.pptx VIP
- 第四章 石油修井 修井工具讲义.pdf VIP
- 2024年《义务教育课程标准(2022年版)课例式解读》初中英语读后感.docx VIP
- 银行半结构化面试必问题目及参考回答.docx VIP
- GB_T 33700-2017地基导航卫星遥感水汽观测规范.docx VIP
- GB_T 42988-2023 多源遥感影像网络协同解译.pdf VIP
- DB42T 2425-2025 自然资源光学遥感卫星影像应用分类分级规范.pdf VIP
- 油水井井筒大修作业资料讲解.ppt VIP
- H公司基层员工激励机制研究.docx VIP
原创力文档


文档评论(0)