Tim Robinson开发了使用全局描述符表(GDT)在实模式下以虚拟地址运行内核的技术,利用其背后的思想(译者注:Tim Robinson的bootloader中采用的trick,在实模式下,使用虚拟地址和GDT来解析物理地址),我们可以将虚拟内核地址翻译到物理地址。GDT是一个段映射表,包含了内存映射信息。它定义了基地址、大小和权限。X86体系结构中的CS寄存器包含了一个GDT中的偏移,来确定哪个内存段被使用。GDT表项中存放的基地址加上处理器要访问的地址,就得到了最终的地址。设置GDT表项中的基地址为一个高地址将会封装一个32位地址。如果内核映射到 地址0xC0100000,一个基地址为0x40000000的表项(译者注:原文中为0x80000000,不过译者认为是笔误)将会得到地址0x00100000(译者注:0xC0100000+0x40000000=0x00100000),kernel被加载的物理地址。使用这个信息,我们可以通过简单的相加就将虚拟地址翻译到物理地址。我们可以使用这个技巧来解决我们之前考虑的问题,使用简单的减法来得到物理地址(译者注:+0x40000000相当于-0xC0000000)。例如,0xC0100000-0xC0000000。下面的代码描述了这个过程:
Listing 3: /usr/src/linux/arch/x86/Kconfig.debug config STRICT_DEVMEM bool "Filter access to /dev/mem" help If this option is left off, you allow userspace access to all of memory, including kernel and userspace memory. Accidental access to this is obviously disastrous, but specific access can be used by people debugging the kernel.
If this option is switched on, the /dev/mem file only allows userspace access to PCI space and the BIOS code and data regions. This is sufficient for dosemu and X and all common users of /dev/mem.