参考 深入理解Linux内核
目录
PAE(Physical Address Extension)机制
x86内存地址:

段寄存器:

段描述符:
段描述符是8字节大小,存放在GDT或者LDT中

BASE:线性地址
G:这个位如果是0,表示一字节大小单位,如果是1,表示是4096
Limit:存放段中最后一个内存单元的偏移量,如果G=0,一个段的大小在1个字节到1MB之间变化,否则,将在4K到4G之间变化
S:系统标志,如果它被请0,这是一个系统段,存储LDT这种关键的数据结构,否则它是一个普通的代码段或者数据段
Type:描述了段的类型特征和它的存取权限
DPL:描述符特权级
P:0表示当前的段不在主存中。Linux总是把这个标志设为1,因为它从来不把整个段交换到磁盘上去。
D:取决于代码段还是数据段
AVL:被Linux忽略
Linux GDT(全局描述符表)和LDT(局部描述符表)
GDT包含18个段描述表和14个空的描述符
任务状态段
分页
![]()
页表项的大小是4bytes

分页举例:
假设线性地址是0x20021406
0x80指向目录项
0x21指向叶标祥
0x406在0x21指向页中的偏移地址
PAE(Physical Address Extension)机制
![]()
引脚数从32扩展到36
页表项大小从32扩展到64
Filed从20扩展到24
PAE扩展硬件内存地址,线性地址没发生变化
硬件高速缓存
由于主存和CPU之间速度不匹配,所以又加入高速缓存
读操作:
CPU直接在高速缓存中查找数据,
写操作:
通写:
内存和高速缓存同时更新
回写:
只更新高速缓存,在接收到FLUSH的硬件信号,在把高速缓存行写入到RAM中
Linux中的分页
采用四级页表结构:
物理内存布局
内核将下列页框标记为保留
(1)在不可用的物理地址范围内的页框
(2)含有内核代码和已经初始化数据结构的页框
Linux内核安装一般是从0x00100000开始的地方,从第二个MB开始
内核第一个MB用来
(1)页框0又BISO使用,存放加电自检期间检查到的系统硬件配置。
(2)物理地址从0x000a0000到0x000fffff留给BISO例程。
(3)映射ISA图形卡的内部内存,并且PC上640KB~1MB之间内存被保存,称之为洞。

进程的页表
在linux中有两种系统状态:
用户态
内核态
0x00000000~0xBFFFFFF线性地址,用户态内内核态都可以访问
0xC0000000~0xFFFFFFFF线性地址只有内核态可以进行访问
内核页表
内核维持着一组自己使用的页表,驻留在所谓的主内核页全局目录,系统初始化之后,还没有被任何进程或者内核线程直接使用,
内核如何初始化页表:
(1) 创建一个有限的地址空间,包括内核的代码段和数据段、初始化页表和存放动态数据结构的128KB的空间
(2)利用剩余的RAM建立分页表
临时内核页表
页描述符:
Linux内存管理区
0 ZONE_DMA 0~16MB
1 ZONE_NORMAL 16MB~896MB
2 ZONE_HIGHMEM 896MB之上
0通过 DMA访问
1内核可以直接访问
2内核无法直接访问,需要通过高端内存页框映射
每个管理区有自己的管理区描述符
管理区页框分配器:
内核子系统,处理对连续分配页框的内存分配请求
高端内存页框的内核映射:
由于高端内存访问无法通过线性地址完成,只能通过alloc_page类型的函数,内核线性地址空间的最后128MB的一部分专门用于映射高端内存页框
高端内核映射机制有三种:
(1)永久内核映射
(2)临时内核映射
(3)非连续内存区管理
伙伴算法系统
CPU页框高速缓存