首页 文章

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

提问于
浏览
1

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

  • IDT填充了服务例程地址 .

  • 发生中断 .

  • CPU将EFLAGS,CS和EIP保存到堆栈 .

  • EIP设置为从IDT获取的ISR地址,即 mov eip, [idtr+interruptNum*4]

  • 中断例程执行 .

  • 中断例程以 iret 指令完成 .

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

1 回答

  • 1

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

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

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

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

相关问题