Linux 内存介绍

参考 深入理解Linux内核

目录

x86内存地址:

段寄存器:

段描述符:

分页

分页举例:

PAE(Physical Address Extension)机制

硬件高速缓存

Linux中的分页

物理内存布局

进程的页表

内核页表

临时内核页表


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页框高速缓存

 

 

 


版权声明:本文为weixin_37747603原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。