`
kongweile
  • 浏览: 508335 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

内存分段机制

 
阅读更多

转:http://book.51cto.com/art/200812/103305.htm

在内存分段系统中,一个程序的逻辑地址通过分段机制自动地映射(变换)到中间层的4GB(232B)线性地址空间中。程序每次对内存的引用都是对内存段中内存的引用。当程序引用一个内存地址时,通过把相应的段基址加到程序员看得见的逻辑地址上就形成了一个对应的线性地址。此时若没有启用分页机制,则该线性地址就被送到CPU的外部地址总线上,用于直接寻址对应的物理内存。如图5-6所示。

 
图5-6  虚拟地址(逻辑地址)到物理地址的变换过程

CPU进行地址变换(映射)的主要目的是为了解决虚拟内存空间到物理内存空间的映射问题。虚拟内存空间的含义是指一种利用二级或外部存储空间,使程序能不受实际物理内存量限制而使用内存的一种方法。通常虚拟内存空间要比实际物理内存量大得多。

那么虚拟存储管理是怎样实现的呢?原理与上述列车运行的比喻类似。首先,当一个程序需要使用一块不存在的内存时(即在内存页表项中已标出相应内存页面不在内存中),CPU就需要一种方法来得知这个情况。这是通过80386的页错误异常中断来实现的。当一个进程引用一个不存在页面中的内存地址时,就会触发CPU产生页出错异常中断,并把引起中断的线性地址放到CR2控制寄存器中。因此处理该中断的过程就可以知道发生页异常的确切地址,从而可以把进程要求的页面从二级存储空间(如硬盘上)加载到物理内存中。如果此时物理内存已经被全部占用,那么可以借助二级存储空间的一部分作为交换缓冲区(Swapper)把内存中暂时不使用的页面交换到二级缓冲区中,然后把要求的页面调入内存中。这也就是内存管理的缺页加载机制,在Linux 0.12内核中是在程序mm/memory.c中实现。

Intel CPU使用段(Segment)的概念来对程序进行寻址。每个段定义了内存中的某个区域以及访问的优先级等信息。假定大家知晓实模式下内存寻址原理,现在我们根据CPU在实模式和保护模式下寻址方式的不同,用比较的方法来简单说明32位保护模式运行机制下内存寻址的主要特点。

在实模式下,寻址一个内存地址主要是使用段和偏移值,段值被存放在段寄存器中(如ds),并且段的长度被固定为64KB。段内偏移地址存放在任意一个可用于寻址的寄存器中(如si)。因此,根据段寄存器和偏移寄存器中的值,就可以算出实际指向的内存地址,如图5-7a所示。

而在保护模式运行方式下,段寄存器中存放的不再是被寻址段的基地址,而是一个段描述符表(Segment Descriptor Table)中某一描述符项在表中的索引值。索引值指定的段描述符项中含有需要寻址的内存段的基地址、段的长度值和段的访问特权级别等信息。寻址的内存位置是由该段描述符项中指定的段基地址值与一个段内偏移值组合而成。段的长度可变,由描述符中的内容指定。可见,和实模式下的寻址相比,段寄存器值换成了段描述符表中相应段描述符的索引值以及段表选择位和特权级,称为段选择符(Segment Selector),但偏移值还是使用了原实模式下的概念。这样,在保护模式下寻址一个内存地址就需要比实模式下多一个环节,即需要使用段描述符表。这是由于在保护模式下访问一个内存段需要的信息比较多,而一个16位的段寄存器放不下这么多内容。示意图如图5-7b所示。注意,如果你不在一个段描述符中定义一个内存线性地址空间区域,那么该地址区域就完全不能被寻址,CPU将拒绝访问该地址区域。

 

图5-7  实模式与保护模式下寻址方式的比较

a) 实模式下寻址  b) 保护模式下寻址

每个描述符占用8字节,其中含有所描述段在线性地址空间中的起始地址(基址)、段的长度、段的类型(如代码段和数据段)、段的特权级和其他一些信息。一个段可以定义的最大长度是4GB。

保存描述符项的描述符表有3种类型,每种用于不同目的。全局描述符表(Global Descriptor Table,GDT)是主要的基本描述符表,该表可被所有程序用于引用访问一个内存段。中断描述符表(Interrupt Descriptor Table,IDT)保存了定义中断或异常处理过程的段描述符。IDT表直接替代了8086系统中的中断向量表。为了能在80x86保护模式下正常运行,必须为CPU定义一个GDT表和一个IDT表。最后一种类型的表是局部描述符表(Local Descriptor Table,LDT)。该表应用于多任务系统中。通常每个任务使用一个LDT表。作为对GDT表的扩充,每个LDT表为对应任务提供了更多的可用描述符项,因而也为每个任务提供了可寻址内存空间的范围。这些表可以保存在线性地址空间的任何地方。为了让CPU能定位GDT表、IDT表和当前的LDT表,需要为CPU分别设置GDTR、IDTR和LDTR三个特殊寄存器。这些寄存器中将存储对应表的32位线性基地址和表的限长字节值。表限长值是表的长度值减1。

当CPU要寻址一个段时,就会使用16位的段寄存器中的选择符来定位一个段描述符。在80x86 CPU中,段寄存器中的值右移3位即是描述符表中一个描述符的索引值。13位的索引值最多可定位8192(0~8191)个描述符项。选择符中位2(TI)用来指定使用哪个表。若该位是0则选择符指定的是GDT表中的描述符,否则是LDT表中的描述符。

每个程序都可由若干个内存段组成。程序的逻辑地址(或称为虚拟地址)即是用于寻址这些段和段中具体地址位置。在Linux 0.12中,程序逻辑地址到线性地址的变换过程使用了CPU的全局段描述符表GDT和局部段描述符表LDT。由GDT映射的地址空间称为全局地址空间,由LDT映射的地址空间则称为局部地址空间,而这两者构成了虚拟地址的空间。具体的使用方式如图5-8所示。

 

 

图5-8  Linux系统中虚拟地址空间分配图

 

图中画出了具有两个任务时的情况。可以看出,每个任务的局部描述符表LDT本身也是由GDT中描述符定义的一个内存段,在该段中存放着对应任务的代码段和数据段描述符,因此LDT段很短,其段限长通常只要大于24字节即可。同样,每个任务的任务状态段TSS也是由GDT中描述符定义的一个内存段,其段限长也只要满足能够存放一个TSS数据结构就够了。

对于中断描述符表IDT,它保存在内核代码段中。由于在Linux 0.12内核中,内核和各任务的代码段和数据段都分别被映射到线性地址空间中相同基址处,且段限长也一样,因此内核的代码段和数据段是重叠的,各任务的代码段和数据段分别也是重叠的,如5-10和图5-11所示。任务状态段(Task State Segment,TSS)用于在任务切换时CPU自动保存或恢复相关任务的当前执行上下文(CPU当前状态)。例如对于切换出的任务,CPU就把其寄存器等信息保存在该任务的TSS段中,同时CPU使用新切换进任务的TSS段中的信息来设置各寄存器,以恢复该任务的执行环境,参见图4-37。在Linux 0.12中,每个任务的TSS段内容被保存在该任务的任务数据结构中。另外,Linux 0.12内核中没有使用到GDT表中第4个描述符(图中syscall描述符项)。从如下所示的include/linux/sched.h文件中第201行上的原英文注释可以猜想到,Linus当时设计内核时曾经想把系统调用的代码放在这个独立的段中。

200 /*
201  * Entry into gdt where to find first TSS. 0-nul, 1-cs, 2-ds, 3-syscall
202  * 4-TSS0, 5-LDT0, 6-TSS1 etc ...
203 */
分享到:
评论

相关推荐

    Linux内存管理之分段机制

     如上图,Linux在内存管理上,把逻辑地址通过分段机制变化成线性地址,线性地址也是4G(32位系统)的程序地址。线性地址再通过分页机制转化成物理地址,后CPU去访问物理地址。  去年写个一篇关于IA32内存寻址的...

    操作系统lab-内存分配与分段分页机制

    First fit, best fit and worst fit 操作系统lab-内存分配与分段分页机制

    第16章 存储管理1

    背景知识x86的分段机制的分段机制I386内存寻址的硬件支持内存寻址的硬件支持硬件及硬件及LinuxLinux的分段机制的分段机制硬件及硬件及LinuxLinu

    驱动程序复习题20名词解释逻辑地址虚拟地址线性地址物理地址

    2、 80386保护模式下虚拟地址是如何经过分段机制转化为线性地址再经过分页机制转化为物理地址的? 3、 什么是虚拟内存管理?80386为操作系统实现虚拟内存管理提供了哪些硬件支持?两者是如何相互配合实现虚拟内存...

    疯狂内核之——Linux虚拟内存

    1.1 基于x86的Linux分段机制 5 1.2 基于x86的Linux分页机制 7 1.2.1 页全局目录和页表 8 1.2.2 线性地址到物理地址 10 1.2.3 线性地址字段处理 13 1.2.4 页表处理 15 1.3 扩展分页与联想存储器 20 1.4 Linux内存布局...

    操作系统内存管理MMU详细剖析

    操作系统内存管理MMU详细剖析 内存管理单元工作过程,page分页机制、虚拟内存、分段、寻址映射 逻辑地址,物理地址

    Linux下内存寻址.pdf

    想写介绍了MMU机制中的分段分页机制,是学习linux系统内存管理比较好的资料

    linux 内存管理

    linux 内存管理 分段 分页 伙伴算法 Linux如何有效地利用x86的分段和分页机制把逻辑地址转换为物理地址 RAM的某些部分永久地分配给内核,用以存放内核代码以及静态数据

    C/C++中的内存管理小结

    前言 我们最初熟知的内存开辟方式: int val = 20: 在栈空间上开辟4个字节 char array[10]: 在栈空间上开辟10个字节的连续空间 ...对内存分段是计算机的管理机制 1.栈又叫堆栈,存放非静态局部变量

    windows的内存管理

    windows的内存管理,系统介绍了dos,386下的windows内存管理机制。区分线性地址,物理地址区别……需要同学可以看看

    Xen虚拟化技术

    内存虚拟化子系统主要包括分页分段机制、内存分配和地址转换等;I/O设备虚拟化子系统主要包括分离驱动模型(前后端设备模型)、虚拟块设备和网络设备的基本原理机及相关操作等。, (3.)安全相关模块,包括两个模块...

    第4章 内存管理.ppt

    掌握请求分页的页表机制、缺页中断机构和地址变换机构,掌握页面置换算法。 ◆掌握虚拟存储器的理论基础和定义,熟悉虚拟存储器实现方式和特征。掌握分段、分页和段页式存储管理原理和地址变换机构。

    最强悍的操作系统学习资料

    详细解释内存管理的基本机制,介绍内存分区的方法,以及内存管理系统中基本构造块的两种技术:分页和分段。 重点: 内存分区的主要放置算法,分页和分段技术 难点:重定位概念,分页和分段技术 第8章虚拟内存 详细...

    上海一家公司的C++试题集

    寻址采用32位段和偏移量,最大寻址空间4GB,在这种模式下,系统运行于多任务,设计这种模式的原因和好处是:保护模式增加了寻址空间,增加了对多任务的支持,增加了段页式寻址机制的内存管理(分段机制使得段具有...

    ConcurrentHashMap思维导图完整版

    本文将结合Java内存模型,分析JDK源代码,探索ConcurrentHashMap高并发的具体实现机制,包括其在JDK中的定义和结构、并发存取、重哈希和跨段操作,并着重剖析了ConcurrentHashMap读操作不需要加锁和分段锁机制的内在...

    模拟请求段式存储管理

    (3)在系统的设计中,尽量采用面向对象的机制。 ========================================第2页======================================== 课 程 设 计 (4)开发环境:Windows XP 或Windows 2000 (5...

    课设-基于QT和C++开发的人机交互的模拟操作系统源码+详细项目说明(含进程内存文件系统设备管理).zip

    **选做:内存的离散分配(分页式、分段式或段页式管理),以及基于此种机制下的虚拟内存管理,页面置换算法。** ### 3. **文件管理:** 考虑文件及文件目录的创建、查询、删除等操作的实现,考虑磁盘空间...

    X86CPU在段式管理下的地址形成机制

    X86 CPU在段式管理下的地址形成机制 以及BIOS初始化过程对这种机制的利用 陈英豪 中科院计算所

    《操作系统真象还原》高清完整版,baidu云

    3.2.3 实模式下内存分段由来 76 3.2.4 实模式下CPU内存寻址方式 78 3.2.5 栈到底是什么玩意儿 81 3.2.6 实模式下的ret 84 3.2.7 实模式下的call 85 3.2.8 实模式下的jmp 92 3.2.9 标志寄存器flags 97 3.2.10 有条件...

    JavaSE基础面试题.docx

    1.面向对象的的特征有哪些方面 2.论述类的加载机制 3.对于反射的理解 4.GC是什么?为什么要有GC ...23.ConcurrentHashMap分段式加锁是如何实现 24.HashMap存储null值的底层实现 25.叙述线程的生命周期

Global site tag (gtag.js) - Google Analytics