linux内存寻址

本文讲述linux在X86平台上的分段和分页机制


MMU(内存控制单元)通过分段单元的硬件电路将逻辑地址转换成线性地址,再通过分页单元的硬件电路把线性地址转换为物理地址:

        逻辑地址:包含在机器指令语言指令中用来指定一个操作数或一条指令的地址。每个进程都有自己的代码段,数据段,逻辑地址就是相对于代码段或数据段的偏移地址。

        线性地址:程序代码产生逻辑地址,逻辑地址经过分段单元的硬件电路准换为线性地址。线性地址的范围一般与CPU的位数相关,如果是32为的CPU,则可以表达高达4G的线性地址。

        物理地址:用于物理内存芯片的内存单元寻址。它的范围与地址总线的位数相关。


X86的硬件分段:

        一个逻辑地址分为两部分组成:段标识符和指定段内相对地址的偏移量。

        处理器提供6个段寄存器,CS,SS,DS,ES,FS,GS;

        段描述符:8个字节;用来存放段起始地址,段大小,存储权限等。存储在GDT或LDT中。

        段选择符(段标识符):16位,用来寻找段描述符,存放于段寄存器中。

        分段流程:将逻辑地址指定的段标识符装载在段寄存器中,由段标识符指定段描述符的起始地址,在段描述中找到相应段的段起始地址,将段起始地址左移N(N=地址总线位数-CPU位数),然后与逻辑地址指定的段内偏移量相加,得到线性地址。


linux的分段:

        linux以非常有限的方式使用分段,只有在X86机构下才使用分段(一些体系结构对分段支持很有限,尤其是RISC)。

        运行在用户态的linux进程都使用一对相同的段来对指令和数据寻址:用户代码段和用户数据段;运行在内核态的所有linux进程都使用一对相同的段对指令和数据寻址:内核代码段和内核数据段。他们的段起始地址都是0X0,则在linux下逻辑地址和线性地址是一致的,即逻辑地址的偏移量字段的值和相应的线性地址的值总是一致的。


X86的硬件分页:

        分页单元将线性地址转换成物理地址。

        为了效率起见,线性地址被分成以固定长度为单位的组,称为页。页内部的线性地址被映射到连续的物理地址中。分页单元把所有的RAM分成固定长度的页框。

        把线性地址映射到物理地址的数据结构称为页表。页表存放在主存中,并在启用分页单元之前必须有内核对页表进行适当的初始化。

        常规分页:

        从386开始,intel处理器的分页单元处理4KB的页。32位的线性地址被分成3个域:Directory(目录)最高10位:Table(页表)中间10位:Offset(偏移量)最低12位;线性地址的转换分两步完成,每一步都基于一种转换表,第一种转换表称为页目录表,第二种表称为页表;使用二级模式的目的在于减少每个进程页表所需的RAM数量。每个活动进程都有一个分配给它的页目录,在实际需要时分配页表,其页目录的物理地址存放在控制寄存器的cr3中,cr3与线性地址的dirctory字段决定页目录中的目录项,再通过线性地址的TABLE字段决定页表的表项,再配合OFFSET字段找到页框内物理地址。

        扩展分页:

        从pentiun开始,X86引入扩展分页,页框大小为4MB,扩展分页把大段连续的线性地址转换为响应的物理地址。内核则可以不用对中间页表转换。DIRECTIORY(10位):OFFSET(22位);

        物理地址扩展分页机制:

        处理器所支持的RAM容量受到连接到地址总线上的地址管脚数量限制。大型服务器需要大于4GB的RAM时,intel在它的处理器上把管脚从32增加到36位,引入物理地址扩展的分页机制将32位线性地址转换为36位物理地址。

        64位系统的分页:

        32位的系统采用2级分页机制,出于效率和RAM容量的考虑,64位系统采用额外的分页机制。使用的级别的数量取决于处理器的类型。

        

        linux 的分页:

        linux采用了一种同时适用于32位和64位熊的普通分页模型,目前采用四级分页模型:页全局目录:页上级目录:页中间目录:页表。

        页全局目录包含若干页上级目录的地址,页上级目录包含若干页中间级目录的地址,页中间级目录又包含若干页表的地址。每个页表项又指向夜歌页框。线性地址因此被分成了5个部分。

        没有启动物理地址扩展的32位系统,linux采用2级模型:页全局目录和页表,页上级目录和页中间级目录全置0;

        启用了物理地址扩展的32位系统使用3级页表。

        64位系统使用三级还是四级分页取决于硬件对线性地址的划分。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值