- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux设备管理-Read
Linux 设备管理 模块的安装和卸载 设备管理 模块的安装和卸载 模块:可以作为独立程序来编译的函数和数据结构的集合。它可以动态的增加内核的功能。 装载: 静态装载:在内核启动时 动态装载:在内核运行时 注:当前装载的模块可以在/proc/modeles读出。 模块一旦被装入系统,就在内核地址空间中管态下执行。模块中的每个新函数都必须在模块装入内核中时进行注册。模块卸载时,函数必须注销。 模块的安装和卸载 模块的装载 insmode过程: 1、新模块加入到内核空间 2、查找导出的内核符号对模块中的外部符号引用进行解析,并确保该模块所引用的其它模块均已装入系统。 3、为新模块分配内存空间 4、装载新模块,并导出该模块定义的符号。 5、调用新模块中的初始化函数 模块的安装和卸载 模块的卸载 rmmod过程: 注销相应的函数和内核符号 取消虚拟地址映像 释放模块使用空间 说明:如有其它模块引用它,则不能卸载。 设备管理 系统中的所有硬件设备看起来都和一般的文件一样,它们可以使用处理文件的标准系统调用来打开、关闭和读写。 系统中的每一个设备都由一个设备文件来代表,设备文件名由主设备号和从设备号组成。例如,主IDE硬盘的设备文件是/dev/hda。一个设备驱动程序控制的所有设备有一个相同的主设备号,通过不同的从设备号来区分设备和它们的控制器。例如,主IDE硬盘的每一个分区都有一个不同的从设备号,这样主IDE硬盘的第二个分区的设备文件是/dev/hda2。Linux系统使用主设备号和系统中的一些表来将系统调用中使用的设备文件映射到设备驱动程序中。 设备管理 Linux 系统支持三种类型的硬件设备 字符设备:字符设备是直接读取的,不必使用缓冲区。 块设备:块设备每次只能读取一定大小的块的倍数,通常一块是512或者1024字节。块设备通过缓冲区读写,并且可以随机地读写。块设备可以通过它们的设备文件存取,但通常是通过文件系统存取。只有块设备支持挂接的文件系统。 网络设备:网络设备是通过BSD套接字接口存取的。 设备管理 L i n u x系统支持多种设备,这些设备的驱动程序之间有一些共同的特点: 内核代码:设备驱动程序是系统内核的一部分,所以如果驱动程序出现错误的话,将可能严重地破坏整个系统。 内核接口:设备驱动程序必须为系统内核或者它们的子系统提供一个标准的接口。 内核机制和服务:设备驱动程序利用一些标准的内核服务,例如内存分配等。 可装入:大多数的L i n u x设备驱动程序都可以在需要时装入内核,在不需要时卸载。 可设置:L i n u x系统设备驱动程序可以集成为系统内核的一部分,至于哪一部分需要集成到内核中,可以在系统编译时设置。 动态性:当系统启动并且各个设备驱动程序初始化以后,驱动程序将维护其控制的设备。如果设备驱动程序控制的设备并不存在,也并不妨碍系统的运行。 设备管理 Linux内核和设备驱动程序之间使用标准的交互接口。 设备驱动程序在其初始化时就在系统内核中进行登记。Linux系统使用设备驱动程序的登记表作为内核和驱动程序接口的一部分。这些表中包括指向处理程序的指针和其他信息。 设备管理 字符设备 设备管理 块设备 内核对块设备的操作要使用缓冲区。因此,每一个块设备驱动程序必须既向缓冲区提供接口,也提供一般的文件操作接口。每一个块设备都在blk_dev数组中有一个blk_dev_struct结构的记录。 数据结构blk_dev_struct 包括: request_queue:指向请求数据结构链表的指针,每一个请求数据结构都代表一个来自缓冲区的请求 queue:请求过程的地址 data:辅助信息,帮助找到特定设备的请求队列 设备管理 设备管理 每当缓冲区希望和一个在系统中注册的块设备交换数据,它都会在blk_dev_struct中添加一个请求数据结构。每一个请求都有一个指针指向一个或者多个buffer_head数据结构,每一个buffer_head 结构都是一个读写数据块的请求。每一个请求结构都在一个静态链表all_requests中。如果请求添加到了一个空的请求链表中,则调用设备驱动程序的请求函数来开始处理请求队列。否则,设备驱动程序只是简单地处理请求队列中的每一个请求。 一旦设备驱动程序完成了一个请求,它将把buffer_head 结构从request结构中移走,并把buffer_head结构标记为已更新,同时将它解锁。这样就可以唤醒等待锁定操作完成的进程。 * * 主设备号 chrdevs数组 blkdevs数组 VFS inode 数组元素均为device_struct结构 name:指向登记的设备驱动程序名 fops:指向一个包括各种文件操作过程的地址的数组。此数组中包括的地址指向设备驱动程序中处
文档评论(0)