您的位置:首页 > 运维架构 > Linux

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

2013-12-07 17:49 633 查看
字符设备驱动概念介绍:

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: