文档详情

《计算机操作系统教程》课件_第7章.ppt

发布:2025-03-03约4.59万字共249页下载文档
文本预览下载声明

LinuxI/O子系统向内核其它部分提供了一个统一的标准的设备接口,它是通过数据结构file_operations(见include/linux/fs.h)来完成的。常用的访问接口有:

lseek() 重新定位读写位置

read() 从字符设备中读数据

write() 向字符设备写数据

readdir() 只用于文件系统,不用于设备文件

select() 实现多路设备的复用 ioctl() 控制字符设备

mmap() 将设备内存映射到进程地址空间

open() 打开设备,并初始化设备

release() 关闭设备,并释放资源

fsync() 实现内存与设备(如鼠标)之间的异步通讯

chec k_media_change()

仅用于块设备,该函数与缓冲区有关图7.22Linux内核PCI数据结构(2)PCIBIOS函数。这是一组适用于所有平台的标准过程。虽然在CPU控制下可以用它们对所有PCI地址空间进行访问,但只有Linux内核代码和设备驱动程序才能使用。

(3)PCI补丁代码。PCI补丁程序用来处理PCI初始化后的遗留问题。

基于Intel的系统在系统启动时就已经由系统BIOS完成了PCI系统的配置。Linux只需要完成简单的映射配置。非Intel系统将需要更多的配置:

①为每个设备分配PCII/O及PCI内存空间。

②为系统中每个PCI-PCI桥接器配置PCII/O和PCI内存地址窗口。

③为这些设备产生中断连线值,用来控制设备的中断处理。6.中断及中断处理

(1)中断。尽管内核提供通用机制与接口来进行中断处理,但大多数中断处理的细节都是与CPU体系结构相关的。Linux使用中断控制器(PIC)监控外部硬件中断,包括驱动显示器的视频设备、驱动硬盘的IDE设备等,如图7.23所示。图7.23中断路由的逻辑图Linux系统中有很多不同的硬件设备。我们可以用异步方式使用这些设备,即可以发送一个请求执行一组操作,然后CPU转去执行其它任务。当设备完成请求时再通过中断通知操作系统。这样,系统中可以同时存在多个未完成的任务。不管CPU在做什么工作,为了让设备产生中断,必须提供一些必要的硬件支持。系统常使用中断控制器来综合多个设备的中断,即通过设置或屏蔽寄存器中的某些位可以使能或者关闭中断,读取状态寄存器可得到系统当前处于活动状态的中断。系统中有些中断是通过硬连线连接的,而其它连接到控制器的插脚只能由插到特定ISA或PCI槽中的控制卡来决定。总之,每个系统都有其自身的中断路由机制,同时,操作系统还应该能灵活地处理这些情况。多数现代通用微处理器都使用近似的方法来处理中断。即当产生硬件中断时,CPU将停止执行当前指令,并跳转到内存中包含中断处理代码的位置继续执行。这些代码在一种特殊CPU模式即中断模式下执行。通常在此模式下不会有其它中断产生。但是也有例外,有些CPU将中断的优先级进行分类,此时还可能产生更高优先级的中断。中断处理完毕后,CPU状态将恢复到以前的状态,并继续执行中断发生前要做的工作。中断处理代码越精炼越好,这样将减少操作系统阻塞在中断上的时间与频率。

Linux许多设备驱动程序是基于中断的,有一些是基于轮流查询的,而有的甚至可以在运行时动态切换。在/proc/interrupts文件中你可以看到设备驱动程序所对应的中断号及类型。(2)可编程中断控制器。一般IBMPC使用Intel8259A-2CMOS可编程中断控制器。这种控制器的寄存器在ISA系统内存空间中非常实用。目前常用如图7.23所示的两个级联的8位控制器PIC1和PIC2,每个控制器都有一个屏蔽寄存器与中断状态寄存器。其屏蔽寄存器的地址为0x21和0xA1,状态寄存器的地址为0x20和0xA0。对此屏蔽寄存器某个特定位写入1,将使能某一中断,写入0则屏蔽它。但中断屏蔽寄存器只能写、不能读出写入的值。当有中断信号时,中断处理程序将读取这两个中断状态寄存器(ISR)。它将0x20中的ISR看成一个16位中断寄存器的低8位,而将0xA0中的ISR看成其高8位。(3)中断处理的数据结构。设备驱动程序使用一组Linux内核请求、允许和屏蔽中断的服务函数。每个设备驱动程序都将调用这些子程序来注册其中断处理程序的地址。PC中有些中断被固定,所以驱动仅需在其初始化时请求它的中断,如软盘设备驱动程序其中断号总为6。有些设备驱动程序不知道其使用的中断号,Linux通过让设备驱动程序检测它们的

显示全部
相似文档