8086系统中存储器按字节编址

8086系统中存储器按字节编址,可寻址的存储器空间为1MB,由于1MB为2的20次方,因此每个字节对应的地址应是20位,这20位的地址称为物理地址
本人不明白为什么是20位

首先这个地址不成为物理地址而是线性地址。8086线性地址的计算就是楼上答案所说。
寻址空间是按照处理器的地址线个数定的,因为8086的地址线只有20根,因此它的寻址能力只有2^20字节 = 1MB。i386结构的处理器都是可以按照字节编址,每个内存单元的地址,不称为物理地址而是线性地址,线性地址通过CPU内存管理单元(MMU)来进行转换,因为在8086上只有段管理机制,因此此时线性地址等价于物理地址。
到32处理器,cpu地址线拥有32根,寻址能力达到4GB,而P4处理器的地址线则拥有35根,可以寻址更大的空间。但是实际内存达不到CPU的寻址空间大小,此时CPU的MMU就需要对线性地址进行向物理地址的转化,此时线性地址就和物理地址不一样了。
决定一个内存单元的物理地址时需要根据当前的内存管理方式进行计算,首先根据虚拟地址计算得到线性地址,然后根据分页机制是否打开,如果没有使用分页机制,线性地址就是物理地址,如果打开分页机制则根据页目录和页表项来计算得物理地址。
按照x86 32位处理器,虚拟地址就是程序中所使用的逻辑地址,虚拟地址计算如下:
首先通过查段选择子寄存器(16位模式下成为段基址寄存器,比如读取数据用DS寄存器)中选择子的第2位,0则从全局描述符表(GDT,Global Descriptor Table)1则从局部描述符表(LDT Local Descriptor Table)。全局描述符从GDTR寄存器找到描述符表的物理基地址(后称简称为GDTBA,GDT Base Address),然后GDTBA + DS & 0xFFF8得到的地址就是该选择子指向的描述符,然后根据描述符中记录的段基址 + 偏移(可以是指令中的地址码,也可是si,di中的数值)就得到了线性地址(Linear Address),而局部则有些不同,因为LDTR中放的不是局部描述符表的物理基地址,而是在全局描述符表的一个描述符选择子。首先会计算LDT的物理基地址,方法同上,然后再计算描述符地址,最后计算成Linear Address.如果没打开分页,这个就可以是物理地址了。如果打开分页机制,还要做Linear Address 到物理地址的转化(Physical Address)。
线性地址是32位,高十位是页目录项索引,中间十位是页表项索引,最后12位是页内偏移,当然这是在选用4KB小页的情况,大页是4MB,则后22位都是页内偏移。页目录物理基地址存放在CR3中,共有1024项,因此用线性地址高10位作索引,找到相应的页目录项。在小页模式中,该项保存的是页表的高20位地址,因为页表只有4KB,所以低12位不需要。通过线性地址中间十位作页表项索引和页表基址进行计算得到页表项,该项中保存的物理页面的基址,基址加上线性地址低12位页内偏移,就得到了物理地址。在大页模式中,就省去了查页表这一步骤。

参考资料:IA-32 Intel® Architecture Software Developer’s Manual Volume 3:System Programming Guide

温馨提示:答案为网友推荐,仅供参考
第1个回答  2006-09-16
每个字节对应8位

物理地址20位,分为段值+偏移
是这种形式
XXXX
+ XXXX
--------
XXXXX
相似回答