为什么Linux内核中4个段的基址是相同的?

时间:2010-12-28 22:15:37

标签: linux-kernel

__ USER_CS,__ KERNEL_CS,__ USER_DS,__ KERNEL_DS,都有base = 0x00000000和limit = 0xfffff。 我无法理解的是,这些线性地址将提供相同的物理地址 (我想我可能在这里错了)。生成的线性地址(因此物理地址)在所有情况下都是相同的,这意味着用户和内核结构存储在同一个地方。 另外,向我解释一下,与所有这些相反,我们说内核结构存储在高1 GB,用户结构存储在低3 GB。

请指出我在理解分页和分段方面的错误。 谢谢。

2 个答案:

答案 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)
相关问题