![设备驱动程序使用内核逻辑地址空间还是内核虚拟地址空间?](https://linux22.com/image/189233/%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E4%BD%BF%E7%94%A8%E5%86%85%E6%A0%B8%E9%80%BB%E8%BE%91%E5%9C%B0%E5%9D%80%E7%A9%BA%E9%97%B4%E8%BF%98%E6%98%AF%E5%86%85%E6%A0%B8%E8%99%9A%E6%8B%9F%E5%9C%B0%E5%9D%80%E7%A9%BA%E9%97%B4%EF%BC%9F.png)
如果可能的话,您能指出文档或描述内核空间内存布局吗?
当设备驱动程序实例化一个变量时,该变量是否存在于内核空间中,还是存在于具有特殊权限的用户空间中?
答案1
内核空间的内存布局是记录在内核中,至少对于 x86_64。在许多架构上,这包括直接物理映射,具有固定偏移量,该偏移量在一个内核实例的生命周期内不会变化。由于内核代码在 CPU 上运行,使用 MMU(在配备 MMU 的架构上),运行代码引用的所有地址(对于变量指针、堆栈等)都是 MMU 可以理解的地址,IE虚拟地址,通常分配在直接物理映射之外。
默认情况下,设备驱动程序中的变量映射到内核空间。设备驱动程序还可以通过多种方式从用户空间提供数据 - sysfs
、procfs
、 映射到用户空间虚拟DSO...