在x86中中断处理页面错误到服务设备内存副本

时间:2012-07-03 12:07:56

标签: x86 cpu interrupt interrupt-handling dma

我正在尝试在x86 CPU上计算出中断的控制流,特别是页面错误。以下是我到目前为止所能解决的问题:

  1. IDT填充了服务例程地址。
  2. 发生中断。
  3. CPU将EFLAGS,CS和EIP保存到堆栈。
  4. EIP设置为从IDT获取的ISR地址,即mov eip, [idtr+interruptNum*4]
  5. 执行中断例程。
  6. 中断例程以iret指令完成。
  7. 现在,假设中断实际上是与NIC缓冲区相关的页面错误。 ISR是否会使用out告诉DMA控制器从系统内存向设备发出副本(反之亦然),还是我离开这里?

1 个答案:

答案 0 :(得分:1)

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

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

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

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