__USER_CS、__KERNEL_CS、__USER_DS、__KERNEL_DS都有base=0x00000000和limit=0xfffff。我不能理解的是,这些线性地址会给出相同的物理地址(我想我在这里可能是错的)。生成的线性地址(即物理地址)在所有情况下都是相同的,这意味着用户和内核结构存储在同一位置。另外,向我解释一下,为什么我们说内核结构存储在较高的1 GB,而用户结构存储在较低的3 GB。
请指出我对分页和分割的理解上的错误。谢谢。
发布于 2010-12-29 07:02:03
您错误地假设线性地址以1:1的方式映射到物理地址。取而代之的是使用页表将线性地址映射到物理地址。每个进程都有一组不同的页表,提供地址分离和虚拟内存。在内核空间中,前3 GB的页表指向“虚拟”地址;最后3 GB以大约1:1的方式映射到物理地址(在某些配置中)。内核模式页的保护是通过(而不是)设置页表条目中的用户访问位来实现的。
发布于 2010-12-29 06:39:23
你说的是哪个平台?对于x86,它们都不同(与arch/x86/include/asm/segment.h不同):
#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8)
#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8)
#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS* 8 + 3)
#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS* 8 + 3)和
#define GDT_ENTRY_DEFAULT_USER_CS 14
#define GDT_ENTRY_DEFAULT_USER_DS 15
#define GDT_ENTRY_KERNEL_BASE 12
#define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE + 0)
#define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE + 1)https://stackoverflow.com/questions/4549969
复制相似问题