- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux字符设备基础
Linux字符设备基础
字符设备驱动程序在系统中的位置
操作系统内核需要访问两类主要设备,简单的字符设备,如打印机,键盘等;块设备,如软盘、硬盘等。与此对应,有两类设备驱动程序。分别称为字符设备驱动程序和块设备驱动程序。两者的主要差异是:与字符设备有关的系统调用几乎直接和驱动程序的内部功能结合在一起。而读写块设备则主要和快速缓冲存储区打交道。只有需要完成实际的输入/输出时,才用到块设备驱动程序。见下图:
Linux设备驱动程序的主要功能有:
对设备进行初始化;
使设备投入运行和退出服务;
从设备接收数据并将它们送到内核;
将数据从内核送到设备;
检测和处理设备出现的错误。
当引导系统时,内核调用每一个驱动程序的初始化函数。它的任务之一是将这一设备驱动程序使用的主设备号通知内核。同时,初始化函数还将驱动程序中的函数地址结构的指针送给内核。
内核中有两张表。一张表用于字符设备驱动程序,另一张用于块设备驱动程序。这两张表用来保存指向file_operations结构的指针,设备驱动程序内部的函数地址就保存在这一结构中。内核用主设备号作为索引访问file_operations结构,因而能访问驱动程序内的子程序。
从开机到驱动程序的载入
系统启动过程中可能出现几种不同的方式检测设备硬件。首先机器硬件启动时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.c init()
filesystems.c sys_setup()
genhd.c device_setup()
mem.c chr_dev_init()
至此,驱动程序驻入内存。
设备驱动程序基本数据结构:
struct device_struct
系统启动过程中要登记的块设备和字符设备管理表的定义在文件fs/devices.c中:
struct device_struct {
const char * name;
struct file_operations * fops;
};
static struct device_struct chrdevs[MAX_CHRDEV];
static struct device_struct blkdevs[MAX_BLKDEV];
其实块设备表和字符设备表使用了相同的数据结构。在某些系统中,这些设备表也称作设备开关表,不同的是它们直接定义了一组函数指针进行对设备的管理。而这里系统用文件操作(file_operations)代替了那组开关。文件操作是文件系统与设备驱动程序之间的接口,系统特殊文件在建立的时候并没有把两者对应起来,只是把设备的缺省文件结构和i节点结构赋给设备文件,而真正的对应定义在系统启动之后,当设备被打开时时才进行的。
操作blkdev_open和chrdev_open定义在文件devices.c中,它们的基本功能是当设备文件初次打开时,根据该文件的i节点信息找到设备真正的文件操作接口,然后更新原来的设备表项;最后再调用该设备的open操作。
/include/linux/major.h中定义了设备表的长度。设备表中不同的表项表示不同种类的设备,也就是说,LINUX系统分别支持各128种不同的块设备和字符设备。
Struct file_operations
操作系统将一个字符设备当作文件来处理,内核通过file_operations结构来访问driver的功能。这也是linux的OO思想的体现之一。file_operations的定义在文件linux/fs.h中。
每个字符设备都有一个file_operatioins结构。这个结构指向一组操作函数(open,read…).
每个函数的定义由driver提供。当然,有些标准操作某些设备并不支持,这时,file_operatons
结构中对应表项为NULL
(.随着linux内核的不断升级,file_operatioins结构也不断变大。最新的版本中,甚至函数原型也发生了一些变化。当然,新版本总会向下兼容的。)
下面是2.0.35中的file_operations结构定义:
struct file_operations {
int (*lseek) (struct inode *, struct file *, off_t, int);
in
您可能关注的文档
- java swing课件.ppt
- java Web 应用开发之velocity模板使用.doc
- Jack Nelson’s problem.ppt
- java 猜数字游戏课程设计.doc
- javaKe视频聊天模块实现.doc
- javascript图片滚动的代码.doc
- Javascript学习第一季--Javascript DOM 总结.doc
- javascript操作表格.doc
- JAVA_EE经典面试题.doc
- java九阴真经.doc
- 某某单位2024年党建工作总结及2025年工作计划.doc
- 某某市发改委关于2024年度落实党风廉政建设工作责任制情况的报告.doc
- 某某局2024年全面从严治党和党风廉政建设工作总结.doc
- 某某区财政局2024年法治政府建设总结及2025年工作谋划.doc
- 2024年党管武装工作述职报告2篇.doc
- 2024年度国企党委书记抓基层党建工作述职报告3篇.doc
- 公司党委书记2024年述职述廉报告.docx
- 2024年度乡镇党委领导班子民主生活会(四个带头)对照检查材料.doc
- 市医疗保障局关于2024年法治政府建设工作情况的报告.docx
- 市民政局党组2024年巡察整改工作情况报告.docx
文档评论(0)