__ USER_CS,__ KERNEL_CS,__ USER_DS,__ KERNEL_DS,都有base = 0x00000000和limit = 0xfffff。 我无法理解的是,这些线性地址将提供相同的物理地址 (我想我可能在这里错了)。生成的线性地址(因此物理地址)在所有情况下都是相同的,这意味着用户和内核结构存储在同一个地方。 另外,向我解释一下,与所有这些相反,我们说内核结构存储在高1 GB,用户结构存储在低3 GB。
请指出我在理解分页和分段方面的错误。 谢谢。
答案 0 :(得分:2)
您错误地假设线性地址以1:1的方式映射到物理地址。相反的是,页表用于将线性地址映射到物理地址。每个进程都有一组不同的页表,提供地址分离和虚拟内存。在内核空间中,前3GB的页表指向“虚拟”地址;最后的GB以大致1:1的方式映射到物理地址(在某些配置中)。通过(不)在页表条目中设置USER访问位来实现内核模式页面的保护。
答案 1 :(得分:0)
你在谈论哪个平台?对于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)