设备驱动程序的实现ppt

上传人:ahu****ng1 文档编号:146175629 上传时间:2020-09-27 格式:PPTX 页数:36 大小:484.49KB
返回 下载 相关 举报
设备驱动程序的实现ppt_第1页
第1页 / 共36页
设备驱动程序的实现ppt_第2页
第2页 / 共36页
设备驱动程序的实现ppt_第3页
第3页 / 共36页
设备驱动程序的实现ppt_第4页
第4页 / 共36页
设备驱动程序的实现ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《设备驱动程序的实现ppt》由会员分享,可在线阅读,更多相关《设备驱动程序的实现ppt(36页珍藏版)》请在金锄头文库上搜索。

1、13.3.2 设备驱动程序的实现,1块设备 块设备主要包括硬盘、软盘等存储设备,前面已经提到过,块设备驱动程序有一部分是相同的,不同的主要是真正的I/O操作的那部分。 设备驱动程序一共可能有6种操作: OPEN: 验证设备是否可用; CLOSE:确保把采用延迟写方式处理的数据真正写到设备上; READ: 将数据从设备读到调用进程所在的内存区域; WRITE:与READ执行的操作相反; IOCTL:负责对I/O设备的操作参数进行检查和修改; SCATTERED_IO:允许执行同时读写多个块的操作。,13.3.2 设备驱动程序的实现, 块设备驱动程序软件。 MINIX在头文件driver.h中定义

2、了块设备驱动程序需要用到的结构定义,它们包括: driver结构:保存各驱动程序执行I/O操作所需调用函数的地址; device结构:以字节为单位保存基地址、长度等与分区相关的主要信息。,13.3.2 设备驱动程序的实现, 驱动程序库 可移植性是在MINIX中得到了相当的重视,MINIX的目标是当它被移植到一台机器上时,应该能够使用这台机器上原先运行的操作系统采用的分区表格式。 在IBM兼容机上,硬盘分区的标准由MS-DOS的fdisk命令确定。 MINIX包含了支持IBM兼容机分区的源代码,为了方便移植,这些与平台有关但是与具体硬件无关的代码没有被放在driver.c文件中,而是单独的放在d

3、rvlib.h和drvlib.c文件中。,13.3.2 设备驱动程序的实现, RAM盘 在MINIX中存在一个RAM盘的概念,简而言之就是保留一部分内存作为磁盘来使用,对于用户来说,它就像一个磁盘一样。 RAM盘的驱动程序实际上由四个紧密联系的部分组成,也就是具有以下四个次设备: 0:/dev/ram:真正的RAM盘,它的大小和基址在MINIX启动时由FS确定; 1:/dev/mem:用于读写物理内存,通常读出的是起始于内存零地址的内容,写操作则会改写中断向量; 2:/dev/kmem:用于读写内核内存,与1的功能类似; 3:/dev/null:负责接收数据并把数据抛弃掉。,13.3.2 设备

4、驱动程序的实现,2MINIX的系统任务 MINIX中将文件管理和内存管理摒弃在内核之外,禁止它们把信息写入内核.所以,如果内存管理系统想把消息通知给内核时,就需要借助于一个第三者对内核表拥有存取权的内核任务的帮助,这个任务一般被称之为系统任务。 系统任务和I/O任务十分类似,它们都实现了一个接口,具有相同的权限,都被链入内核中,所不同的仅仅是系统任务不控制具体I/O设备,它所服务的对象是系统中大部分的内部组件。,13.3.2 设备驱动程序的实现,系统任务的18种消息:,13.4 内存管理 13.4.1内存管理概述,由于MINIX是专门设计在IBM兼容机等微型机上运行的操作系统,因此它的内存管理

5、(MM)是比较简单的,不分页,也不交换: MM保存一张按照地址顺序排列的空闲地址列表,当系统调用FORK和EXEC请求内存时,MM利用首次适配算法找到一块足够大的空闲内存分配给程序使用。 而一旦程序装入内存则一直在原位置运行到结束。 可以说,内存管理的主要工作就是操作进程表和空闲地址列表这两张表格,以及处理系统调用FORK和EXEC。,13.4.1内存管理概述,1内存的消息处理 和I/O相仿,MM在系统初始化以后进入自己的主循环,等待消息,一旦收到消息就进行处理并发送应答消息。,13.4.1内存管理概述,与MM通信的消息类型、入口参数和应答:,13.4.1内存管理概述,2系统调用 下面我们来看

6、看系统调用FORK、EXEC和BRK的处理过程。 FORK。 执行FORK的过程很简单,收到FORK调用的请求后,MM就检查进程表中是否存在空闲位置,如果存在,就尝试为新建立的子进程分配内存,随后就将内存地址等信息填入一个空闲的进程表项,最后发出通知公布建立了一个新进程。 进程的终止则更复杂一些,当进程自己退出(或被信号杀死)并且被父进程通过WAIT调用观察到以后,该进程才会真正被删除,如果第二个条件没有满足,子进程就会被挂起,这种状态在MINIX中称为“僵死”。,13.4.1内存管理概述, EXEC。这个调用负责内存映像的更新,包括设置新堆栈,它也是MINIX中最复杂的系统调用。EXEC的复

7、杂主要是由两个方面的因素决定的: 次数众多的检测:EXEC执行时十分谨慎,为了保证有足够内存容纳新映像,必须进行检测。 设置初始堆栈:我们通常用库函数execve来调用EXEC,这个函数包含三个参数:被执行文件名的地址指针;一个指针数组的地址指针,数组中的元素分别指向一个参数;第三个参数同样是一个指针数组的地址指针。,13.4.1内存管理概述, BRK。BRK调用可以调整数据段的上限。有两个过程都可以调用BRK: brk过程以数据段的绝对长度为参数; sbrk以当前长度的增量为参数,计算出绝对长度后调用BRK。 执行BRK所完成的工作就是检查地址空间是否够用,并根据情况调整表格,然后通知内核。

8、,13.4.1内存管理概述,3. 内存数据结构 主要了解两个关键的数据结构:进程表和空闲表。 进程表。MINIX中,内核、FS和MM都拥有各自的进程表,每部分的进程表包含本部分必需的域,同时,三张进程表是对应的,也就是说,三张表的第n个表项指的都是同一个进程。也正是由于这个原因,三张表必须被同步更新。 空闲表。定义在alloc.h文件中的空闲表按照内存地址递增的顺序列出空闲块。 空闲表的表项主要包含三个域:空闲块组的基地址、空闲块组的大小及指向下一个空闲块组的指针。 表项以单向链表的形式链接。,13.4.2 实现,1. 头文件与主程序 MM中的table.c文件的主要作用是为全局变量服务,在t

9、able.c被编译时,它会自动为下面将介绍到的一些全局变量保留存储空间。 内存管理部分有许多自己使用的头文件,这些头文件有的和其它部分的头文件具有相同的名字,但由于它们位于不同的目录下为不同的部分服务,所以编译使用时不会出现错误。,13.4.2 实现, 头文件。在内存管理器MM中存在着一个私有的头文件mm.h,可以将它理解为MM范围内的主控头文件,它囊括了位于/usr/include及其子目录中的所有头文件,以及/kernel/kernel.h中包含的大部分头文件。MM中每个文件的编译都需要引用mm.h。 主程序。MM的主程序也位于main.c中,执行的过程和I/O任务的主程序类似。首先调用m

10、m_init,mm_init通过过程sys_getmap来获得内核的内存使用信息,为所有第二层及第三层的进程初始化进程表项,同时也为init进程初始化进程表项。,13.4.2 实现,2. 系统调用的实现 FORK。FORK调用由文件forkexit.c中的do_fork过程来实现。 EXIT。由过程do_mm_exit接收调用,然后具体工作交由mm_exit完成。 WAIT。WAIT和WAITPID调用都由过程do_waitpid完成。 EXEC。过程do_exec负责执行本调用。 BRK。BRK调用的处理代码位于break.c中,由过程do_brk完成。,13.4.2 实现,3.信号处理的实

11、现 MINIX中所有信号及与信号有关的系统调用都被包含在文件signal.c中,具体功能如下所示: ALARM:经过一段时间后向自己发送ALARM消息; KILL:给别的进程发出信号指示其下一步的动作; PAUSE:在收到下一个信号前挂起自己; REBOOT:发出信号终止所有的进程; SIGACTION:改变调用进程对将来收到信号的响应方式; SIGPROCMASK:改变阻塞信号的集合; SIGSUSPEND:改变阻塞信号集合后执行PAUSE调用; SIGPENDING:对未处理的阻塞信号进行检查; SIGRETURN:处理完信号后进行清理工作。,13.4.2 实现,4其它的系统调用 MM还有

12、几个很简单但是又必需的系统调用,MINIX把它们单独放在一个文件getset.c中,由过程do_getset执行: GETUID:返回有效的用户标号; GETGID:返回有效的分组号; GETPID:返回父子进程的进程号; SETUID:设置调用者有效的用户号; SETGID:设置调用者的有效分组号; SETSID:创建新的会话并返回进程号; GETPGRP:返回进程的分组标识。,13.5 文件系统 13.5.1文件系统概述,MINIX文件系统(FS)的功能包括两个方面的内容: 站在用户的角度,文件系统使得用户可以知道文件由什么组成、如何命名以及可以怎样操作文件。可以理解为文件系统为用户和文件

13、间提供了一个接口。 从系统的角度来考虑,文件系统的功能包括:决定以怎样的方式存储文件和目录,包括分配空间和释放空间的过程;管理磁盘空间,比如是以链接表或是以位图的方式记录空闲存储空间等等。本节中将详细介绍以上这些功能怎样实现。,13.5.1文件系统概述,1.消息 MINIX文件系统接收的消息种类比较多,一共有39种,其中两个是异常消息。其中下图列出的前面31种来自用户进程。后面6种来自系统调用,它们由MM先处理,然后调用FS完成其余工作。,13.5.1文件系统概述,13.5.1文件系统概述,13.5.1文件系统概述,2. i节点和位图 在MINIX里为了改进顺序读取文件时的性能,要确保同一文件

14、的所有磁盘块都位于同一个柱面上,为此引入了区段的概念,一个区段包含了多个块。 MINIX中为每个文件建立了一个索引表,表中存储了文件属性和各个块在磁盘上的地址,这个索引表被称为i节点。 MINIX使用位图来记录空闲的i节点和区段,保存位图的磁盘块被称为位图块。当创建一个文件时,FS在位图块中查找第一个空闲的i节点,在这个i节点被分配后,就修改指针指向下一个节点。,13.5.1文件系统概述,3. 目录管理 目录管理是文件系统的一个重要功能,我们查找一个文件,实际上就是先在目录树中找到文件名,然后通过对应的i节点在磁盘上找到文件数据。 目录查找过程:,13.5.1文件系统概述,4管道和设备文件 管

15、道和设备文件与普通文件的最大不同在于,普通文件的操作通常很快就能完成,而管道有时则需要等待几个小时才能有进程把数据写进来。而调用设备文件的进程,为了等待终端或其它设备上的I/O,时间也是不能确定的。 FS通过不发送信号的方式使得等待应答信号的调用进程被阻塞,一旦有别的进程修改了管道的状态使得被挂起的进程可以运行,FS就会设置一个标志。到下一次主循环时,FS提取以前保存在进程表中的各项参数,继续执行先前被挂起的进程。,13.5.2 实现,1头文件及全局变量 FS使用的数据结构和表,这些在头文件中得到定义。 const.h:定义了表长、标志位等一些文件系统中使用的常量的值; glo.h:和内存管理

16、中的glo.h文件一样,定义了一些全局变量; proto.h:提供了ANSI标准C编译器所支持的函数原型; type.h:定义了i节点在磁盘上的组织结构。,13.5.2 实现,2表格管理及其使用 块、超级块及i节点是文件系统中最重要的存储结构,对它们的管理和使用是通过一系列的过程来实现的。 用于管理块的过程有: alloc_zone:用于在区段位图中查找空闲区段,并将其分配给文件; flushall:通常被系统调用SYNC所调用,刷新某设备的缓冲,同时将其中内容写回设备; get_block:取要读写的块,先检查高速缓存,若找到就直接返回指针,否则就将其读入缓存; put_block:释放由get_block请求得到的块;,13.5.2 实现,free_zone:负责将不再使用的区段归还给空闲区段位图,以区段位图和位号为参数调用free_bit; rw_block:提供了一个简单的磁盘界面,负责在内存和磁盘间传送块; invalidate:删除某个设备在高速缓存中用过的所有块; rw_scattered:以设备标志符、缓冲区指针数组的指针、数组长度及读写标志为参数,执行在设备上读/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号