linux字符设备基础

linux字符设备基础

ID:9299044

大小:46.00 KB

页数:7页

时间:2018-04-27

linux字符设备基础_第1页
linux字符设备基础_第2页
linux字符设备基础_第3页
linux字符设备基础_第4页
linux字符设备基础_第5页
资源描述:

《linux字符设备基础》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux字符设备基础字符设备驱动程序在系统中的位置操作系统内核需要访问两类主要设备,简单的字符设备,如打印机,键盘等;块设备,如软盘、硬盘等。与此对应,有两类设备驱动程序。分别称为字符设备驱动程序和块设备驱动程序。两者的主要差异是:与字符设备有关的系统调用几乎直接和驱动程序的内部功能结合在一起。而读写块设备则主要和快速缓冲存储区打交道。只有需要完成实际的输入/输出时,才用到块设备驱动程序。见下图:用户程序系统调用接口文件系统高速缓存字符设备块设备驱动程序硬设备Linux设备驱动程序的主要功能有:l对设备进行初始化;l使设备投入运行和退出服务;l从设备接收数

2、据并将它们送到内核;l将数据从内核送到设备;l检测和处理设备出现的错误。当引导系统时,内核调用每一个驱动程序的初始化函数。它的任务之一是将这一设备驱动程序使用的主设备号通知内核。同时,初始化函数还将驱动程序中的函数地址结构的指针送给内核。内核中有两张表。一张表用于字符设备驱动程序,另一张用于块设备驱动程序。这两张表用来保存指向file_operations结构的指针,设备驱动程序内部的函数地址就保存在这一结构中。内核用主设备号作为索引访问file_operations结构,因而能访问驱动程序内的子程序。从开机到驱动程序的载入系统启动过程中可能出现几种不同的方

3、式检测设备硬件。首先机器硬件启动时BIOS会检测一部分必要的设备,如内存、显示器、键盘和硬盘等等。机器会把检测到的信息存放在特定的位置,如CMOS数据区。而另外某些设备会由设备驱动程序进行检测。1开机2引导部分(linux/config.h,arch/i386/boot/bootsect.S)3实模式下的系统初始化(arch/i386/boot/setup.S)4保护模式下的核心初始化5启动核心(init/main.c)init函数中函数调用关系如下:main.cinit()filesystems.csys_setup()genhd.cdevice_setu

4、p()mem.cchr_dev_init()至此,驱动程序驻入内存。设备驱动程序基本数据结构:structdevice_struct系统启动过程中要登记的块设备和字符设备管理表的定义在文件fs/devices.c中:structdevice_struct{constchar*name;structfile_operations*fops;};staticstructdevice_structchrdevs[MAX_CHRDEV];staticstructdevice_structblkdevs[MAX_BLKDEV];其实块设备表和字符设备表使用了相同的数据

5、结构。在某些系统中,这些设备表也称作设备开关表,不同的是它们直接定义了一组函数指针进行对设备的管理。而这里系统用文件操作(file_operations)代替了那组开关。文件操作是文件系统与设备驱动程序之间的接口,系统特殊文件在建立的时候并没有把两者对应起来,只是把设备的缺省文件结构和i节点结构赋给设备文件,而真正的对应定义在系统启动之后,当设备被打开时时才进行的。操作blkdev_open和chrdev_open定义在文件devices.c中,它们的基本功能是当设备文件初次打开时,根据该文件的i节点信息找到设备真正的文件操作接口,然后更新原来的设备表项;最

6、后再调用该设备的open操作。/include/linux/major.h中定义了设备表的长度。设备表中不同的表项表示不同种类的设备,也就是说,LINUX系统分别支持各128种不同的块设备和字符设备。Structfile_operations操作系统将一个字符设备当作文件来处理,内核通过file_operations结构来访问driver的功能。这也是linux的OO思想的体现之一。file_operations的定义在文件中。每个字符设备都有一个file_operatioins结构。这个结构指向一组操作函数(open,read…).

7、每个函数的定义由driver提供。当然,有些标准操作某些设备并不支持,这时,file_operatons结构中对应表项为NULL(.随着linux内核的不断升级,file_operatioins结构也不断变大。最新的版本中,甚至函数原型也发生了一些变化。当然,新版本总会向下兼容的。)下面是2.0.35中的file_operations结构定义:structfile_operations{int(*lseek)(structinode*,structfile*,off_t,int);int(*read)(structinode*,structfile*,cha

8、r*,int);int(*write)(struct

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。