我所理解的逻辑地址、线性地址、物理地址

 

看了书,又看了很多前辈的文章,还打电话问了他人,理解到现在的程度,与大家共勉:

 

1.逻辑地址: 它由段基址和段内偏移量两部分组成。它的由来是与IC及其制造业的发展相关的。最初,Intel8位机8080cpu,数据总线为8位,地址总线为16位,地址总线输出时其中8位通过数据总线,并要通过寄存器暂存,因为ABDB2倍,故并不矛盾。              

    但到了16位机,Intel80868088cpuDB16位,但当时的IC工艺要求IC不能有太多的针脚,限制了AB不能为32位,可内存要求扩大,于是把AB设为20位。这造成了ABDB之间的矛盾,20位的值即不能在DB上传输,又很难在16机内保存,就想了一个段的结构来解决。把AB的低16位作为段内偏移量,把AB的高16位(后12位清0)为段地址,使用时只需在20位的加法器中把段址左移4位后加上段内偏移量即可。以上是段的由来。

    在实际的编程当中,它是指程式产生和段相关的偏移地址,比如c语言中(&操作)所得的地址就是相对于当前进程数据段的地址,不和绝对物理地址相干(只有在Intel实模式下才和物理地址相等,实模式没有采用分和分段机制),它是在Intel保护模式下代码段限长内的偏移地址。程序员只需和逻辑地址打交道,因为分段和分页机制对程序员来说是完全透明的,只有系统编程人员涉及,程序员进行的内存操作是操作系统分配的内存段操作。段地址加上段内偏移地址所得的是虚拟地址,如果没有采用分页机制,它就是物理地址页,如果采用了分页机制,它要经过转换后才是物理地址。如果只有一个段,那么逻辑地址就是虚拟地址。

2.虚拟地址:它是逻辑地址到物理地址的中间层,也叫线性地址,是基于段寄存器对逻辑地址转换得到的。虚拟地址通过页转(一般由硬件的MMU完成)换得到真实的物理地址。

X86体系有一个只有系统软件才能操作的寄存器cr3,存了最高一级页表的物理地址,cpu拿到一个虚拟地址后会自动从cr3中拿到页表,然后用页表转换,得到最终的物理地址。

每个进程都可以有独立的逻辑地址,进程切换时,OS会把cr3换成这个进程相应的页表(每个进程都有独立的页表数据)。

需要强调的是进程映射空间为0G~ 3G ,操作系统把自己映射到了3G~ 4G 的空间,并且映射到了每一个进程空间,也就是说,每一个进程的3G~ 4G 空间的映射都是一样的(每个进程维护一个页表),都为操作系统物理地址的映射。这样,进程切换时,虽然页表换了,但处于内核态的操作系统的从虚拟地址到物理地址的映射是不会改变的,保证了此时操作系统能顺利进行下去。

3.物理地址:就是cpu地址总线上寻求物理内存的实际地址信号,是地址变换的最总结果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值