導覽
近期變更
隨機頁面
新手上路
新頁面
優質條目評選
繁體
不转换
简体
繁體
3.14.255.174
登入
工具
閱讀
檢視原始碼
特殊頁面
頁面資訊
求真百科歡迎當事人提供第一手真實資料,洗刷冤屈,終結網路霸凌。
檢視 逻辑地址 的原始碼
←
逻辑地址
前往:
導覽
、
搜尋
由於下列原因,您沒有權限進行 編輯此頁面 的動作:
您請求的操作只有這個群組的使用者能使用:
用戶
您可以檢視並複製此頁面的原始碼。
{| class="wikitable" style="float:right; margin: -10px 0px 10px 20px; text-align:left" |<center>'''逻辑地址'''<br><img src="https://img1.baidu.com/it/u=1547114977,3015848657&fm=253&fmt=auto&app=138&f=JPG?w=766&h=500" width="280"></center><small>[https://www.jianshu.com/p/fd2611cc808e 圖片來自简书]</small> |}'''逻辑地址'''是指在计算机体系结构中是指应用程序角度看到的内存单元(memory cell)、存储单元(storage element)、网络主机(network host)的地址。 逻辑地址往往不同于物理地址(physical address),通过地址翻译器(address translator)或映射函数可以把逻辑地址转化为物理地址。 ==简介== 在有地址变换功能的计算机中,访问指令给出的地址 ([[操作数]]) 叫逻辑地址,也叫[[相对地址]]。要经过[[寻址方式]]的计算或变换才得到[[内存储器]]中的实际有效地址,即[[物理地址]]。<ref>[https://zhuanlan.zhihu.com/p/560053097 系统架构设计师知识点总结:操作系统基本原理]知乎</ref> 各种计算机的寻址方式 (地址变换功能)都有所不同,在用汇编语言编写程序时,要先熟悉这个机器的指令系统。 ===工具书解释=== 1、在有地址变换功能的计算机中,访问指令给出的地址 (操作数) 叫逻辑地址,也叫[[相对地址]]。要经过[[寻址方式]]的计算或变换才得到[[内存储器]]中的[[物理地址]]。 2、把[[用户程序]]中使用的地址称为相对地址即逻辑地址。 3、逻辑地址由两个16位的地址分量构成,一个为段基值,另一个为偏移量。两个分量均为无符号数编码。 ===学术文献解释=== 1、这样该存储单元的地址就可以用段基址(段地址)和段内偏移量(偏移地址)来表示,段基址确定它所在的段居于整个存储空间的位置,偏移量确定它在段内的位置,这种地址表示方式称为逻辑地址,通常表示为段地址:偏移地址的形式。 2、所谓逻辑地址是指按数据的逻辑块号给出的磁盘的位置(l块=512字l字=64位)而物理地址则是由磁盘的柱面、头、段等物理位置所确定的地址。<ref>[https://blog.csdn.net/weixin_35679869/article/details/118267625 计算机网络 逻辑地址,逻辑地址_韦桂超的博客]CSDN博客</ref> ==产生背景== 追根求源,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看起来要直观些: 首先,给定一个完整的逻辑地址[段选择符:段内偏移地址], 1、看段选择符的T1=0还是1,知道当前要转换是GDT中的段,还是LDT中的段,再根据相应寄存器,得到其地址和大小。我们就有了一个数组了。 2、拿出段选择符中前13位,可以在这个数组中,查找到对应的段描述符,这样,它了Base,即基地址就知道了。 3、把Base + offset,就是要转换的线性地址了。 ==相关区别== 逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。 线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。 物理地址(Physical Address) 是指出现CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么[[线性地址]]就直接成为物理地址了。 虚拟内存(Virtual Memory) 是指计算机呈现出要比实际拥有的内存大得多的内存量。因此它允许程序员编制并运行比实际系统拥有的内存大得多的程序。这使得许多大型项目也能够在具有有限内存资源的系统上实现。一个很恰当的比喻是:你不需要很长的轨道就可以让一列火车从上海开到北京。你只需要足够长的铁轨(比如说3公里)就可以完成这个任务。采取的方法是把后面的铁轨立刻铺到火车的前面,只要你的操作足够快并能满足要求,列车就能象在一条完整的轨道上运行。这也就是[[虚拟内存]]管理需要完成的任务。在Linux 0.11内核中,给每个程序(进程)都划分了总容量为64MB的虚拟内存空间。因此程序的逻辑地址范围是0x0000000到0x4000000。 有时我们也把逻辑地址称为虚拟地址。因为与虚拟内存空间的概念类似,逻辑地址也是与实际物理内存容量无关的。 逻辑地址与物理地址的“差距”是0xC0000000,是由于虚拟地址->线性地址->物理地址映射正好差这个值。这个值是由操作系统指定的。 ==参考文献== [[Category:404 技術辭典]]
返回「
逻辑地址
」頁面