📜  将I / O请求转换为硬件操作

📅  最后修改于: 2021-08-24 04:42:57             🧑  作者: Mango

我们知道设备驱动程序和设备控制器之间存在握手,但是这里的问题是操作系统如何连接应用程序请求,或者我们可以说I / O请求到网络线集或特定磁盘扇区,或者我们可以说硬件操作。

为了理解概念,让我们考虑以下示例。

例子 –
我们正在从磁盘读取文件。我们要求的应用程序将通过文件名引用数据。在磁盘内,文件系统从文件名到文件系统目录进行映射,以获得文件的空间分配。在MS-DOS中,文件名映射到表示为文件访问表中条目的数字,并且该表中的条目告诉我们哪些磁盘块已分配给文件。在UNIX中,名称映射到inode编号,并且inode编号包含有关空间分配的信息。但是这里出现了一个问题,即如何从文件名到磁盘控制器建立连接?

MS-DOS使用的方法是相对简单的操作系统。 MS-DOS文件名的第一部分以冒号开头,是用于标识存在特定硬件设备的字符串。

UNIX使用与MS-DOS不同的方法。它在常规文件系统名称空间中表示设备名称。与具有冒号分隔符的MS-DOS文件名不同,但是UNIX路径名没有明确区分设备部分。实际上,路径名的任何部分都不是设备的名称。 Unix具有挂载表,该挂载表与具有特定硬件设备名称的路径名的前缀相关联。

现代操作系统从请求和物理设备阶段控制器之间的路径中的多级查找表中获得了显着的灵活性。有一些通用机制可用于在应用程序和驱动程序之间传递请求。因此,无需重新编译内核,我们就可以将新的设备和驱动程序引入计算机。实际上,某些操作系统具有按需加载设备驱动程序的能力。在引导时,系统首先探测硬件总线以确定存在哪些设备。然后将其加载到必要的驱动程序,相应地进行I / O请求。

下图显示了阻止读取请求的典型生命周期。从图中可以看出,I / O操作需要许多步骤,这些步骤一起消耗大量CPU周期。

图– I / O请求的生命周期

  1. 系统调用–
    每当出现任何I / O请求时,进程就会发出问题,阻止对以前打开的文件描述符的read()系统调用。基本上,系统调用代码的作用是检查内核中参数的正确性。如果我们以输入形式放入的数据在缓冲区高速缓存中已经可用,则数据将返回到处理中,在这种情况下,I / O请求已完成。
  2. 如果输入不可用,则采用替代方法–
    如果数据在缓冲区高速缓存中不可用,则必须执行物理I / O。该过程将从运行队列中删除,并放置在设备的等待队列中,并计划了I / O请求。调度后,I / O子系统通过子例程调用或内核消息将请求发送到设备驱动程序,但这取决于操作系统将以哪种方式发送请求。
  3. 设备驱动程序的作用–
    接收到请求后,设备驱动程序必须接收数据,并且它将通过分配内核缓冲区空间来接收数据,并且在接收到数据之后,它将调度I / O。完成所有这些操作后,将通过写入设备控制寄存器将命令发送给设备控制器。
  4. 设备控制器的角色–
    现在,设备控制器将操作设备硬件。实际上,数据传输是由设备硬件完成的。
  5. DMA控制器的作用–
    数据传输后,驱动程序可能会轮询状态和数据,或者可能已将DMA传输设置到内核内存中。传输由DMA控制器管理。最后,当传输完成时,它将产生中断。
  6. 中断处理程序的作用–
    中断通过中断向量表发送到正确的中断处理程序。它存储任何必要的数据,向设备驱动程序发送信号,并从中断返回。
  7. 完成I / O请求–
    何时,设备驱动程序接收信号。该信号确定I / O请求已完成,并且还确定请求的状态,向内核I / O子系统发出信号,请求已完成。在将数据或返回码传输到地址空间之后,内核将进程从等待队列移回到就绪队列。
  8. 完成系统调用–
    当进程移至就绪队列时,表示进程已解除阻塞。将进程分配给CPU时,表示进程在系统调用完成后恢复执行。