13,690
次編輯
變更
逻辑地址
,無編輯摘要
|}'''逻辑地址'''是指在计算机体系结构中是指应用程序角度看到的内存单元(memory cell)、存储单元(storage element)、网络主机(network host)的地址。 逻辑地址往往不同于物理地址(physical address),通过地址翻译器(address translator)或映射函数可以把逻辑地址转化为物理地址。
==简介==
在有地址变换功能的计算机中,访问指令给出的地址 ( [[ 操作数]]) 叫逻辑地址,也叫 [[ 相对地址 ]] 。要经过 [[ 寻址方式 ]] 的计算或变换才得到 [[ 内存储器 ]] 中的实际有效地址,即 [[ 物理地址 ]] 。
各种计算机的寻址方式 (地址变换功能)都有所不同,在用汇编语言编写程序时,要先熟悉这个机器的指令系统。
===工具书解释===
1、在有地址变换功能的计算机中,访问指令给出的地址 (操作数) 叫逻辑地址,也叫 [[ 相对地址 ]] 。要经过 [[ 寻址方式 ]] 的计算或变换才得到 [[ 内存储器 ]] 中的 [[ 物理地址 ]] 。
2、把 [[ 用户程序 ]] 中使用的地址称为相对地址即逻辑地址。
3、逻辑地址由两个16位的地址分量构成,一个为段基值,另一个为偏移量。两个分量均为无符号数编码。
2、所谓逻辑地址是指按数据的逻辑块号给出的磁盘的位置(l块=512字l字=64位)而物理地址则是由磁盘的柱面、头、段等物理位置所确定的地址。
==产生背景==
追根求源,Intel的8位机8080CPU, [[ 数据总线 ]] (DB)为8位, [[ 地址总线 ]] (AB)为16位。那么这个16位地址信息也是要通过8位数据总线来传送,也是要在数据通道中的 [[ 暂存器 ]] ,以及在CPU中的寄存器和内存中存放的,但由于AB正好是DB的整数倍,故不会产生矛盾!
但当上升到16位机后,Intel8086/8088CPU的设计由于当年IC集成技术和外封装及引脚技术的限制,不能超过40个引脚。但又感觉到8位机原来的地址寻址能力2^16=64KB太少了,但直接增加到16的整数倍即令AB=32位又是达不到的。故而只能把AB暂时增加4条成为20条。则2^20=1MB的寻址能力已经增加了16倍。但此举却造成了AB的20位和DB的16位之间的矛盾,20位地址信息既无法在DB上传送,又无法在16位的CPU寄存器和 [[ 内存单元 ]] 中存放。于是应运而生就产生了CPU段结构的原理。
==线性地址==
一个逻辑地址由两部份组成,段标识符和段内 [[ 偏移量 ]] 。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是一个索引号。引号,可以理解为 [[ 数组 ]] 的下标——而它将会对应一个数组,它又是什么的索引呢?这就是“ [[ 段描述符]](segment descriptor)”,段描述符具体地址描述了一个段(对于“段”这个字眼的理解:我们可以理解为把 [[ 虚拟内存 ]] 分为一个一个的段。比如一个存储器有1024个字节,可以把它分成4段,每段有256个字节)。这样,很多个段描述符,就组了一个数组,叫“段描述符表”,这样,可以通过段标识符的前13位,直接在段描述符表中找到一个具体的段描述符,这个描述符就描述了一个段,我刚才对段的抽像不太准确,因为看看描述符里面究竟有什么东东——也就是它究竟是如何描述的,就理解段究竟有什么东东了,每一个段描述符由8个字节组成:
这些东东很复杂,虽然可以利用一个数据结构来定义它,不过,我这里只关心一样,就是Base字段,它描述了一个段的开始位置的 [[ 线性地址 ]] 。
Intel设计的本意是,一些全局的 [[ 段描述符 ]] ,就放在“全局段描述符表(GDT)”中,一些局部的,例如每个进程自己的,就放在所谓的“局部段描述符表(LDT)”中。那究竟什么时候该用GDT,什么时候该用LDT呢?这是由段选择符中的T1字段表示的,=0,表示用GDT,=1表示用LDT。
GDT在内存中的地址和大小存放在CPU的gdtr [[ 控制寄存器 ]] 中,而LDT则在ldtr寄存器中。
好多概念,像绕口令一样。图2看起来要直观些:
线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。
物理地址(Physical Address) 是指出现CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么 [[ 线性地址 ]] 就直接成为物理地址了。
虚拟内存(Virtual Memory) 是指计算机呈现出要比实际拥有的内存大得多的内存量。因此它允许程序员编制并运行比实际系统拥有的内存大得多的程序。这使得许多大型项目也能够在具有有限内存资源的系统上实现。一个很恰当的比喻是:你不需要很长的轨道就可以让一列火车从上海开到北京。你只需要足够长的铁轨(比如说3公里)就可以完成这个任务。采取的方法是把后面的铁轨立刻铺到火车的前面,只要你的操作足够快并能满足要求,列车就能象在一条完整的轨道上运行。这也就是 [[ 虚拟内存 ]] 管理需要完成的任务。在Linux 0.11内核中,给每个程序(进程)都划分了总容量为64MB的虚拟内存空间。因此程序的逻辑地址范围是0x0000000到0x4000000。
有时我们也把逻辑地址称为虚拟地址。因为与虚拟内存空间的概念类似,逻辑地址也是与实际物理内存容量无关的。