我正在尝试在x86 CPU上计算出中断的控制流,特别是页面错误。以下是我到目前为止所能解决的问题:
mov eip, [idtr+interruptNum*4]
iret
指令完成。现在,假设中断实际上是与NIC缓冲区相关的页面错误。 ISR是否会使用out
告诉DMA控制器从系统内存向设备发出副本(反之亦然),还是我离开这里?
答案 0 :(得分:1)
我相信你误解了内存映射I / O的工作方式。
当设备使用内存映射I / O时,会为其分配物理地址范围。配置northbridge和/或southbridge,以便当CPU在该地址范围内执行内存操作时,操作将定向到设备而不是RAM。 RAM中没有相同地址空间的副本,也不涉及DMA。
为了使设备驱动程序可以访问内存映射I / O,操作系统会将虚拟地址范围映射到相关的物理地址范围。通常,出于性能原因,这将是全局映射(即,每个进程中的相同映射),其访问仅限于内核模式。由于此虚拟地址空间始终映射,因此不会发生页面错误。
如果设备使用DMA而不是内存映射I / O,则情况会有所不同。设备驱动程序通常会为操作保留一块不可分页的内存,因此不会涉及页面错误。由于DMA控制器使用物理地址而不是虚拟地址,因此甚至不必将该存储器映射到虚拟地址空间以执行DMA操作。 (当然,在某个阶段必须有一个虚拟地址空间映射,以便设备驱动程序可以读取/写入内存块。)