- 论坛徽章:
- 0
|
你的理解错误很多,居然将硬件的进步说成是冗余,可惜了。
从硬件设计的角度来看!
物理地址: 内存单元的编号,逻辑上是将将内存单元按照一定的度量单位划分,如字节,字等,80x86 可以按字节也可以按字编址。所谓的总线只是一个存取通路,插座相当于一个设备开关。地址空间是数据总线的宽度。
逻辑地址:也称相对地址,是与绝对地址(物理地址)相对的一个概念,是相对与某一位置开始编址。她存在的意义是记住程序和数据的相对位置。一般定义为CPU通过地址总线发出的地址。 程序装入到内存后就通过相关的硬件,主要是地址的加法器与一个相对位置相加得到绝对地址。相对的位置是存在段表和页表中的,通过相联查找获得。地址空间由用户定义
虚拟内存:说白了就是构造一个满足程序和用户需要的空间。程序员不用担心内存不够!也不用担心地址问题。只要关心程序的逻辑顺序,即逻辑地址。
虚拟地址:和逻辑地址是抽象和具体的关系,是逻辑地址的一个实例。
虚拟地址到物理地址变换:对于X86 目前有三种方式,页式,段式,段页式
页式:
地址映像:
第一步 将用户程序按页的长度划分,长度固定。 划分了之后,就有了页的起始地址
第二步 操作系统创建进程时,先查全局的页表,找了几页空闲的内存,也就有了物理的页的起始地址
第三步 操作系统创建页表,一般有这么几项,物理页号, 用户页号 (o-n) 使用位等。 这样就建立了虚拟地址到物理地址的映射关系了。
地址变换:硬件根据cpu发出的逻辑地址(这里是虚拟地址)查表,得到物理的页号(高位地址),将物理页号加逻辑地址的地位(页内地址)就是物理地址了。一次查表,一次加法计算。比直接用物理地址编程效率要低很多。
段式:
虚拟地址划分 用户号+段号+段内偏移
地址映像:
第一步 将用户程序分段,长度不固定。 划分了之后,就有了段的起始地址,和段的长度。
第二步 操作系统,根据段长申请内存空间,也就有了段起始地址。
第三步 操作系统创建段表,一般有这么几项,两个段起始地址, 段长。 这样就建立了逻辑段到物理段的映射关系了。
地址变换:INTEL X86是这样的, 有段寄存器堆,即段选择子,描述符是一致的。 先将段表基地址装入 LDT,(这里讨论的是一般用户程序),根据CPU 发出的逻辑地址得到段号, 加上LDT 当中的段表基地址得到一个逻辑段到物理段的映射项,读出物理段基地址,再加上段的偏移得到 物理地址 ,总共需要做两次加法,一次查表, 效率更低。
段页式: 即将程序中一段再分页,需要一个段表,一个页表,先查段表得到页表基地址,然后再页式变换。
对于这种三种变换方式的优点: 简化 编程,简化系统设计,太多了,
总结: 对内核编程人员的建议: 先对程序划分,再定义映射,设置寄存器,地址变换由硬件完成。 |
|