深入理解Linux内核——内存寻址

Linux内存寻址

一、Linux分段

逻辑地址,即指定一个操作数或一条指令的地址;线性地址,也称虚拟地址,32位无符号整数,可表示4GB地址;物理地址:内存芯片级内存单元寻址;由内存硬件设备和内存总线相连的引脚决定。
内存寻址解决的问题是明晰Linux 逻辑地址如何经过一系列的地址映射至物理地址。

在这里插入图片描述

1、题段描述符GDT

每一个段由8字节段描述符表示,根据不同的段可将段描述符分为不同种类,广泛被Linux采用的类型有:代码段描述符、数据段描述符、任务状态段描述符(TSSD);段描述符放在全局描述表(GDT)中或者局部描述表中(LDT),这两种区分的粒度是进程,GDT存在主存,同一CPU共享;LDT进程内部段描述表;
对于多处理器,每个CPU对应一个GDT,每个GDT中包含18个段描述符,我们平时主要关注的如下:
(1)用户态和内核态下的代码段和数据段--用户代码段、用户数据段、内核代码段、内核数据段;
(2)任务状态段(TSS)
(3)3个局部线程存储(TLS)段,所以针对线程局部存储是不需要线程上线文切换的,并且存储针对单CPU内部操作。

2、段描述符LDT

大多数用户态下的Linux程序不使用局部描述符,但是内核定义了一个缺省的LDT供大多数进程使用,内核态不关心LDT。

3、逻辑地址至线性地址映射

一个逻辑地址有两部分组成:一个段选择符(16字长)和一个指定段内相对地址的偏移量(32字长);
为了提高逻辑地址至线性地址的转换效率,CPU提供6个可编程的段寄存器存储段选择符,6个非编程的段寄存器存储段描述符,每一个寄存器含有8个字节的段描述符;当一个段选择器被载入寄存器时,相应的段描述符由内存装入对应的非编程CPU寄存器中。
知道逻辑地址计算线性地址:
(1)逻辑地址的index字段乘以8(一个段的长度),然后加上gdtr和ldtr寄存器中的内容可计算出段描述符的地址;
(2)把逻辑地址的偏移量与段描述的Base字段的值相加就得到相应的线性地址。

在这里插入图片描述
注:图中段选择符中的index表示段描述符索引号

二、Linux分页

三、物理内存布局

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值