NFS
起根文件系统只能先放一放了,实再是不行了,必须继续进行下面的了~~
最可悲的是昨天的考试还被抓了~~
日了~~
(四)、嵌入式Linux内核驱动进阶
(4)、内存管理(Linux内存管理)—①
1、32位CPU的段式管理、页式管理
首先呢,介绍一下32位CPU的段式管理以及业式管理。
1)段式管理
学过微机原理的肯定是知道段式管理的,所以我也就是不说了。
32位PC的内存管理仍然采用“分段”的管理模式,逻辑地址同样由段地址和偏移量两部分组成,32位的PC的内存管理和16位PC的内存管理有相同之处也有不同之处,因为32位PC采用了两种不同的工作方式:实模式和保护模式。
32位CPU内有6个段寄存器,其值在不同的模式下有不同的含义:
实模式(这个完全可以忽略,因为不用):
在实模式下,32位CPU的内存管理与16位CPU是抑制的。
段寄存器的值*16就是段地址
保护模式:
段基地址长达32位,每个段的最大容量可达4G,段寄存器的值是段地址的“选择器”(Selector),用该“寄存器”从内存中得到一个32位的段地址,存储单元的物理地址就是该段地址加上段内偏移量,这与32位CPU的物理地址计算方式完全不同。
段寄存器的值是一个选择器,间接指出一个32位的段地址
如图:
2)分页管理
从管理和效率的角度出发,线性地址被分为固定产度的组,称为页(page),例如32位的机器,线性地址最大可位4G,如果用4KB为一个页来划分,这样整个线性地址就被划分为2的20次方个页。
另一类页称为物理页,或者页框、页桢。分页单元把所有的物理内存也划分为固定长度的管理单位,它的长度一般与线性地址页是相同的。
如图:
①、分页单元中,页目录的地址放在CPU的cr3寄存器中,是进行地址转换的开始点。
②、每一个进程,都有其独立的虚拟地址空间,进行一个进程,首先需要将它的页目录地址放到cr3寄存器中,将其它的进程保存下来。
③、每一个32位的线性地址被划分为三部分:
页目录索引(10位)、页表索引(10位)、偏移(12位)
然后就是转换步骤:
①、装入进程的页目录地址(操作系统在调度进程时,把这个地址装入 rc3)
②、根据线性地址前十位,在页目录中,找到对应的索引项,页目录中的项是一个页表的地址。
③、根据线性地址的中间十位,在也表中找到页的起始地址。
④、将页的起始地址与线性地址的最后12位相加,得到物理地址。
2、Linux内存管理
介绍完32位的内存管理,然后就是Linux的内存管理。
Linux内核的设计并没有全部采用 Intel 所提供的段机制,仅仅是有限度的(设置可以说就是没有用到)使用了分段机制。
这不仅仅简化了Linux内核的设计,而且为把Linux移植到其他平台创造了条件,因为很多RISC处理器并不支持段机制。
所有的段的基地址均为0
由此可以得出,每个段的逻辑地址空间范围为0~4GB。因为每个段的基地址为0,因此,逻辑地址与线性地址保持一致(既逻辑地址的偏移量字符的值与线性地址的值总是相同的),在Linux中所提到的逻辑地址和线性地址(虚拟地址),可以认为是一致的。看来Linux巧妙地把段机制给绕过去了,而完全利用了分页机制。
前面介绍的二级页管理架构,不过有些CPU(Alpha 64位)使用三级、设置四级架构,Linux
2.6.29内核为每种CPU提供了统一的界面,采用了四级页管理架构,来兼容二级、三级、四级管理架构的CPU。
这司机分别为:
1、页全局目录(Page Global Directory):既pgd,是多级页表的抽象最高层。
2、页上级目录(Page Upper Directory):既pud。
3、页中间目录(Page Middle Diretory):既pmd,是页表的中间层。
4、页表(Page Tabbl Entry):既pte。