IA32体系32位Linux系统虚拟地址映射

22 篇文章 2 订阅
我们经常会打印临时变量地址,那到底打印的是逻辑地址?线性地址?物理地址?虚拟地址?临时变量到底存放在物理内存的哪个位置?

现代操作系统如Linux都采用内存保护模式来管理内存。IA32架构的CPU规定地址映射过程是:逻辑地址——>线性地址——>物理地址。那么,Linux如何进行地址映射?

CPU相关寄存器
IA-32架构中提供了10个32位和6个16位的寄存器,这些寄存器分为三类:

1、通用寄存器:

又可分为:1)数据寄存器:EAX、EBX、ECX、EDX

                            2)指针寄存器:ESP、EBP 主要用来维护栈 如何维护栈?ESP指向当前栈的栈顶,EBP指向当前栈的栈底。程序运行及函数调用时,不同的栈, ESP、EBP的值不同。
                            3)索引寄存器。ESI、EDI 和字符串处理指令相关
2、控制寄存器:EIP、EFLAGS。处理器使用EIP来跟踪下一条要执行指令,也称为程序计数寄存器。EFLAGS寄存器用来保存系统的一些状态标志。
3、段寄存器:CS(代码段)、ES(扩展段)、DS(数据段)、FS、GS、SS(堆栈段)。

现在CPU主要有:inter、AMD、arm、ppc、mips,这里主要说inter。IA32指32位。



上图展示了计算机的发展,可以看到我们通常说的Inter x86指什么。


8086系统

物理内存起始地址存放在段寄存器中CS(代码段)、ES(扩展段)、DS(数据段)、或SS(堆栈段)内存段起始地址是16的倍数 ,范围是16-2^16。


但是数据总线16条,地址总线20条。20位的地址如何放在16位的寄存器中?

可以发现:16的倍数的数二进制后4位都为0,那么就只存放内存起始地址的高16位。寻址方式:DS<<4 + IP  =  数据地址(也就是物理地址)
DS<<4 :段基址
IP:偏移量或偏移地址或逻辑地址(一个内存段上的偏移量)

可以用指针在物理内存上进行任意的修改,没有任何保护措施,称为实地址模式,也称实模式。与之相对应的就是保护模式,该模式下,操作系统进行权限控制。


内存管理方案:段页式,但是,8086分段不是段页式中的段。


实模式最大能访问1M。

除了内存段的起始地址,还要有
内存段的大小和内存的访问权限。   IP>size 表示超过要访问的段,为了安全起见不能使偏移地址大于内存段的大小。


80386 新增CDTR (
全局的段描述附表寄存器,所有进程所共享)和LDTR(局部的段描述附表寄存器,每个进程私有)。


相当于一个数组,段寄存器存放段描述附表的索引(也就是下标),例如,访问数据时,DS记录数据在GDT中的位置。每一个都是一个段描述符表项,8字节。


除了低3位,还有13位,表示GDT的下标,2^13 = 8192 - 12 = 8180 其中12位系统已经使用,用户可用的有8180位。如果使用的是LDTR则储存的是LDT的信息。


红色表示起始地址,共32位;蓝色部分是长度,共20位,G指定单位,如果G是0,单位是byte,1M*1 = 1M;如果G是1,单位是4k,1M*4k = 4G。32位Linux内核会给每个进程的运行分配虚拟地址空间,大小为2^32=4G,前3G为用户空间,1G为内核空间。


CR0 最高PG位: 0(未开启分页机制)、1(开启分页机制)

CR1 发生缺页异常的虚拟地址

CR3 页目录的起始地址

CR4 PAE位 :物理地址扩展 0(未开启)、1(开启)


多级页表的映射

32位:二级页表映射

36位:三级页表映射

46位:四级页表映射


知道线性地址后,10位、10位、12位分开,分别表示页表目录的下标、页表的下标、物理页面上的偏移量。通过CR3知道页目录的起始地址,可以得到物理地址。


PG共有1024个元素,每一个都是一个指针,所以,其大小为4k,PT大小也为4k,一个物理页面也是4k,1024*1024*4k = 4G,正好表示完虚拟地址大小。

每个进程都有自己的页目录和页表,从磁盘中的可执行文件到虚拟地址空间到物理内存都是页面对齐。虚拟地址空间上地址连续,但是经过多级页表映射之后物理地址不一定连续。

CR3记录当前的页目录的起始地址,页面对齐也就说明每一个页面的起始地址都是4k的整数倍,数据有一个特点:低12位为0。由于在PG和PT都是存放指针,4字节大小,由于页面起始地址低12位都是0,只需要存放高20位就可以。那剩下的12位存放权限。

在PT中最低位叫做present位:0表示页表对应的物理页面在交换分区中,1表示页面就在物理内存中。

我们称高20位为value,如果

1、value 0,present 0 表示映射的物理页面还没有分配过;

2、value !=0,present 0 表示映射的物理页面在交换分区中,value保存物理页面在磁盘swap分区中;

3、value !=0,present !=0 表示的物理页面是一个活动的页面。

物理页面又叫物理页面的框号,物理页面在内核中通过数组管理,页表中就存放了数组下标,这样就可找到相应的信息。

地址映射是软硬件配合的,软件提供页目录,页表,CR3的值,全局段描述符表等,硬件指MMU,映射地址的计算都由MMU完成。


交换分区:指的是磁盘空间,根据LRU算法最近最久未使用的算法交换页面,只有脏页才会被交换。

虚拟内存:把最久未使用的页面放到交换分区,活动的页面放到物理内存中,系统会给每一个运行的进程分配4G的虚拟内存,可以保证每个进程有独立的空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值