首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Linux内核中4个段的基地址是相同的?

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

Stack Overflow用户
提问于 2010-12-29 06:15:37
回答 2查看 418关注 0票数 1

__USER_CS、__KERNEL_CS、__USER_DS、__KERNEL_DS都有base=0x00000000和limit=0xfffff。我不能理解的是,这些线性地址会给出相同的物理地址(我想我在这里可能是错的)。生成的线性地址(即物理地址)在所有情况下都是相同的,这意味着用户和内核结构存储在同一位置。另外,向我解释一下,为什么我们说内核结构存储在较高的1 GB,而用户结构存储在较低的3 GB。

请指出我对分页和分割的理解上的错误。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-29 07:02:03

您错误地假设线性地址以1:1的方式映射到物理地址。取而代之的是使用页表将线性地址映射到物理地址。每个进程都有一组不同的页表,提供地址分离和虚拟内存。在内核空间中,前3 GB的页表指向“虚拟”地址;最后3 GB以大约1:1的方式映射到物理地址(在某些配置中)。内核模式页的保护是通过(而不是)设置页表条目中的用户访问位来实现的。

票数 2
EN

Stack Overflow用户

发布于 2010-12-29 06:39:23

你说的是哪个平台?对于x86,它们都不同(与arch/x86/include/asm/segment.h不同):

代码语言:javascript
复制
#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)

代码语言:javascript
复制
  #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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4549969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档