【问题标题】:In non-DMA scenario, does a storage device/disk content go to CPU registers first and then to main memory during a disk read?在非 DMA 情况下,存储设备/磁盘内容是否在磁盘读取期间先进入 CPU 寄存器,然后再进入主内存?
【发布时间】:2017-01-26 01:05:45
【问题描述】:

我正在学习计算机组织,但在以下概念中挣扎。在非 DMA 场景中,所有磁盘读取都按照以下顺序进入主内存:

磁盘存储表面 -> 磁盘寄存器 -> CPU 寄存器 -> 主内存

与写入类似,序列是:

主存 -> CPU 寄存器 -> 磁盘寄存器 -> 磁盘存储表面

(我知道在 DMA 场景中,CPU 只会启动传输,之后磁盘的内容会直接传输到主存)。

如果是,那么在 DMA 出现之前,上述序列是否是一个严重的瓶颈,因为整体 CPU 寄存器的容量与主内存和存储磁盘相比要小得多?或者它是如此之快以至于人类用户在非 DMA 模式下不会注意到?

PS:请容忍我的基本术语,但我希望我传达了我想问的内容。

【问题讨论】:

  • 我不确定这个问题是否是 SO 的主题(似乎它更多地属于 Computer Science,)但是,是的,这通常是它对非 DMA I/O 的工作方式操作。不过,非 DMA 磁盘读取非常少见。
  • @reirab 那么即使磁盘文件要进行内存映射,是不是按照上面的顺序,在进入主存之前先经过CPU寄存器?
  • 在几乎所有情况下,磁盘操作都使用 DMA,所以,不,这不太可能。那将是非常低效的。不过,同样,这个问题很可能会在此处作为题外话关闭,可能应该在Computer Science 中提出。 SO专门针对编程问题,而不是计算机组织/架构。您可能还想先搜索Computer Science,因为这似乎之前已经回答过了。
  • @reirab 请查看对我的问题的编辑(粗体)并分享您的观点,以便清楚我剩余的困惑。
  • 然后将其转换为真正的答案,因为显然这就足够了。

标签: io cpu device-driver cpu-registers cpu-architecture


【解决方案1】:

是的,你所描述的是在过去的糟糕日子里,programmed-I/O 而不是 DMA。

例如,IDE 磁盘控制器硬件过去的标准化程度较低,因此 Linux 驱动程序默认使用编程 I/O(即使用 x86 IN instructions 的复制循环,因为 ATA 早于内存映射 I/O 寄存器很常见)。为了获得良好的性能,您必须在启动脚本中手动启用 DMA。

但在此之前,请通过手动启用 DMA 进行检查,它不会导致锁定,或者 更糟糕的是会导致数据损坏。


re:内存映射文件:与数据如何从磁盘进入页面缓存(反之亦然)无关。 mmap() 只是意味着您的进程的地址空间包含操作系统用来缓存文件内容的相同页面的共享映射。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多