linux字符设备驱动-重新学习-笔记-1

字符设备驱动概念介绍:
1.应用程序与内核、驱动的关系;
2.框架;

1.应用程序与内核、驱动的关系:
linux中应用程序需要操作字符设备时,调用的open/read/write等API接口,这些接口是由C库实现的,C库也属于应用层。
当调用open/read/write等API时,实际上,C库中会去调用内嵌的ARM汇编指令swi,即软中断Software Interrupte。该汇编指令swi val会触发对应异常,类似于中断异常。该异常发生后,内核会进入异常处理函数中。相应的处理函数根据swi val中不同的val值,调用相应的系统调用,如sys_open/sys_read/sys_write。这些函数通过应用语句中要打开的不同文件属性,找到对应的硬件驱动,在去对应硬件进行操作。那么,顶层应用中的open/read/write是怎么样跟底层驱动中的硬件操作的dev_open/dev_read/dev_write对应的?这就要看下面的“驱动框架”介绍!

图1.Linux文件系统组件的体系结构(借用一下Tim的图)

2.驱动框架:
我们先来整理一下写驱动的思路:
(1)首先写出具体的设备驱动的读写操作函数,如:dev_open/dev_write/dev_read
(2)怎样告诉内核我新添加的驱动?
因为顶层应用是通过内核从上到下找到的设备驱动的,所以自己写的驱动必须要让内核知道。
a.驱动中定义一个file_operation的文件操作结构体,用设备上面写得设备驱动读写等操作函数填充该结构体;
b.通过设备驱动注册函数register_chrdev(),告诉内核我新写了一个驱动;
c.谁来调用注册函数?驱动入口函数来调用;
d.内核怎么知道谁是驱动入口函数?驱动文件中添加module_init(驱动入口函数名);这一句,这样内核就知道有这样一个驱动入口了。
注册函数中需要一个主设备号;
应用程序打开一个设备文件,该文件有几个属性,如c字符设备号,主设备号,次设备号;
那么应用程序最终怎么找到注册的对应设备驱动呢?通过设备类型、主设备号找到对应的file_operatione结构体!
注册函数实现的思路:有一个内核数组,以主设备号为索引,存储上对应于主设备好的file_operation结构体,这样就可以通过主设备号找到对应的文件操作结构体。
对应入口函数,还要有一个出口函数,用module_exit(驱动出口函数)告诉内核,这是该驱动出口,一般用于卸载驱动;

主设备号的创建有两种方式——在驱动程序中写死和自动分配两种方式。可以通过系统自动分配,也可以在驱动中写死,数值在1-255之间。

应用层中,通过open/read/write来操作某个设备文件,这个设备文件怎么来的?通过创建设备节点得到的。
设备节点也有两种方式来创建,即手动创建和自动创建。手动创建即mknod命令来创建;自动创建,在应用程序中是由udev创建,在busybox中通过mdev创建,mdev根据系统信息创建设备节点,那么系统信息怎么生成呢?通过设备类及类对象生成信息设备驱动的系统信息,即class_create()及class_device_create()函数来创建,并有mdev自动创建设备节点。那么上面创建的设备驱动的系统信息在哪里 呢?我们到/sys/class下能够找到对应的设备信息,mdev就是通过这些信息来自动创建的设备节点。并且我们每次修改驱动后,再次加载驱动,mdev都会自动帮我们更新对应的设备节点。为什么能支持及时更新呢?在/etc/init.d/rcS文件中有一句echo /sbin/mdev>/proc/sys/kernel/hotplug,这句的意思就是支持热插拔,我们每次加载卸载驱动,mdev都会帮我们更新。

从上面介绍的思路来看,应用程序通过设备文件名找到对应的设备节点,设备节点通过主设备号来找到设备驱动,设备驱动通过次设备号定位具体的设备。因此此过程涉及到的设备或文件名称中,只有 应用层要操作的设备文件名称必须与设备节点名称一致,其他的设备文件名,驱动文件的名称,驱动中的驱动名称,设备名称都没有关系,也就是说这几个名称都可以不同,只要主次设备号一致就可以

-表示常规文件;
d表示目录文件;
c表示字符文件;
VFS,virtual file system虚拟文件系统  

参考阅读:
1.C语言内嵌ARM汇编——SWI使用 http://hi.baidu.com/bailyzheng/item/608524eab84ba6f4e0a5d4a3
2.ARM SWI软中断详解 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2093473;
3.arm swi软中断测试 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3634335;
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值