为什么内核模式下的驱动程序必须非常小心直接读取或写入用户空间中的地址?

时间:2013-10-07 09:59:17

标签: virtual-address-space kernel-mode usermode

来自msdn:

  

在内核模式下运行的驱动程序必须非常小心   读取或写入用户空间中的地址。这种情况   说明原因。

     
      
  1. 用户模式程序启动从设备读取某些数据的请求。程序提供缓冲区的起始地址   收到数据。
  2.   
  3. 在内核模式下运行的设备驱动程序例程启动读取操作并将控制权返回给其调用者。
  4.   
  5. 稍后,设备会中断当前正在运行的任何线程,以表示读取操作已完成。中断由...处理   在这个任意线程上运行的内核模式驱动程序例程   属于任意过程。
  6.   
  7. 此时,驱动程序不得将数据写入步骤1中提供的用户模式程序的起始地址。此地址为   在启动该进程的进程的虚拟地址空间中   请求,很可能与当前流程不同。
  8.   

换句话说,有人可以解释一下吗?第2,3,4点不是很清楚。 感谢。

1 个答案:

答案 0 :(得分:0)

每个进程都有自己的“执行上下文”,其中包括虚拟到物理地址转换中使用的数据结构(页表)。

在任何时候,虚拟地址到物理地址映射都取决于当时正在执行的进程。

采取以下方案:

  1. 用户模式程序(例如“具有单个线程的”Process-A“)启动读取请求并传递用户空间缓冲区地址。

  2. 此读取请求到达设备驱动程序例程,该例程在内核模式下运行。现在最有可能的是,设备硬件的实际读取操作需要一些时间才能完成。在这种情况下,Driver例程可能不等待操作完成。相反,它只会从设备启动读取操作,并立即返回。在此活动中,操作系统还将收到通知已启动但尚未完成的通知。操作系统将使Process-A处于等待状态,并安排执行其他进程(线程)。

  3. 稍后当设备完成读取操作时,它将引发中断以通知此情况。此时,任何任意进程(比如“进程B”)都将执行。也就是说,Page表将反映Process-B的Virtual to Physical地址空间映射。调用此中断的Driver例程将在Process-B的Context中运行。

  4. 此时,访问步骤1中用户模式程序提供的虚拟地址将访问Process-B对应的虚拟地址,而不是Process-A的虚拟地址。

  5. 有关不同的approches,请参阅"Methods for Accessing Data Buffers",以便从内核模式例程向用户空间传输数据。