驱动程序 基本知识

什么是驱动程序

驱动程序就是使硬件工作的一种特殊软件,它运行在操作系统的内核空间(虚拟地址0xC0000000到0xFFFFFFFF),封装硬件细节,服务于系统调用。

 

驱动程序和应用程序的区别

1.应用程序运行在用户空间,驱动程序运行在内核空间。

2.应用程序可使用标准的库函数,而驱动程序连接到内核,只能使用内核导出的符号和函数。

3.应用程序错误,一般只会杀死进程,而驱动程序错误,会造成系统不稳定,或者崩溃。

4.应用程序拥有很大的栈空间,而内核栈很小,一般只有4KB。

5.驱动程序类似事件驱动编程,它初始化时候,注册一些设施,服务于系统调用。

 

驱动程序是这样被使用的

1.应用程序使用标准库提供的open函数,打开dev目录下的设备文件。

2.库函数根据参数,执行软件中断指令,引起CPU异常,从而进入内核模式。

3.内核异常处理函数,根据参数找到相应的驱动程序,并返回一个文件句柄给应用程序。

4.应用程序使用文件句柄,操作相应的设备,执行read和write等函数。

 

驱动程序的编写流程

1.查看原理图、数据手册,了解设备参数和操作设备的方法。

2.以内核相近的驱动为模板,进行开发。

3.实现驱动的初始化函数:申请设备号、初始化设备结构、申请中断号并注册中断处理函数、最后使用申请到的设备号连同file_oprations结构一并向内核注册。

4.实现file_oprations结构中的函数和中断服务函数。

5.将驱动程序编译进内核或者动态加载。

 

中断的体系与结构:内核对所有中断进行统一的编号,使用中断描述符irq_desc描述中断的名称、状态、标记底层中断管理函数。用户静态或者动态申请中断号时,request_irq根据中断号找到中断描述符irq_desc数组项,在它的Action链表中添加中断处理函数。

 

中断的处理流程

1.硬件中断发生时,cpu跳转到中断向量。

2.中断向量,读取中断控制器计算中断号,当参数调用中断总入口函数asm_do_IRQ

3.asm_do_IRQ根据中断号找到对应的irq_desc结构

4.从而逐个调用用户申请中断号时候,在Action中注册的中断处理函数。

 

并发的来源:smp、可抢占内核、硬件中断、可延迟机制(work_queue、tasklet、timer)。

并发解决机制:信号量、自旋锁、原子变量、循环缓冲区。

避免死锁:拥有锁的代码不能休眠;当需要多个锁的时候,以同样地顺序去获取。


驱动程序的识别

1.平台设备platform_device结构描述设备的名称,ID,占用的端口与内存。内核初始化阶段,将bsp里的平台设备添加到系统的设备链表。

2.平台驱动platform_driver结构描述操作设备的函数。它和平台设备通过设备名字进行比配。

 

IO端口和IO内存

它们和普通内存相同点是通过地址总线和数据总线,进行访问和数据的传输;不同点是IO端口和IO内存有边际效应,通过使用内存屏障函数来防止,指令被重新排序。


发布了48 篇原创文章 · 获赞 12 · 访问量 1141万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章