此章节内容主要与硬件层和操作系统层面相关,与高层编程隔离,了解之。
其中,
仲裁器
多处理器计算机,多个CPU共享同一主存
主存由RAM芯片构成
RAM芯片读写操作必须串行执行
所以,每个RAM芯片与总线之间存在仲裁器(硬件电路),当RAM空闲时,允许1CPU操作。
段选择符
段选择符表明选择的段索引/指示/权限。对应的,段需要有段描述符,来标示不同内存地址段的特征,条目存放于GDT(global descriptor table,1个/CPU)或LDT(local descriptor table,进程单独设置);
上文提到的段特征,可以认为有几种常用类型:代码段、数据段、任务状态段、描述LDT的段,分别对应不同段描述符;
分段单元转换方法
硬件电路实现分段单元功能,转换方法如下:
Linux中分段
然而,Linux中未充分利用分段机制。使用4段(用户数据段/用户代码段/内核数据段/内核代码段),段起始地址均为0,从而0*index+offset= offset,线性地址即为逻辑地址。
Linux中分页
四级分页结构,无需四级时中间两级目录仅设置一项兼容,具体位数设置及检查页表目录等由一系列宏实现。
分页与进程强相关
物理内存布局
初始化阶段,内核需要知道哪些物理空间可用,分为
1. [保留] 内核不可用地址(如起始1MB空间留给BIOS/PC体系);
2. [保留] 含有内核代码;
3. 非保留类,可被动态分配或交换到磁盘。
典型配置,RAM PC需要128MB保留空间,固定映射关系。
进程页表(3G/1G)
内核页表
分为两阶段:
1. 初始化,内核及数据等;128M
2. 剩余可用空间,分页,使用;1G-128M=896M
RAM可用空间有三种情况,[0,896M](虚拟地址与物理地址一一对应)/[896M,4G](动态重映射)/[4G,++](非连续内存管理)
缓存
除此之外,每个CPU内还存在TLB(translation lookaside buffer),记录线性地址对应转换后的物理地址,下次访问无需转换,硬件层面无需保证多CPU内的TLB一致性,由OS中内核保证。
任何进程切换时默认活动页表同时被切换,除了两种情况,使用相同页表的2个普通进程/普通进程和内核线程;
多个CPU的TLB一致性,内核线程存在lazy TLB机制。切换到同一页表的进程及时更新;切换到不同页表的,自动刷新为新的页表。
参见http://www.wowotech.net/memory_management/tlb-flush.htm