首先看一个 SATA 端口。如果您想将一些字节加载到 RAM 中,CPU 是否将该请求发送到处理对 SATA 设备的请求的内存控制器,并且该数据是否由内存控制器移动到 RAM 中,或者 CPU 缓存或寄存器是否涉及数据?
运行过程中不涉及 CPU。它是一个 AHCI 进行传输,它是一个 PCI DMA 设备。
Intel 的 AHCI ( https://www.intel.ca/content/www/ca/en/io/serial-ata/serial-ata-ahci-spec-rev1-3-1.html ) 用于 SATA 磁盘. 同时,对于更现代的 NVME 磁盘,使用 NVME PCI 控制器 ( https://wiki.osdev.org/NVMe )。
操作系统基本上会在 RAM 中写入以写入 AHCI 的寄存器。这样,它将能够告诉 AHCI 做一些事情并告诉它在特定位置写入 RAM(可能在请求磁盘上数据的用户模式进程提供/分配的缓冲区中)。该操作是 DMA,因此 CPU 并没有真正参与。
fstream
在 C++ 中,您可能使用或直接在操作系统提供的库中对操作系统进行 API 调用来请求数据。例如,在 Windows 上,您可以使用WriteFile()
函数 ( https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-writefile ) 写入某些文件。
在下面,该库是一个进行系统调用的瘦包装器(标准 C++ 库也是如此)。您可以在调用克隆系统调用时谁设置 RIP 寄存器中浏览我的答案?有关系统调用以及它们如何在现代系统上工作的更多信息。
内存控制器并没有真正参与。它涉及写入 AHCI 的寄存器,但 Brendan 的回答可能对这件事更有用,因为我不太清楚。
我假设操作系统通常会阻塞线程,直到 I/O 请求完成。内存控制器是否发送中断以让操作系统知道它可以再次将该线程调度到队列中?
是的,操作系统会阻塞线程,是的,AHCI 在命令完成时会触发 MSI 中断。
操作系统会将进程放入等待 IO 的进程队列中。AHCI 确实使用 PCI 设备的 MSI 功能触发中断。MSI 功能是一种特殊功能,它允许绕过现代 x86 处理器的 IO APIC,并直接向本地 APIC 发送处理器间中断。本地 APIC 然后在 IDT 中查找,就像您期望的那样触发向量并使处理器跳转到关联的处理程序。
它是用于区分触发中断的设备的处理程序编号,这使得操作系统可以轻松地将设备的正确处理程序放置在该中断编号(驱动程序)上。
操作系统有一个驱动程序模型,它考虑到将在现代计算机上使用的不同类型的设备。驱动程序模型通常采用虚拟文件系统的形式。虚拟文件系统基本上将每个设备作为文件呈现给操作系统的上层。上层基本上对文件进行 open、read、write 和 ioctl 调用。下面,驱动程序将执行复杂的操作,例如通过写入 AHCI 的寄存器来触发读/写周期,并将进程放在其他队列中等待 IO。
从用户模式(如调用 fstream 的 open 方法时),它实际上是一个系统调用。系统调用处理程序将检查所有权限并确保请求一切正常,然后再返回文件句柄。
以太网:那么假设上述步骤已经完成,其中文件的某些字节已加载到 RAM 上,内存是否会被内存控制器移动到以太网控制器,或者 CPU 是否参与保存这些数据?
以太网控制器也是 PCI DMA 设备。它直接在 RAM 中读写。
以太网控制器是一个 PCI DMA 设备。我从未编写过以太网驱动程序,但我可以说它只是直接在 RAM 中读写。现在对于网络通信,您将拥有与文件类似但不属于虚拟文件系统的套接字。网卡(包括以太网控制器)不作为文件呈现给上层。相反,您使用套接字与控制器进行通信。套接字未在 C++ 标准库中实现,但作为操作系统提供的库存在于所有广泛的平台上,必须从 C++ 或 C 中使用。套接字本身也是系统调用。
如果您使用带有 localhost 的套接字怎么办?我们是只对内存控制器进行一轮研究,还是完全涉及以太网控制器?
以太网控制器可能不涉及。
如果您使用带有 localhost 的套接字,操作系统只会将数据发送到环回接口。维基百科的文章在这里非常直接(https://en.wikipedia.org/wiki/Localhost):
在计算机网络中,localhost 是一个主机名,指的是用于访问它的当前计算机。它用于通过环回网络接口访问在主机上运行的网络服务。使用环回接口绕过任何本地网络接口硬件。
SATA 到 SATA 存储传输在任何地方缓冲?
它从第一个设备传输到 RAM,然后再传输到第二个设备。
在我之前为 AHCI 提供的链接中,声明如下:
该规范定义了高级主机控制器接口 (ACHI) 的功能行为和软件接口,这是一种允许软件与串行 ATA 设备通信的硬件机制。AHCI 是一种 PCI 类设备,充当系统内存和串行 ATA 设备之间的数据移动引擎。
AHCI 不适用于从 SATA 迁移到 SATA。它用于从 SATA 移动到 RAM 或从 RAM 移动到 SATA。因此,SATA 到 SATA 操作涉及将数据带入 RAM,然后将数据从 RAM 移动到其他 SATA 设备。