日期:2014-05-16  浏览次数:20722 次

深入理解Linux内核--内存(阅读笔记)(原创)


深入理解Linux内核--内存(阅读笔记)(原创)

?

?

?

由? 王宇 原创并发布

?

?

第二章内存寻址

??? 1、内存地址

??? ??? [1]逻辑地址

??? ??? ??? 每个逻辑地址都由一个段(segment)和偏移量(offset或displacement)组成,偏移量指明了从段开始的地方到实际地址之间的距离

??? ??? [2]线性地址

??? ??? ??? 是一个32为无符号整数,可以用来表示高达4GB的地址

??? ??? [3]物理地址

??? ??? ??? 用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚发送到内存总线上的电信号相对应。物理地址由32位或36位无符号整数表示

??? ??? 内存控制单元(MMU)通过一种称为分段单元的硬件电路把一个逻辑地址转换成线性地址;接着,第二个称为分页单元的硬件电路把线性地址转换成一个物理地址。 参见图:2-1 p41



?

??? 2、硬件中的分段

??? ??? 实模式和保护模式

??? ??? (1)段选择符和段寄存器

??? ??? ??? 段选择符是一个16位长的字段,称为选择符(SegmentSeletor)???

??? ??? ??? 为了快速方便地找到段选择符,处理器提供段寄存器,段寄存器的唯一目的是存放段选择符。这些段寄存器称为cs,ss,ds,es,fs和gs

??? ??? (2)段描述符

??? ??? ??? 每个段由一个8字节的段描述符表示,它描述了段的特征。段描述符放在全局描述符表(GlobalDescriptorTable,GDT)或局部描述符表(LocalDescriptorTable,LDT)中。参考表2-1 p43

??? ??? ??? Linux中被广泛采用的类型:

??? ??? ??? ??? 代码段描述符

??? ??? ??? ??? 数据段描述符

??? ??? ??? ??? 任务状态段描述符

??? ??? (3)快速访问段描述符

??? ??? ??? 每当一个段选择符被装入段寄存器时,相应的段描述符就由内存装入到对应的非编程CPU寄存器。从那时起,针对哪个段的逻辑地址转换就可以不访问主存中的GDT或LDT,处理器只需直接引用存放段描述符的CPU寄存器即可。仅当段寄存器的内容改变时,才有必要访问GDT或LDT

??? ??? (4)分段单元***

??? ??? ??? 参考图2-5,显示一个逻辑地址是怎样转换成相应的线性地址的


?
??? 3、Linux中的分段

??? ??? 分段和分页某种程度上有点多余:分段给一个进程分配不同的线性地址空间,分页可以把同一线性地址空间映射到不同的物理空间。Linux更喜欢分页方式

??? ??? Linux进程都使用一对相同的段来对指令和数据寻址。

??? ??? 四个主要的Linux段

??? ??? ??? 用户代码段:__USER_CS

??? ??? ??? 用户数据段:__USER_DS

??? ??? ??? 内核代码段:__KERNEL_CS

??? ??? ??? 内核数据段:__KERNEL_DS


??? ??? (1)LinuxGDT

??? ??? (2)LinuxLDT

??? 4、硬件中的分页***

??? ??? 分页单元(pagingunit)把线性地址转换成物理地址。为了效率起见,线性地址被分成以固定长度为单位的组,称为页(page).页内部连续的线性地址被映射到连续的物理地址中。分页单元把所有的RAM分成固定长度的页框(pageframe)(有时叫做物理页)。每一个页框包含一个页,也就是说一个页框的长度与一个页的长度一致。页框是主存的一部分,因此也是一个存储区域。区分一页和一个页框是很重要的,前者只是一个数据块,可以存放在任何页框或磁盘中

??? ??? 把线性地址映射到物理地址的数据结构称为页表(pagetable).页表存放在主存中,并在启动分页单元之前必须由内核对页表进行适当的初始化

??? ??? (1)常规分页:

??? ??? ??? 32位的线性地址被分成3个域:(参考图:2-7)


?
??? ??? ??? ??? 目录:

??? ??? ??? ??? 页表:

??? ??? ??? ??? 偏移量:

??? ??? 二级模式的目的在于减少每个进程页表所需RAM的数量


??? ??? 每个活动进程必须有一个分配给它的页目录。没有必要马上为进程的所有页表都分配RAM

??? ??? (2)扩展分页

??? ??? ??? 80x86微处理器允许页框大小为4MB,内核可以不用中间页表进行地址转换,从而节省内存

??? ??? (3)硬件保护方案

??? ??? ??? 段:读,写,执行;页:读,写

??? ??? (4)常规分页举例

??? ??? (5)物理地址扩展(PAE)分页机制

??? ??? (6)64位系