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对齐
- linux0.12之内存管理(2)-再理解分段分页
- Linux0.12内核之内存管理(2)
- linux0.12之内存管理(1)-整体框架思路
- Linux0.12内核之内存管理(3)
- linux0.11之内存管理
- IOS开发之内存管理(2)
- 深入理解Java虚拟机之内存管理(读书笔记)
- 深入理解JVM之内存管理
- 《深入理解java虚拟机》之内存管理
- 深入理解Linux内核之内存管理
- 深入理解JAVA虚拟机之内存管理
- linux之内存管理(2)
- c++之内存管理2
- 操作系统之内存管理2
- 深入Linux内核架构之内存管理(2)
- Boost之内存管理学习(一)
- Boost之内存管理学习(二)
- OC之内存管理(笔记)
- sqoop 导出 hive分区表 数据到 mysql
- 输入10 个数字,按各个位上的和从小到大排序,如果相同,则按数字从小到大排序。
- linux语句和shell的反复练习
- facebook网络环境模拟工具atc
- java中判断字符串是否为数字的方法的几种方法
- linux0.12之内存管理(2)-再理解分段分页
- 103.在学生结构体数据中寻找最低分数
- CodeForces 554A
- CSS3实现整屏切换效果
- sass / compass 使用笔记
- 大区间素数筛选 POJ2689
- 【Ray Tracing from Ground Up】DRBF
- springmvc+mybatis+spring
- 这是命运