1

我正在尝试在 x86 CPU 上计算中断的控制流程,特别是页面错误。到目前为止,这是我能弄清楚的:

  1. IDT 填充有服务例程地址。
  2. 发生中断。
  3. CPU 将 EFLAGS、CS 和 EIP 保存到堆栈。
  4. EIP 设置为从 IDT 获取的 ISR 地址,即mov eip, [idtr+interruptNum*4]
  5. 中断例程执行。
  6. 中断例程以一条iret指令完成。

现在,假设中断实际上是与 NIC 缓冲区相关的页面错误。ISR 会out用来告诉 DMA 控制器从系统内存向设备发出副本(反之亦然),还是我在这里偏离了基础?

4

1 回答 1

2

我相信您误解了内存映射 I/O 的工作方式。

当设备使用内存映射 I/O 时,会为其分配一个物理地址范围。适当配置北桥和/或南桥,以便当 CPU 在该地址范围内执行内存操作时,这些操作将定向到设备而不是 RAM 。RAM中没有相同地址空间的副本,也不涉及DMA。

为了使设备驱动程序可以访问内存映射的 I/O,操作系统会将虚拟地址范围映射到相关的物理地址范围。通常,出于性能原因,这将是一个全局映射(即每个进程中的相同映射),其访问权限仅限于内核模式。由于这个虚拟地址空间总是被映射的,所以不会发生页面错误。

如果设备使用 DMA 而不是内存映射 I/O,情况会有所不同。设备驱动程序通常会为操作保留一块不可分页的内存,因此同样不会涉及页面错误。该内存甚至不必映射到虚拟地址空间以执行 DMA 操作,因为 DMA 控制器使用物理地址而不是虚拟地址。(当然,在某个阶段必须有一个虚拟地址空间映射,以便设备驱动程序可以读取/写入内存块。)

于 2012-07-29T00:25:51.943 回答