- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、概念 物理地址 (physical address)
用于内存芯片级的单元寻址,与处理器和 CPU 连接的地址总线相对应。
—— 这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那
根内存本身,把内存看成一个从 0 字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事
实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是 “与地址总线相对应 ”,是更贴切
一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。也许错误的理
解更利于形而上的抽像。
虚拟内存 (virtual memory)
这是对整个内存 (不要与机器上插那条对上号) 的抽像描述。它是相对于物理内存来讲的,可以直接理解成 “不直实的 ”,
“假的”内存,例如,一个 0内存地址,它并不对就物理地址上那个大数组中 0- 1 那个地址元
素;
之所以是这样,是因为现代操作系统都提供了一种内存管理的抽像,即虚拟内存( virtual memory )。进程使用虚拟
内存中的地址,由操作系统协助相关硬件,把它 “转换 ”成真正的物理地址。这个 “转换 ”,是所有问题讨论的关键。
有了这样的抽像, 一个程序,就可以使用比真实物理地址大得多的地址空间。 (拆东墙,补西墙,银行也是这样子做的) ,甚至多个进程可以使用相同的地址。不奇怪,因为转换后的物理地址并非相同的。
—— 可以把连接后的程序反编译看一下,发现连接器已经为程序分配了一个地址,例如,要调用某个函数 A,代码不是
call A ,而是 call 0x0811111111 ,也就是说,函数 A 的地址已经被定下来了。没有这样的 “转换”,没有虚拟地址的
概念,这样做是根本行不通的。
打住了,这个问题再说下去,就收不住了。
逻辑地址 (logical address)
Intel 为了兼容,将远古时代的段式内存管理方式保留了下来。逻辑地址指的是机器语言指令中,用来指定一个操作数
或者是一条指令的地址。以上例,我们说的连接器为 A 分配的 0这个地址就是逻辑地址。
—— 不过不好意思,这样说,好像又违背了 Intel 中段式管理中,对逻辑地址要求, “一个逻辑地址,是由一个段标识符
加上一个指定段内相对地址的偏移量,表示为 [ 段标识符:段内偏移量 ] ,也就是说,上例中那个 0,应该
表示为 [A 的代码段标识符 : 0 ,这样,才完整一些 ”
线性地址 (linear address) 或也叫虚拟地址 (virtual address)
跟逻辑地址类似,它也是一个不真实的地址,如果逻辑地址是对应的硬件平台段式管理转换前地址的话,那么线性地址
则对应了硬件页式内存的转换前地址。
CPU 将一个虚拟内存空间中的地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址(其实是段内偏移量,这
个一定要理解!!!), CPU 要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址,再利用其页式内存管理单元,转换为最终物理地址。
这样做两次转换,的确是非常麻烦而且没有必要的,因为直接可以把线性地址抽像给进程。之所以这样冗余, Intel 完
全是为了兼容而已。
1 / 8
2 、CPU 段式内存管理,逻辑地址如何转换为线性地址
一个逻辑地址由两部份组成,段标识符 : 段内偏移量。段标识符是由一个 16 位长的字段组成,称为段选择符。其中前
13 位是一个索引号。后面 3 位包含一些硬件细节,如图:
最后两位涉及权限检查,本贴中不包含。
索引号,或者直接理解成数组下标 —— 那它总要对应一个数组吧,它又是什么东东的索引呢?这个东东就是 “段描述符
(segment descriptor) ,”呵呵,段描述符具体地址描述了一个段(对于 “段”这个字眼的理解,我是把它想像成,拿了
一把刀,把虚拟内存,砍成若干的截 —— 段)。这样,很多个段描述符,就组了一个数组,叫 “段描述符表 ”,这样,可以通过段标识符的前 13 位,直接在段描述符表中找到一个具体的段描述符,这个描述符就描述了一个段,我刚才对段
的抽像不太准确,因为看看描述符里面究竟有什么东东 —— 也就是它究竟是如何描述的,就理解段究竟有什么东东了,每一个段描述符由 8 个字节组成,如下图:
这些东东很复杂,虽然可以利用一个数据结构来定义它,不过,我这里只关心一样,就是 Base 字段,它描述了一个段
的开始位置的线性地址。
2 / 8
Intel 设计的本意是,一些全局的段描述符,就放在 “全局段描述符表 (GDT) ”中,
文档评论(0)