Linux内存寻址

1.内存地址

首先区分三种地址:

逻辑地址:程序员把程序分成若干段,每个逻辑地址都由一个段地址和一个偏移量组成。

线性地址:也称虚拟地址,是一个32位无符号数,最高可表示4G地址,通常用十六进制数表示,其范围从0x00000000到0xffffffff.

物理地址:用内存芯片级内存单元寻址。它们与微处理器的引脚发送到内存总线上的电信号相对应,由32位或36位无符号数组成。

内存控制单元(MMU)通过一种称为分段的硬件电路把一个逻辑地址转换为一个线性地址;接着第二个称为分页单元的硬件电路把一个线性地址转换成一个物理地址。

2. 硬件中的分段

一个逻辑地址由两部分组成:段选择符和段内偏移地址。段选择符是一个16位长的字段,称为段选择符,而偏移量是一个32位长的字段。段选择符存放在段寄存器中,共有6个段寄存器:cs,ss,ds,es,fs,gs。段描述符的格式如下:


每个段由一个8字节的段描述符来表示段的特征,段描述符存放在全局描述符表(GDT)或局部描述符表(LDT)中,GDT在主存中的地址和大小存放在gdtr控制寄存器中,当前正在使用的LDT的地址和大小存放在ldtr控制寄存器中,Ti就是用来表示段描述符是在GDT(Ti = 0)还是LDT(Ti = 1)中,段描述符的格式如下所示:


Base字段包含段的首字节的线性地址,G表示粒度颗粒,若清零,则表示段的大小以字节为单位,否则以4096字节的倍数计。B表示该段是数据段,若是D则表示该段是代码段;AVL被Linux忽略,limit表示存放段中最后一个单元的偏移量,从而决定段的长度,若G的标志位置为零,则表示段的大小在1字节到1MB之间,否则在4KB到4GB之间;DPL表示特级:0表示内核态,3表示用户态,且只有这两者状态,S是系统标志,若为零表示是系统段,否则是普通段;TYPE描述段的类型和存储权限;第47位的1表示不把整个段交换到磁盘,若为0,则表示该段不在主存中。

由于段描述符是8字节长,所以它在GDT或LDT中的相对地址是由段选择符的高13位乘以8得到的。例如,如果GDT的地址是0x00020000(这个值保存在gdtr寄存器中),段选择符的索引号是2,则段描述符的地址为0x00020000+2*8。

那么逻辑地址转换成线性地址就是:

1) 先检查段选择符的Ti字段,判断段描述符是在LDT还是GDT中

2) 由段选择符的index字段计算段描述符的地址,其值为GDT的地址或LDT的地址加上index乘以8的和。

3) 把段描述符的Base字段的值(16位)与偏移地址相加就可以得到一个线性地址。

3.分页

分页单元把线性地址转换成物理地址,为了效率起见,线性地址被分成以固定长度为单位的组,称为页(Page)。页内部连续的线性地址被映射到连续的物理地址。分页单元把所有的RAM分成固定长度的页框(Page Frame),每个页框包含一个页,也就是说页和页框的大小一致。页框是主存的一部分,因此也是一个存储区域,而页只是一个数据块,可以放在任何页框或磁盘中。把线性地址映射成物理地址的数据结构称为页表。页表存放在主存中,并在分页使用前就由内核对齐初始化。

从80386开始,Intel处理器的分页单元处理4KB的页。一个32位的线性地址分成3部分:高10位目录(Directoty),中间10位表示页表(Table),低12位表示偏移量(Offset).Directory字段决定了页目录中的目录项,而目录项中指向了适当的页表,地址的Table字段决定了页表项,而页表项中包含了页所在页框的物理地址,Offset决定了页框内相对地址,由于是12位的,因此每一页含有4096字节的数据。

假如要读取线性地址0x20021406的字节,分页单元按照下面的方式处理:

1) Directory字段的0x80用于选择页目录的第0x80目录项,此目录项指向和该进程的页相关的页表。

2) Table字段的0x21用于选择页表的第0x21表项,此表指向包含所需的页框。

3)Offset字段0x416用于目标页框中偏移量位0x416中的字节。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值