一、课程讲义
内核概述
1 history
linux history
linux features
2 What is Kernel
Kernel Design Goals
性能:效率,速度(利用资源到容量,低开销,代码大小)
稳定性:健壮性,弹性(正常运行时间,优雅的退化能力)
灵活性,兼容性,安全性,保护保护用户彼此,安全系统、可移植性、清晰、可扩展性
Design Tradeoffs(设计权衡)
3 Architectural Approaches(架构方法)
3.1 Monolithic kernel(单片内核)
所有内核例程都在一起,链接在一个大的可执行文件中,例如:Linux, Mac OS <= 8.6,大多数bsd。
优点:易于理解、性能好;缺点:内核组件之间没有保护,内核中的代码很多,不(非常)可扩展
Linux是一个模块化的、类似unix的单块内核
Stephen Tweedie的图解
3
3.2 MicroKernel
- 用一组“小的、干净的、合乎逻辑的”抽象取代单片内核。
- 将操作系统的其余部分移到用户空间服务器进程文件、tcp、进程管理、分页
- 在20世纪90年代初被认为太慢了
- 例如:Mach(1986), QNX, MINIX, L4
微内核示例- minix 3系统
为什么微内核有吸引力?
- 隔离(相对bug)
- 容错(重新启动单个服务)
- 模块化(可理解的,可替换的服务)
- 更容易分发(IPC允许服务在其他主机上)
- 更容易在多处理器上运行(因为许多服务器)
- 更容易提供调度,优先级(至少在内核API)
- 更容易提供安全性(至少在内核API)
3.3 Hybrid Kernel(混合的内核)
混合内核是单体内核和微内核的混合体。
这个系统的优点是保留了单内核的性能和设计原则,但允许不受信任的用户加载不受信任的代码来访问他们自己的存储设备。
示例:Windows NT(包括2000、XP及以上版本)、Mac OS X (XNU)
3.4 Exokernel(外核)
n. 外核:一种操作系统内核设计,旨在将尽可能多的系统资源管理从内核移到用户空间,从而提高系统性能和灵活性。
理念:一个操作系统实现并不适合所有人。exokkernel消除了所有的抽象。
与内核编写者相比,应用程序更了解如何管理活动的硬件资源。Expose HW-let应用程序做它想做的事情。
每个应用libOS实现抽象示例:MIT Xok/ExOS
Memories addressing(内存寻址)
1 Memory Addresses
- 英特尔地址术语:逻辑->线性(分页)->物理
- 可以禁用分页
- 分割要求
2 IA32中的分割
-
一个逻辑地址由两个部分组成:一个段选择器(16位)和一个偏移寄存器(32位)
-
用来保存段选择器:cs, ss, ds, es, fs, gs。
-
cs:代码段寄存器,指向包含程序指令的段;ss:堆栈段寄存器,指向包含当前程序堆栈的段;ds:数据段寄存器,指向包含全局和静态数据的段
段描述符
每个段由一个8字节的段描述符表示。段描述符要么存储在GDT中,要么存储在LDT中。
只有一个GDT被定义,而每个进程被允许有自己的LDT几种类型的段描述符:代码段描述符、数据段描述符、任务段描述符、本地描述符、表描述符
段描述符字段
段描述符格式
分段单元:将逻辑地址转换成相应的线性地址。
3 Segmentation in Linux
Linux 2.6只在IA32需要时才以非常有限的方式使用分段。
所有进程都使用相同的四个段。
四个主要Linux段的段描述符字段的值:
单处理器系统:只有一个GDT
多处理器系统:每个CPU一个GDT。
GDT中包含18个段描述符:四个用户和内核代码和数据段;一个任务状态段(TSS)一个包含默认LDT的段,由所有进程共享;三个线程本地存储(TLS)段;三个与高级电源管理(APM)相关的段。
大多数应用程序不使用LDT,大多数进程共享默认LDT。
4 Paging in Hardware
分页单元将线性地址转换为物理地址。80x86处理器通过设置一个名为cr0的控制寄存器的PG标志来支持分页。
术语:
- 线性地址按固定长度的间隔分组,称为页。
- 所有RAM被划分为固定长度的页帧(物理页)。
- 页表:将线性地址映射到物理地址的数据结构
- cache
- TLB
4.1 Regular Paging
IA32的分页单元处理4 KB的页面
上图展示了IA-32架构中分页单元的两级分页系统。这种设计采用了两级分页,主要是为了提高内存管理的效率,尤其是在管理大型内存地址空间时。这背后的原因和优点如下:
1. 支持更大的地址空间
IA-32是32位的处理器架构,它可以支持的最大逻辑地址空间是 2322^{32}232 字节,也就是4 GB。直接用一个单级的页表来管理如此大的地址空间会导致页表非常庞大。采用两级分页可以避免这种情况,通过分割逻辑地址,将其分为更小的部分,从而使页表更加易于管理。
2. 减小页表的大小
如果只采用单级分页,4 GB的地址空间中的每一页(4 KB)都需要一个页表项。假设每个页表项占用4字节,那么单级分页的页表会占用:
4 GB4 KB×4 字节=4 MB\frac{4 \text{ GB}}{4 \text{ KB}} \times 4 \text{ 字节} = 4 \text{ MB}4 KB4 GB×4 字节=4 MB
单级分页需要4 MB的页表,这在当时(32位系统普及初期)的内存资源较为有限,显然是一种不经济的设计。而通过采用两级分页,内存的管理被分成更小的部分,减少了整体的页表占用。
3. 分页机制的分层设计
图中的两级分页系统通过将逻辑地址分为三个部分:
- Page Directory(页目录):高10位用于索引页目录,决定使用哪个页表。
- Page Table(页表):中间10位用于索引具体的页表项。
- Offset(偏移量):最后12位用于页内偏移,表示页内的具体位置。
通过两级分页,地址空间被分为页目录和页表两部分,页表只需要在需要时分配。这样可以避免预先为整个4 GB的地址空间分配大的页表。
4. 减少内存浪费
两级分页允许只在需要的时候分配页表。假设一个程序只需要使用很小一部分地址空间,而非全4 GB地址空间,那么操作系统只会为实际使用的页分配页表和页框。这种按需分配可以极大地节省内存,并减少内存浪费。
总结:
两级分页系统是为了在管理较大内存地址空间时,减少页表大小和内存开销,并提高系统内存的使用效率。它通过将逻辑地址划分为页目录、页表和偏移量三部分,使得页表的分配更加灵活,同时保证了大地址空间的有效管理。
4.2 Extended Paging(扩展分页)
-
扩展分页可以与常规分页共存,它允许页帧为4 MB。
-
没有页表,因此节省内存和保留TLB条目。
4.3 The Physical Address Extension (PAE)物理地址扩展
- 从Pentium Pro开始,36位物理地址,线性地址仍然是32位地址。
- 64gb的RAM被划分为224个不同的页面帧:页表项(64位):12个标志位和24个物理地址位。因此,一个4 kb的PAE页表包含512个条目,而不是1024个。
- 引入了一种新的页表级别,称为页目录指针表(PDPT),由四个64位条目组成
4.4 4.4 Paging for 64-bit Architectures(64位架构的分页)
两级分页不适合64位体系。
4.5 Translation Lookaside Buffers (TLB)
- 除了通用硬件缓存之外,80x86处理器还包括另一种缓存,称为Translation Lookaside Buffers (TLB),用于加速线性地址转换。
- 在多处理器系统中,每个CPU都有自己的TLB,称为CPU的本地TLB
- 当CPU的cr3控制寄存器被修改时,硬件会自动使本地TLB的所有表项失效
5 Paging in Linux
5.1 Paging Model
内核提供了许多函数和宏来查找地址和管理表。(见教科书)
5.2 Kernel Page Tables(内核页表)
- 内核维护一组页表供自己使用,这些页表根植于一个主内核页全局目录(master kernel page Global Directory),该目录是系统中每个常规进程的参考模型
-
临时内核页表存储在swapper_pg_dir中。从线性地址0x00000000到0x007fffff和线性地址0xc0000000到0xc07fffff映射到物理地址0x00000000到0x007fffff。
Final kernel Page Table(最终内核页表)
- 当RAM大小小于896 MB时的最终内核页表标识映射页全局目录条目:0x1e3 == Present,已访问,Dirty, Read/Write, Page size (4MB), Global
-
在这种情况下,大于896 MB的RAM不能完全映射到内核线性地址空间。需要动态重新映射
最终内核页表当RAM大小大于4096 MB PAE时,采用三层分页模型。Page全局目录中的前三个条目对应用户线性地址空间中的一个空页的地址。
第四个条目是用Page Middle Directory (pmd)的地址初始化的。页中间目录中的前448个条目用第一个896 MB RAM的物理地址填充,条目的标志是0x1e3(2MB页)。最后64位预留给不连续内存分配;
5.3 Process Page Tables(进程页表)
- 进程的线性地址空间分为两部分:当进程以用户模式或内核模式运行时,可以寻址从0x00000000到0xbfffffff的线性地址。
- 从0xc0000000到0xffffffff的线性地址只有在进程以内核模式运行时才能寻址,内核模式的页全局目录项对于所有进程应该是相同的,并且等于主内核页全局目录的相应项
二、复习纲要(2024)
导论
本科操作系统的基本知识
内核版本号和Linux内核的开发模式及发布模式
操作系统有哪些设计目标?这些目标是否可以全部达成?
微内核和单一(整体,宏)内核, 外内核, 其后面的设计动机和基本原理
存储管理
彻底理解•Page •page frame •page table •cache •TLB•memory fragmentation 各技术术语及基本概念原理
Linux的分页模型
IA32的分页方式(包括PAE),即页面大小等,页面大小对系统的影响
掌握术语NUMA 、NODE、ZONE
物理内存的划分(ZONE_DMA等)以及划分后面的原理