②、算法:close 断开一个进程与设备的连接(续) c、核心释放设备文件的索引节点。设备关闭程序断开与设 备的连接,并重新初始化驱动程序的数据结构和设备硬件,使核 心以后又能再次打开该设备。 11
②、算法:close 断开一个进程与设备的连接(续) c、核心释放设备文件的索引节点。设备关闭程序断开与设 备的连接,并重新初始化驱动程序的数据结构和设备硬件,使核 心以后又能再次打开该设备。 11
②、算法:close 断开一个进程与设备的连接 输入:文件描述符 输出:无 执行正规的算法close; f(系统打开文件表项引用计数值非0) goto finish; f(存在另一个打开文件,其主次设备号与将关闭文件的相同) goto finish; if(字符设备)) 以主设备号为索引值查找字符设备开关表; 调用驱动程序关闭子程序:参数为次设备号; } if(块设备) { f(设备己作为子文件系统安装) goto finish; 将数据缓冲区高速缓冲中该设备的数据块写回设备; 用主设备号为索引值查找块设备开关表: 调用驱动程序关闭子程序:参数为次设备号; 使数据缓冲区高速缓冲中该设备的数据块无效; } finish: 释放设备文件索引节点; 12
②、算法:close 断开一个进程与设备的连接 输入:文件描述符 输出:无 { 执行正规的算法close; if ( 系统打开文件表项引用计数值非0 ) goto finish; if ( 存在另一个打开文件,其主次设备号与将关闭文件的相同 ) goto finish; if ( 字符设备 ) { 以主设备号为索引值查找字符设备开关表; 调用驱动程序关闭子程序:参数为次设备号; } if ( 块设备 ) { if ( 设备已作为子文件系统安装 ) goto finish; 将数据缓冲区高速缓冲中该设备的数据块写回设备; 用主设备号为索引值查找块设备开关表; 调用驱动程序关闭子程序:参数为次设备号; 使数据缓冲区高速缓冲中该设备的数据块无效; } finish: 释放设备文件索引节点; } 12
③ 算法read和write 针对设备的读写操作的算法与对正规文件的算法相似; 字符设备的驱动程序通常不使用系统中的数据缓冲区,而 使用内部的数据缓冲机制; 由于外部设备的速度相对较慢,驱动程序的写操作通常包 含流量控制; 驱动程序与设备间的数据通讯依赖于具体的硬件一通 常有“直接存储器存取(DMA)”模式和“可编程/O”模 式。 13
③ 算法 read 和 write 针对设备的读写操作的算法与对正规文件的算法相似; 字符设备的驱动程序通常不使用系统中的数据缓冲区,而 使用内部的数据缓冲机制; 由于外部设备的速度相对较慢,驱动程序的写操作通常包 含流量控制; 驱动程序与设备间的数据通讯依赖于具体的硬件 —— 通 常有“直接存储器存取(DMA)”模式和“可编程I/O”模 式。 13
4④) 、系统调用ioct! 在较早版本的UNIX系统中提供有专门用于终端的系统调用 stty(预置终端参数)和gtty(读取终端预置参数)。 ioctl融合了stty和gtty两者的功能,以提供一个更通用、更 规范的设备控制入口。它允许一个进程去设置与一个设备相关联 的硬件选项和与一个驱动程序相关联的软件选项。 ioc!可对多种设备进行操作,包括终端(如波特率、数据 位宽度、奇偶校验)、磁带(如正绕或反绕的方式)、网络(如 ip地址、虚电路数量)等。 由于ioct规定的专门的动作对每个设备都是不同的,并由 设备驱动程序来定义,因此,使用系统调用引oct!的程序必须知 道他们正在与什么类型的文件打交道,因为这些文件都是设备专 用的。 ioctl fd,command,arg) fd:系统调用返回的文件描述符; command:使驱动程序完成指定动作的请求命令; 14 arg:对应该命令的一个参数
④、系统调用 ioctl 在较早版本的UNIX系统中提供有专门用于终端的系统调用 stty(预置终端参数)和gtty(读取终端预置参数)。 ioctl融合了stty和gtty两者的功能,以提供一个更通用、更 规范的设备控制入口。它允许一个进程去设置与一个设备相关联 的硬件选项和与一个驱动程序相关联的软件选项。 ioctl可对多种设备进行操作,包括终端(如波特率、数据 位宽度、奇偶校验)、磁带(如正绕或反绕的方式)、网络(如 ip地址、虚电路数量)等。 由于ioctl规定的专门的动作对每个设备都是不同的,并由 设备驱动程序来定义,因此,使用系统调用ioctl的程序必须知 道他们正在与什么类型的文件打交道,因为这些文件都是设备专 用的。 ioctl ( fd, command, arg) fd: 系统调用返回的文件描述符; command: 使驱动程序完成指定动作的请求命令; arg: 对应该命令的一个参数。 14