为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

逻辑地址、线性地址、物理地址和虚拟地址

2013-05-25 3页 pdf 166KB 45阅读

用户头像

is_022952

暂无简介

举报
逻辑地址、线性地址、物理地址和虚拟地址 逻辑地址、线性地址、物理地址和虚拟地址 一、概念 物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和 CPU 连接的地址总线相对应。 ——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插 在机器上那根内存本身,把内存看成一个从 0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做 物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与地 址总线相对应”,是更贴切一些,不过抛...
逻辑地址、线性地址、物理地址和虚拟地址
逻辑地址、线性地址、物理地址和虚拟地址 一、概念 物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和 CPU 连接的地址总线相对应。 ——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插 在机器上那根内存本身,把内存看成一个从 0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做 物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与地 址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应, 也是可以接受的。也许错误的理解更利于形而上的抽像。 虚拟内存(virtual memory) 这是对整个内存(不要与机器上插那条对上号)的抽像描述。它是相对于物理内存来讲的,可以直接理解成 “不直实的”,“假的”内存,例如,一个 0x08000000 内存地址,它并不对就物理地址上那个大数组中 0x08000000 - 1 那个地址元素; 之所以是这样,是因为现代操作系统都提供了一种内存管理的抽像,即虚拟内存(virtual memory)。进程 使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。这个“转换”,是所有问 题讨论的关键。 有了这样的抽像,一个程序,就可以使用比真实物理地址大得多的地址空间。(拆东墙,补西墙,银行也是 这样子做的),甚至多个进程可以使用相同的地址。不奇怪,因为转换后的物理地址并非相同的。 ——可以把连接后的程序反编译看一下,发现连接器已经为程序分配了一个地址,例如,要调用某个函数 A, 代码不是 call A,而是 call 0x0811111111 ,也就是说,函数 A的地址已经被定下来了。没有这样的“转换”, 没有虚拟地址的概念,这样做是根本行不通的。 打住了,这个问题再说下去,就收不住了。 逻辑地址(logical address) Intel 为了兼容,将远古时代的段式内存管理方式保留了下来。逻辑地址指的是机器语言指令中,用来指定 一个操作数或者是一条指令的地址。以上例,我们说的连接器为 A分配的 0x08111111 这个地址就是逻辑地址。 ——不过不好意思,这样说,好像又违背了 Intel 中段式管理中,对逻辑地址,“一个逻辑地址,是由 一个段标识符加上一个指定段内相对地址的偏移量,示为 [段标识符:段内偏移量],也就是说,上例中那个 0x08111111,应该表示为[A 的代码段标识符: 0x08111111],这样,才完整一些” 线性地址(linear address)或也叫虚拟地址(virtual address) 跟逻辑地址类似,它也是一个不真实的地址,如果逻辑地址是对应的硬件平台段式管理转换前地址的话,那 么线性地址则对应了硬件页式内存的转换前地址。 ------------------------------------------------------------- CPU 将一个虚拟内存空间中的地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址(其实是段内 偏移量,这个一定要理解!!!),CPU 要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址, 再利用其页式内存管理单元,转换为最终物理地址。 这样做两次转换,的确是非常麻烦而且没有必要的,因为直接可以把线性地址抽像给进程。之所以这样冗余, Intel 完全是为了兼容而已。 2、CPU 段式内存管理,逻辑地址如何转换为线性地址 一个逻辑地址由两部份组成,段标识符: 段内偏移量。段标识符是由一个 16 位长的字段组成,称为段选择 符。其中前 13位是一个索引号。后面 3位包含一些硬件细节,如图: 最后两位涉及权限检查,本贴中不包含。 索引号,或者直接理解成数组下标——那它总要对应一个数组吧,它又是什么东东的索引呢?这个东东就是 “段描述符(segment descriptor)”,呵呵,段描述符具体地址描述了一个段(对于“段”这个字眼的理解,我 是把它想像成,拿了一把刀,把虚拟内存,砍成若干的截——段)。这样,很多个段描述符,就组了一个数组, 叫“段描述符表”,这样,可以通过段标识符的前 13 位,直接在段描述符表中找到一个具体的段描述符,这个 描述符就描述了一个段,我刚才对段的抽像不太准确,因为看看描述符里面究竟有什么东东——也就是它究竟是 如何描述的,就理解段究竟有什么东东了,每一个段描述符由 8个字节组成,如下图: 这些东东很复杂,虽然可以利用一个数据结构来定义它,不过,我这里只关心一样,就是 Base 字段,它描 述了一个段的开始位置的线性地址。 Intel 设计的本意是,一些全局的段描述符,就放在“全局段描述符表(GDT)”中,一些局部的,例如每个进 程自己的,就放在所谓的“局部段描述符表(LDT)”中。那究竟什么时候该用 GDT,什么时候该用 LDT 呢?这是由 段选择符中的 T1 字段表示的,=0,表示用 GDT,=1 表示用 LDT。 GDT 在内存中的地址和大小存放在 CPU 的 gdtr 控制寄存器中,而 LDT 则在 ldtr 寄存器中。 好多概念,像绕口令一样。这张图看起来要直观些: 
/
本文档为【逻辑地址、线性地址、物理地址和虚拟地址】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索