【学习笔记】深入理解Linux内核第三版 ——第二章 内存寻址

时间:2022-07-29 15:47:52

此章节内容主要与硬件层和操作系统层面相关,与高层编程隔离,了解之。

 

 【学习笔记】深入理解Linux内核第三版 ——第二章 内存寻址

其中,

仲裁器

多处理器计算机,多个CPU共享同一主存

主存由RAM芯片构成

RAM芯片读写操作必须串行执行

所以,每个RAM芯片与总线之间存在仲裁器(硬件电路),当RAM空闲时,允许1CPU操作。

 段选择符

段选择符表明选择的段索引/指示/权限。对应的,段需要有段描述符,来标示不同内存地址段的特征,条目存放于GDT(global descriptor table,1个/CPU)或LDT(local descriptor table,进程单独设置);

上文提到的段特征,可以认为有几种常用类型:代码段、数据段、任务状态段、描述LDT的段,分别对应不同段描述符;

分段单元转换方法

硬件电路实现分段单元功能,转换方法如下:

【学习笔记】深入理解Linux内核第三版 ——第二章 内存寻址

 Linux中分段

然而,Linux中未充分利用分段机制。使用4段(用户数据段/用户代码段/内核数据段/内核代码段),段起始地址均为0,从而0*index+offset= offset,线性地址即为逻辑地址。

 【学习笔记】深入理解Linux内核第三版 ——第二章 内存寻址

Linux中分页

四级分页结构,无需四级时中间两级目录仅设置一项兼容,具体位数设置及检查页表目录等由一系列宏实现。

【学习笔记】深入理解Linux内核第三版 ——第二章 内存寻址

分页与进程强相关

【学习笔记】深入理解Linux内核第三版 ——第二章 内存寻址

物理内存布局

初始化阶段,内核需要知道哪些物理空间可用,分为

1. [保留] 内核不可用地址(如起始1MB空间留给BIOS/PC体系);

2. [保留] 含有内核代码;

3. 非保留类,可被动态分配或交换到磁盘。

 典型配置,RAM PC需要128MB保留空间,固定映射关系。

进程页表(3G/1G)

【学习笔记】深入理解Linux内核第三版 ——第二章 内存寻址

内核页表

分为两阶段:

1. 初始化,内核及数据等;128M

2. 剩余可用空间,分页,使用;1G-128M=896M

RAM可用空间有三种情况,[0,896M](虚拟地址与物理地址一一对应)/[896M,4G](动态重映射)/[4G,++](非连续内存管理)

 

缓存

【学习笔记】深入理解Linux内核第三版 ——第二章 内存寻址

 除此之外,每个CPU内还存在TLB(translation lookaside buffer),记录线性地址对应转换后的物理地址,下次访问无需转换,硬件层面无需保证多CPU内的TLB一致性,由OS中内核保证。

任何进程切换时默认活动页表同时被切换,除了两种情况,使用相同页表的2个普通进程/普通进程和内核线程;

多个CPU的TLB一致性,内核线程存在lazy TLB机制。切换到同一页表的进程及时更新;切换到不同页表的,自动刷新为新的页表。

参见http://www.wowotech.net/memory_management/tlb-flush.htm