分享

linux驱动程序学习1

 LongAnla 2015-10-19
驱动学习的知识结构:
1,linux驱动程序设计模式(30%)
2,内核相关知识(30%)
3,硬件相关知识(30%)
什么是驱动程序? 答:使硬件工作的软件
linux2.6版本驱动程序的大致分类:
1,字符设备驱动 (重点)
2,网络接口驱动 (重点)
3,块设备驱动
什么是字符设备?
字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open,close,read和write系统调用。
什么是块设备?
在大部分的unix系统中,块设备不能按字节处理数据,只能一次传送一个或多个长度是512字节(或一个更大的2次幂的数)的整块数据。而linux则允许块设备传送任意数目的字节。因此,块设备和字符设备的区别仅仅是驱动的与内核的接口不同。
字符设备和块设备的区别?
字符设备是一个字符一个字符的传输,没有使用系统的CACHE BUFFER,所以读写的速度很快,通常这样的设备叫做裸设备;块设备是通过系统的BUFFER进行读写操作,不是直接和物理磁盘读取。
字符设备和块设备不过是系统对硬件的不同操作方式。打比方说,以磁盘为例,你可以一个一个字符去读(字符设备),也可以一次读进一块数据(块设备),硬盘格式化时,用字符方式访问,而日常读写数据时用块方式访问。诸如终端等设备由于只能一个一个字符处理,就没有块设备。
系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片被称作块。最常见的块设备是硬盘,除此以外,还有软盘驱动器,CD-ROM驱动器和闪存等等许多其他块设备。注意,他们都是以安装文件系统的方式使用的--也是块设备一般的访问方式。
另一种基本的设备类型是字符设备。字符设备按照字符流的方式被有序访问,像串口和键盘都属于字符设备。如果一个硬件设备是以字符流的方式被访问的话,那就应该将它归于字符设备;反过来,如果一个设备是随机(无序的)访问方式,那么他就属于块设备。
这两种类型的设备的根本区别在于他们是否是可以被随机访问--换句话说就是,能否在访问设备时随意地从一个位置跳转到另一个位置。举个例子,键盘这种设备提供的就是一个数据流,当你敲入“fox”这个字符串时,键盘驱动程序会按照和输入完全相同的顺序返回这个由三个字符组成的数据流。如果让键盘驱动程序打乱顺序来读取字符串,或读取其他字符,都是没有意义的。所以键盘就是一种典型的字符设备,他提供的就是用户从键盘输入的字符流。对键盘进行读操作会得到一个字符流,首先是“f”,然后是“o”,最后是“x”,最终是文件的结束(EOF)。当没人敲键盘时,字符流就是空的。硬盘设备的情况就大不一样了。硬盘设备的驱动可能要求读取磁盘上任意块的内容,然后又转去读取别的块的内容,而被读取的块在磁盘上位置不一定要连续,所以说硬盘可以被随机访问,而不是以流的方式被访问,显然他是一个块设备。
内核管理块设备要比管理字符设备细致得多,需要考虑的问题和完成的工作相比字符设备来说要复杂许多。这是因为字符设备仅仅需要控制一个位置--当前位置,而块设备访问的位置必须能够在介质的不同区间前后移动。所以事实上内核不必提供一个专门的子系统来管理字符设备,但是对块设备的管理却必须要有一个专门的提供服务的子系统。不仅仅是因为块设备的复杂性远远高于字符设备,更重要的原因是块设备对执行性能的要求很高;对硬盘每多一分利用都会对整个系统的性能带来提升,其效果要远远比键盘吞吐速度成倍的提高大得多。另外,我们将会看到,块设备的复杂性会为这种优化留下很大的施展空间。
简单来讲,块设备可以随机存取,而字符设备不能随机存取,那裸设备又该如何解释呢?
难道裸设备,如磁盘裸设备也不能随机读取吗?那在数据库中用裸设备建一个2G的数据文件,为了存取最后一个数据块,难道oracle还要把前面的所有数据块都读一遍?显然不符合事实,如果这样解释呢,操作系统不能随机读取,并不意味着数据库也不能随机读取。
块设备通过系统缓存进行读取,不是直接和物理磁盘读取。
字符设备可以直接物理磁盘读取,不经过系统缓存,如键盘,直接响应中断。
什么是网络接口驱动?
任何网络事物都通过一个接口来进行,一个接口通常是一个硬件设备(eth0),但他也可以是一个纯粹的软件设备,比如回环接口(lo)。一个网络接口负责发送和接收数据报文。
驱动程序安装方式
1,模块方式
2,直接编译进内核
例如:将helloworld编译进内核,cp hello.c  linux-2.6.29/drivers/char  保证驱动代码在内核中。
接着 vim Kconfig 文件,在开始添加 config HELLO_DRIVER
                                      bool "my hello driver"
保存后退出,执行 make menuconfig
在 Device drivers-->Character drivers中首行看到在Kconfig 中添加的 "my hello driver"选项。所以Kconfig的作用就是产生menuconfig菜单里面的内容,其中 HELLO_DRIVER 的作用是在.config中配置项的名字,bool 选项只有true 和false 两种选择,tristate有三种选择。
进入 cd  linux2.6.29/deivers/char/中,修改Makefile,添加 obj-$(CONFIG_HELLO_DRIVER)  +=hello.o 然后编译内核,驱动程序在内核中添加成功。
linux用户如何使用驱动程序?
应用程序通过字符设备文件访问字符设备;
应用程序通过块设备文件或者文件系统访问块设备;
应用程序通过socket,再经过协议栈访问网络接口设备。
linux用户程序通过设备文件(又名设备节点)来使用驱动程序操作字符设备和块设备。
设备(字符,块)文件在/dev 目录下。执行 ll 可以看到以c开头的是字符设备文件,以b开头的是块设备文件。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多