linux0.12之内存管理(2)-再理解分段分页

来源:互联网 发布:php zend extension 编辑:程序博客网 时间:2024/06/06 04:24

分段是完成逻辑地址向线性地址的映射,这样对于用户任务而言,其寻址就是在4G的线性地址上面。
分页管理的目的是将物理内存页面映射到某一线性地址处。
线性地址对应的物理地址
这里写图片描述
上面是线性地址到物理地址的转换,
linux的页目录和页表在head.s中设置,是在地址0放置页目录随后放置4个页表,这5个表是内核在内核空间映射的,任务0,是在内核中执行,所以任务0也是使用这个表,但是之后fork出来的任务会在主内存中建立自己的页表。
逻辑地址到线性地址的映射,需要研究一下x86的分段机制
x86使用段的寻址技术,将内存空间分成一个或者多个段,所以对于一个内存地址的寻址,需要一个段的起始地址(基地址)和一个段内偏移大小组成段。
段可以用来存放程序的代码、数据和堆栈,或者说存放系统数据结构(比如TSS和LDS)。
段选择符提供段描述符表(比如GDT)中的一个数据结构(称为段描述符)的偏移量,段描述符指明了段的大小,段的基地址,等等信息。
下面来看看分段机制是如何实现的:
每个段由三个参数定义:段基地址、段限长、段属性(比如该段是否可读等属性)。
这三个参数保存在段描述符的结构项中,而这个段描述符保存在内存中的段描述符表中。段描述符表是一个段描述符数组。如何寻址这个数组是通过段选择符完成的,如下图:
这里写图片描述
图中提到的标识符表有两种,全局描述符表GDT和局部描述符表LDT。集体是选择GDT还是LDT,是由段选择符的属性位决定的。
虚拟地址空间被分成大小相等的两部分,一般由GDT映射到线性地址,另一半由LDT来映射到线性地址。
整个逻辑地址有2E14个段,则GDT映射2E13个段,在任务切换时,GDT是不改变的,而LDT是改变的,所以GDT是作为系统共享映射的,
如下图有一个形象说明
这里写图片描述
任务A和B在GDT映射下,共享系统代码和数据,其自身的代码数据映射是通过LDT映射的。
看看段选择符的定义:索引值+表指示标志TI+请求特权级RPL
这里写图片描述
段选择符得到段描述符,段描述符是由8个字节构成
这里写图片描述
由段描述符可以得到线性地址,这里面有个标志位需要知道,描述符类型S,
所以就段描述符有三种
这里写图片描述
出现这三种,是在段描述符的某些字段,会表示不同的含义。
这里写图片描述
这里写图片描述
上面关于分段和分页的基本理解如此。
还有一个问题就是,一段可执行代码,其分布结构是如何的
这里写图片描述
linux0.12分给每个代码的逻辑空间是64M,并且地址64M对齐

0 0
原创粉丝点击