nit _init_module void / ... / static void __exit _cleanup_module void / 加载驱动程序模块入口 / module_init_init_module / 卸载驱动程序模块入口 / module_exit_cleanup_module _intrrupt 设备发生中断时的处理程序. 1.对共享中断的处理 2.对spinlock以及其他的事务的处理 C. 底层设备操作函数的编写 read. write open release check_media_change revalidate等. open和release 打开设备是通过调用file_operations结构中的函数open 来完成的它是驱动程序用来为今后的操作完成初始化准备工作的。
在大部分驱动程序中open 通常需要完成下列工作 1. 检查设备相关错误如设备尚未准备好等。
2. 如果是第一次打开则初始化硬件设备。
3. 识别次设备号如果有必要则更新读写操作的当前位置指针f_ops。
4. 分配和填写要放在file-private_data里的数据结构。
5. 使用计数增1。
释放设备是通过调用file_operations结构中的函数release 来完成的这个设备方法有时也被称为close 它的作用正好与open 相反通常要完成下列工作 1. 使用计数减1。
2. 释放在file-private_data中分配的内存。
3. 如果使用计算为0则关闭设备。
read和 write 字符设备的读写操作相对比较简单直接使用函数read 和write 就可以了。
但如果是块设备的话则需要调用函数block_read 和block_write 来进行数据读写这两个函数将向设备请求表中增加读写请求以便Linux内核可以对请求顺序进行优化。
由于是对内存缓冲区而不是直接对设备进行操作的因此能很大程度上加快读写速度。
如果内存缓冲区中没有所要读入的数据或者需要执行写操作将数据写入设备那么就要执行真正的数据传输这是通过调用数据结构blk_dev_struct中的函数request_fn 来完成的。
ioctl--将cmd进行解释并送到设备的控制寄存器.事实上read和write也要通过ioctl来完成操作的 . ioctl CASE CMD SWITCH CASE1:... SWITCH CASE2:... SWITCH CASE N:... . . DEFAULT : ... END CASE 总结: 我们可以看出一个linux的驱动程序通常包含如下: 初始化设备模块、 I/O port DMA.Irq内存 buffer初始化并且填写具体设备数据结构注册 fops的具体函数等等 中断处理模块、设备释放模块、设备卸载模块 设备打开模块、数据读写和控制模块、 驱动装载模块、驱动释放模块.
上一篇:
RHCE认证概况及费用一览
下一篇:
法律专业开题报告范文