JIURL文档-Linux的虚拟内存与分页机制(x86-64位)(一)

作者:JIURL
日期:2015年10月30日

分页机制

    Linux(x64CPU)使用基于分页机制的虚拟内存。每个进程有256TB(48位)的虚拟地址空间。基于分页机制,这256TB地址空间的一些部分被映射了物理内存,一些部分什么也没有映射。程序中使用的都是256TB地址空间中的虚拟地址。而访问物理内存,需要使用物理地址。

   物理地址(physical address):放在寻址总线上的地址。放在寻址总线上,如果是读,电路根据这个地址每位的值就将相应地址的物理内存中的数据放到数据总线中传输。如果是写,电路根据这个地址每位的值就将相应地址的物理内存中放入数据总线上的内容。物理内存是以字节(8位)为单位编址与寻址的。

    虚拟地址(virtual address): 256TB虚拟地址空间中的地址,程序中使用的都是虚拟地址。

   如果CPU相关寄存器中的分页标志位被设置,那么执行内存操作的机器指令时,CPU会自动根据相应转换结构(PML4,PDPT,PD,PT)中的信息,把虚拟地址转换成物理地址,完成该指令。比如"mov eax,dword ptr[13FF3904Ch]",就是把地址13FF3904Ch处的值赋给寄存器的汇编代码,13FF3904Ch这个地址就是虚拟地址。CPU在执行这行代码时,发现寄存器中的分页标志位已经被设定,就自动完成虚拟地址到物理地址的转换,使用物理地址取出值,完成指令。对于x86-64CPU 来说,寄存器CR0的第31位是分页标志位,为1表示使用分页,为0表示不使用分页。对于初始化之后的 Linux 我们通过qemu monitor 观察 CR0,发现第31位的值为1。表明Linux是使用分页的。有多个寄存器中的控制位与分页有关,具体细节可以参考Intel软件开发手册。

    x86-64 CPU的实际虚拟地址大小为48位(64位中的低48位,高16位不用于地址转换),可寻址256TB地址空间。x86-64 CPU的实际物理地址大小,不同的CPU不相同,但最大不超过52位。可以通过机器指令cpuid来查询该CPU的实际虚拟地址长度和实际物理地址长度。例如,我查询了两台计算机,虚拟地址的大小两台计算机都为0x30(16进制30就是十进制48),物理地址的大小一台计算机为0x24(16进制24就是十进制36,36位可寻址64GB),另一台计算机为0x27(16进制27就是十进制39,39位可寻址512GB)。为了后面的叙述方便,我们把CPU实际物理地址的位数叫做M,比如,对于物理地址大小为36位的CPU,M就是36。

   使用了分页机制之后,256TB的地址空间被分成了固定大小的页(有三种大小,4KB,2MB,1GB),每一页或者被映射到物理内存,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值