建设一个有影响力的网站,中国住房和城乡建设厅网站首页,仿别人的网站违法嘛,网络营销推广方法选择一、 物理地址和逻辑地址
物理地址#xff1a;加载到内存地址寄存器中的地址#xff0c;内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址#xff0c;编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地…一、 物理地址和逻辑地址
物理地址加载到内存地址寄存器中的地址内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地址是明确的、最终用在总线上的编号不必转换不必分页也没有特权级检查(no translation, no paging, no privilege checks)。
逻辑地址CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。例如你在进行C语言指针编程中可以读取指针变量本身值(操作)实际上这个值就是逻辑地址它是相对于你当前进程数据段的地址偏移地址不和绝对物理地址相干。
为什么会有这两种地址
个人觉的原因在于逻辑地址分配更加灵活可以允许不唯一看起来也较为直观例如一段代码中分配数组逻辑地址上是连续的然而在物理地址上这个数组所占用的页可能分散开来物理地址上就是不连续的这样对程序的可理解性上有影响。另外有了逻辑地址这个概念才能使用虚拟内存技术。
2、 Paging分页内存管理方案
2.1 分页的最大作用就在于使得进程的物理地址空间可以是非连续的。
物理内存被划分为一小块一小块每块被称为帧(Frame)。分配内存时帧是分配时的最小单位最少也要给一帧。在逻辑内存中与帧对应的概念就是页(Page)。
逻辑地址的表示方式是前部分是页码后部分是页偏移。
例如已知逻辑空间地址为2^m 个字节也就是说逻辑地址的长度是m位 已知页大小是 2^n 字节。那么一共可以有2^(m-n)个页。因此页码部分会占m-n位之后的n位用来存储页偏移。
举个例子 页大小为4B而逻辑内存为32B8页逻辑地址0的页号为0页号0对应帧5因此逻辑地址映射为物理地址54020。逻辑地址3映射物理地址54323。逻辑地址13(4*31页号为3偏移为1因此帧号为2)映射到物理地址9。 采用分页技术不会产生外部碎片(内存都被划分为帧)但可能产生内部碎片(帧已经是最小单元因此帧内部可能有空间没有用到)。
按概率计算下来每个进程平均可有半个帧大小的内部碎片。
2.2 页表的硬件实现
上一小节中写到页表是逻辑地址转化到物理地址的关键所在。那么页表如何存储
每个操作系统都有自己的方法来保存页表。绝大多数都会为每个进程分配一个页表。现在由于页表都比较大所以放在内存中(以往是放在一组专用寄存器里)其指针存在进程控制块(PCB)里当进程被调度程序选中投入运行时系统将其页表指针从进程控制块中取出并送入用户寄存器中。随后可以根据此首地址访问页表。
页表的存储方式是TBL(Translation look-aside buffer, 翻译后备缓冲器)内存。TBL实际上是一组硬件缓冲所关联的快速内存。若没有TBL操作系统需要两次内存访问来完成逻辑地址到物理地址的转换访问页表算一次在页表中查找算一次。TBL中存储页表中的一小部分条目条目以键值对方式存储。 2.3 页表的数据结构
a.
今年是2013年现有的笔记本电脑内存地址空间一般为2^32 字节以上。对于具有32位逻辑地址空间的计算机系统如果系统的页大小为4KB (2^12B) 那么页表可以拥有2^(32-12)个也就是一百多万个条目假设每个条目占有4B那每个进程都需要4MB的物理地址空间来存放页表本身。而且页表本身需要分配在连续内存中。
为此Hierarchical Paging(层次化分页)被提出实际上就是将页号分为两部分第一部分作为索引第二部分作为页号的偏移。
以一个4kb页大小的32位系统为例。一个逻辑地址被分为20位的页码和12位的页偏移。因为要对页表进行再分页所以该页号可分为10位的页码和10位的页偏移。这样一个逻辑地址就表示如下形式 地址转换过程如下 地址由外向内转换因此此方法也被称为forward-mapped page table(向前映射表)。
b. Hashed Page Tables 哈希页表
处理超过32位地址空间的常用方法是使用hashed page table(哈希页表)并以虚拟页码作为哈希值。哈希页表的每一条目都包括一个链表的元素这些元素哈希成同一位置。每个元素有三个域虚拟页码所映射的帧号指向链表中下一个元素的指针。
个人看来哈希页表的地址转换方式实际上是Chaining(链接)方式也就是一种哈希函数的溢出处理方式(另一种溢出处理方式叫做Open Addressing开放寻址)具体过程如下
逻辑地址需要大于32bit的地址空间来表示但是操作系统仍只有32bit来表示地址。此时人们便想到虚拟页地址虚拟地址可以在32bit表示范围之内然后利用哈希函数完成逻辑地址到虚拟地址的映射由于虚拟地址更少哈希函数会出现溢出这里使用Chaining来解决溢出。
逻辑地址中的页号(下图中的p)经过哈希函数的计算算出虚拟地址中的页号根据虚拟页号可以在哈希表中以O(1)方式寻址用p与链表中的每一个元素的第一个域相比较。如果匹配那么相应的帧号就用来形成物理地址。如果不匹配就对链表中的下一个节点进行比较以寻找一个匹配的页号。 c. Inverted page table 反向页表
时间关系这段暂时略过。
三、 Segmentation分段内存管理方案
采用分页内存管理有一个不可避免的问题用户视角的内存和实际内存的分离。设想一段main函数代码里面包含Sqrt函数的调用。按照编写者的理解这段代码运行时操作系统应该分配内存给符号表(编译时使用)栈(存放局部变量与函数参数值)Sqrt代码段主函数代码段等。这样编写者就可以方便地指出“函数sqrt内存模块的第五条指令”来定位一个元素。而实际上由于采用Paging的管理方式所有的一切都只是散落在物理内存中的各个帧上并不是以编写者的理解来划分模块。 Segmentation的内存管理方式可以支持这种思路。逻辑地址空间由一组段组成。每个段都有名字和长度。地址指定了段名称和段内偏移。因此用户通过两个量来指定地址段名称和偏移。段是编号的通过段号而非段名称来引用。因此逻辑地址由有序对构成
segment-number,offset(段号s, 段内偏移d)
段偏移d因该在0和段界限之间如果合法那么就与基地址相加而得到所需字节在物理内存中的地址。因此段表是一组基地址和界限寄存器对。 例如下图有5个段编号0~4例如段2为400B开始于位置4300对段2第53字节的引用映射成位置4300534353。而段0字节1222的引用则会触发地址错误因为该段的仅为1000B长(界限为1000)。 4、 合并分段和分页的管理方案
在现有的Intel兼容计算机(x86)上采用的内存管理方案是分段和分页合并的管理方案。
在这个方案中逻辑地址如前一节中所说是由一个段标识符加上一个指定段内相对地址的偏移量表示为 [段标识符段内偏移量]。
这样的逻辑地址转换的过程是怎样呢如下图所示 当CPU要执行一条引用了内存地址的指令时转换过程就开始了。第一步是把逻辑地址转换成线性地址。但是为什么不跳过这一步而让软件直接使用线性地址或物理地址呢原因主要是因为
(1) Intel的更新是渐进式而非革命式新的处理器需要兼容和保留过往的设置。具体的原因博文Memory Translation and Segmentation (http://blog.csdn.net/drshenlei/article/details/4261909) 中讲的较为清楚。
(2) 如上节所说采用段内存管理可以跟方便地进行地址保护(同一类型的地址逻辑地址在一起)。
下面讲逻辑地址到线性地址的部分。
在IBM OS/2 32位版本的操作系统和Intel 386的环境下。操作系统采用的内存分配方式就是分段和分页合并的方式。
逻辑地址的实际上是一对选择符偏移。
选择符的内容如下
从左开始13位是索引(或者称为段号)通过这个索引可以定位到段描述符(segment descriptor)而段描述符是可以真正记载了有关一个段的位置和大小信息 以及访问控制的状态信息。段描述符一般由8个字节组成。由于8B较大而Intel为了保持向后兼容将段寄存器仍然规定为16-bit(尽管每个段寄存器事实上有一个64-bit长的不可见部分但对于程序员来说段寄存器就是16-bit的)那么很明显我们无法通过16-bit长度的段寄存器来直接引用64-bit的段描述符。因此在逻辑地址中只用13bit记录其索引。而真正的段描述符被放于数组之中。
这个内存中的数组就叫做GDT(Global Descriptor Table全局描述表)Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址。程序员将GDT设定在内存中某个位置之后可以通过LGDT指令将GDT的入口地址装入此寄存器从此以后CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。
除了GDT之外还有LDT(Local Descriptor Table本地描述表)但与GDT不同的是LDT在系统中可以存在多个每个进程可以拥有自己的LDT。LDT的内存地址在LDTR寄存器中。
在之前图中的TI位就是用来表示此索引所指向的段描述符是存于全局描述表中还是本地描述表中。0表示用GDT1表示用LDT。
RPL位占2bit是保护信息位还没有仔细了解过这一块暂时先不写。
找到段描述符后加上偏移量便是线性地址。转换过程如下 在Intel 386的环境下线性地址转换为物理地址的过程和第二节分页式内存管理中层次分页中逻辑地址转换为物理地址的方法类似。如下图。 Intel 80386的地址转换全过程如下图 本文来自https://www.cnblogs.com/felixfang/p/3420462.html