gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:58:28 24 4
gpt4 key购买 nike

来自 msdn:

Drivers that run in kernel mode must be very careful about directlyreading from or writing to addresses in user space. This scenarioillustrates why.

  1. A user-mode program initiates a request to read some data from a device. The program supplies the starting address of a buffer toreceive the data.
  2. A device driver routine, running in kernel mode, starts the read operation and returns control to its caller.
  3. Later the device interrupts whatever thread is currently running to say that the read operation is complete. The interrupt is handled bykernel-mode driver routines running on this arbitrary thread, whichbelongs to an arbitrary process.
  4. At this point, the driver must not write the data to the starting address that the user-mode program supplied in Step 1. This address isin the virtual address space of the process that initiated therequest, which is most likely not the same as the current process.

谁能换句话解释一下?第2、3、4点不是很清楚。谢谢。

最佳答案

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

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

采用以下场景:

  1. 用户模式程序(比如“Process-A”和单线程)发起读取请求并传递用户空间缓冲区地址。

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

  3. 稍后当设备完成读取操作时,它会引发一个中断来通知这一点。此时,任何任意进程(比如“Process-B”)都会被执行。也就是说,页表将反射(reflect)进程 B 的虚拟地址空间到物理地址空间的映射。为服务此中断而调用的驱动程序例程将在进程 B 的上下文中运行。

  4. 此时访问用户态程序在step-1提供的虚拟地址,将访问到进程B对应的虚拟地址,而不是进程A对应的虚拟地址。

参见 "Methods for Accessing Data Buffers"用于将数据从内核模式例程传输到用户空间的不同方法。

关于virtual-address-space - 为什么内核模式下的驱动程序必须非常小心地直接读取或写入用户空间中的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19221824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com