最近在学习Linux的字符设备驱动,写一下学习笔记。嘿嘿!
Linux的驱动程序两种安装方法:以模块的形式加载 , 直接编译进内核。驱动的编写我个人把它分为三部分:Linux驱动设计模式(模板)为40%,内核相关的知识为30%,硬件知识为30%.
那么什么是字符设备,什么是块设备,以及它们的区别是什么呢? 下面来简单介绍一下, 字符设备是一种按字节来访问的设备,字符驱动负责驱动(使能)字符设备,而对于块设备,在大多数Unix系统中,块设备不能按字节处理数据,只能一次传送一个或多个长度是512个字节(或者一个更大的2次幂的数)的整块数据。而Linux则允许块设备传送任意字节。二者的区别如下:字符设备是以字节为最小访问单位的,而块设备是以块为最小访问单位的,块的大小可以是512个字节或者是512个字节的整数倍。另外字符设备是不可以随机访问的(例如从键盘输入for,则读取就是for,不能是别的顺序如rof),而块设备有存储位置的概念是可以随机访问指定位置上的数据(随机访问可以理解为访问时可以从一个位置跳到另一个位置),如果块设备的容量足够,就可以容纳一个文件系统,有了文件系统的块设备就可以被挂载,另外在Linux系统中块设备是可以按字节访问的,Linux中字符设备驱动和块设备驱动的区别就在于驱动与内核的接口不同。
设备文件在文件系统中有一个对应的索引节点,但并不占用存储文件内容的空间,设备文件与内核的设备驱动则是通过设备号来建立联系的。设备号可以分为两部分:主设备号和次设备号。主设备号表示一种设备,而次设备号则表示一种设备中的某一个具体的设备,例如有三个串口1,2,3,它们都是串口为一种设备,拥有同样的主设备号,而次设备号不同。用命令mknod 可以建立设备文件:mknod 设备文件名 类型(字符设备 ,块设备) 主设备号 次设备号 例如 mknod -m 666 test c 5 0 ,其中 -m 参数用于指定文件权限,666是权限标志的八进制形式,test是设备文件名称,c 表示字符设备,5和0 分别是主设备号和次设备号,dev_t是内核用来表示设备号的数据类型,实际上是一个32为的无符号整数,内核用它的高12为表示主设备号,低20位表示一个次设备号。内核还提供了两个接口专门用于从dev_t型的数据中得到主次设备号:
unsigned int MAJOR(dev_t dev) ;这个函数用来得到主设备号 unsigned int MINOR(dev_t dev);这个函数用来得到次设备号。除此之外内核还提供了一个接口可以从主次设备号构造出dev_t型的数据:dev_t MKDEV(unsigned int major, unsigned int minor)
下面说一下字符设备的注册和注销。首先需要强调一点,注册和注销必须是一一对应的,一次注册得到的设备号区域不能分多次注销,注销时指定的设备号的起始值及个数必须等于注册时的值,这里说的注册包括自动分配的设备号
内核用一个结构体表示字符设备,结构体在使用之前其成员必须初始化,然后将其向内核注册,这样内核就多了一个字符设备。具体的分为三步,首先对设备号的操作,然后初始化字符设备,最后注册字符设备。
后续的博客中我会用一个具体的字符设备驱动的例子,具体的说一下。
阅读(1318) | 评论(0) | 转发(0) |