Linux 当我们从磁盘发出读取命令时会发生什么?

Linux 当我们从磁盘发出读取命令时会发生什么?,linux,io,linux-kernel,kernel,dma,Linux,Io,Linux Kernel,Kernel,Dma,假设有一个进程向内核发出特定扇区的读取命令 现在内核向磁盘和请求这些特定扇区休眠(被阻塞)的进程发出这个读取命令,并将其置于等待队列中 现在内核向磁盘发出这个命令(这是我的理解)读取这些扇区,在将这些扇区读入缓冲区后,将这些字节/数据复制到这个位置(并向DMA控制器发出这个命令) 现在,磁盘控制器在将这些字节/数据读入缓冲区后,在DMA(它请求DMA控制器)的帮助下,将这些数据传输到内核指定的内存区域 此时(总线正忙),CPU正忙着做一些不需要总线的计算(毫无疑问)。 现在,在从磁盘传输数据完成

假设有一个进程向内核发出特定扇区的读取命令

  • 现在内核向磁盘和请求这些特定扇区休眠(被阻塞)的进程发出这个读取命令,并将其置于等待队列中
  • 现在内核向磁盘发出这个命令(这是我的理解)读取这些扇区,在将这些扇区读入缓冲区后,将这些字节/数据复制到这个位置(并向DMA控制器发出这个命令)
  • 现在,磁盘控制器在将这些字节/数据读入缓冲区后,在DMA(它请求DMA控制器)的帮助下,将这些数据传输到内核指定的内存区域
  • 此时(总线正忙),CPU正忙着做一些不需要总线的计算(毫无疑问)。 现在,在从磁盘传输数据完成后,磁盘向CPU发出一个中断
  • CPU确认中断并调用中断服务例程,此ISR负责唤醒已提交到队列中的相关进程
  • 现在,当我阅读了有关stackoverflow的一些答案后,我了解到ISR知道确切地唤醒哪个进程,这让我感到困惑,因为此时此刻,我们不知道需要唤醒哪个进程,甚至我们也不知道哪个请求刚刚通过磁盘i/O得到服务
  • 我的问题是:

    • 处理器/ISR如何确定要唤醒哪个进程
    • DMA控制器何时开始工作(是处理器要求DMA控制器采取行动将字节从磁盘传输到内存,还是磁盘控制器负责要求DMA控制器提供服务)
    • DMA字段(如源地址寄存器和目标地址寄存器)是如何填充的

    在磁盘控制器和主机CPU(以及DMA控制器)之间有一个接口,例如SATA。DMA将发生在SATA主机控制器(而不是磁盘控制器)和主内存之间。CPU完全控制DMA控制器,并负责设置每个DMA操作。SATA和磁盘控制器也是如此。在磁盘控制器和主机CPU(和DMA控制器)之间有一个接口,例如SATA。DMA将发生在SATA主机控制器(而不是磁盘控制器)和主内存之间。CPU完全控制DMA控制器,并负责设置每个DMA操作。SATA和磁盘控制器也是如此。