操作系统设计与实现.pdf
《操作系统设计与实现.pdf》由会员分享,可在线阅读,更多相关《操作系统设计与实现.pdf(246页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 1 现在还是很初始的草稿版本,需要进一步修订、改进和增加内容。如发现内容有问题或有好的建议请电邮告诉我们(),谢谢!操作系统设计与实现 The Design&Implementation of Operating System 陈渝 向勇 清华大学计算机系 2011 年 6 月 2 第第1 1章章 操作系统简介操作系统简介 要点(OSP):OS 定义:位于 1.2.1 要点(OSP):OS 抽象:位于 1.2.2 对于在校的学生和已经参加工作的工程师而言,能否以较小的时间和精力比较全面地了解操作系统呢?陆游老夫子说过“纸上得来终觉浅,绝知此事要躬行”,也许在了解基本的操作系统概念和原理基础上
2、,通过实际动手来一步一步分析、设计和实现一个微型化的操作系统,会发现操作系统原来如此,概念原理和实际实现之间有紧密的联系和巨大的差异。一方面现在的操作系统课本越来越庞大和抽象,反而忽视了实践。要知道,操作系统的设计实现是在没有教科书的情况下完成的。换句话说,现有操作系统的实现,再有操作系统的课本。而另一方面实际的操作系统相当庞大,如 Linux、Windows 等,都是上百万行的源代码规模,实现这些软件的目的是给人用的,不是给人学的。能否在这两方面找到一个平衡?早期的 UNIX 操作系统和 MIT 教授 Frans Kaashoek 博士等基于 UNIX v6 设计的 xv6 操作系统给了我们
3、启发:对一个计算机专业的本科生而言,设计实现一个操作系统有挑战但是可行!本书想进行这样的教学尝试,以设计实现一个微型但全面的“麻雀”操作系统ucore为基本目标,以增量式地完成各种基于 ucore 操作系统的实验为实践过程,以在此过程中逐步介绍的操作系统的基本概念和原理为实践指导,做到有“理”可循和有“码”可查,最终让读者了解和掌握操作系统的原理、设计与实现。1.1 应具备的背景知识和学习环境应具备的背景知识和学习环境 设计实现操作系统其实就是设计实现一个软件,所以本书的例子和描述需要读者学习过计算机原理课程、程序设计课程,掌握 C 语言编程(了解指针等的编程),对基于 Intel 80386
4、处理器体系结构有一定的了解,大致了解基于基于 Intel 80386 的汇编语言。本书涉及的例子和实验可在 Windows 环境和 Linux 环境下采用命令行(CLI)方式和集成开发环境(IDE)方式进行编译和运行,所以,最好能够有一台 PC 计算机用于进行操作系统实验。1.2 操作系统的概念操作系统的概念 1.2.1 操作系统的定义操作系统的定义 操作系统是计算机系统机构中的一个系统软件,它的职能主要有两个:对下面(也就是计算机硬件),有效地组织和管理计算机系统中的硬件资源(包括处理器、内存、硬盘、显示器、键盘、鼠标等各种外设);对上面(应用程序或用户),提供简洁的服务功能接口,屏蔽硬件管
5、理带来的差异性和复杂性,使得应用程序和用户能够灵活、方便、有效地使用计算机。为了完成这两个职能,操作系统需要在其内部实现中合理地组织计算机中的软硬件资源的使用分配和处理流程,使整个计算机系统能高效地运行。3 1.2.2 操作系统的抽象操作系统的抽象 操作系统为了能够更好地管理计算机系统并对应用程序提供便捷的服务,在操作系统的发展过程中,计算机科学家提出了如下四个个抽象概念,奠定了操作系统的基础。操作系统原理中的其他概念基本上都可基于上述这四个操作系统抽象。中断(中断(Interrupt)简单地说,中断是处理器在执行过程中的突变,用来响应处理器状态中的特殊变化。比如当应用程序正在执行时,产生了时
6、钟外设中断,导致操作系统打断当前应用程序的执行,转而去处理时钟外设中断,处理完毕后,再回到应用程序被打断的地方继续执行。在操作系统中,有三类中断:外设中断(Device Interrupt)、陷阱中断(Trap Interrupt)和故障中断(Fault Interrupt,也称为 exception,异常)。外设中断由外部设备引起的外部 I/O事件如时钟中断、控制台中断等。外设中断是异步产生的,与处理器的执行无关。故障中断是在处理器执行指令期间检测到不正常的或非法的内部事件(如除零错、地址访问越界)。陷阱中断是在程序中使用请求操作系统服务的系统调用而引发的有意事件。在后面的叙述中,如果没有特
7、别指出,我们将用简称中断、陷阱、故障来区分这三种特殊的中断事件,在不需要区分的地方,统一用中断表示。进程(进程(Process)简单地说,进程是一个正在运行的程序。在计算机系统中,我们可以“同时”运行多个程序,这个“同时”,其实是操作系统给用户造成的一个“幻觉”。大家知道,处理器是计算机系统中的硬件资源。为了提高处理器的利用率,操作系统采用了多道程序技术。如果一个程序因某个事件而不能运行下去时,就把处理器占用权转交给另一个可运行程序。为了刻画多道程序的并发执行的过程,就要引入进程的概念。从操作系统原理上看,一个进程是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。操作系统中的进程
8、管理需要协调多道程序之间的关系,解决对处理器分配调度策略、分配实施和回收等问题,从而使得处理器资源得到最充分的利用。虚存(虚存(Virtual Memory)简单地说,虚存就是操作系统通过处理器中的 MMU 硬件的支持而给应用程序和用户提供一个大的(超过计算机中的内存条容量)、一致的(连续的地址空间)、私有的(其他应用程序无法破坏)的存储空间。这需要操作系统将内存和硬盘结合起来管理,为用户提供一个容量比实际内存大得多的虚拟存储器,并且需要操作系统为应用程序分配内存空间,使用户存放在内存中的程序和数据彼此隔离、互不侵扰。操作系统中的虚存管理与处理器的 MMU密切相关。文件(文件(File)简单地
9、说,文件就是存放在永久存储介质(比如硬盘、光盘、U 盘等)上,方便应用程序和用户读写的数据。当处理器需要访问文件中的数据时,可通过操作系统把它们装入内存。放在硬盘上的程序也是一种文件。文件管理的任务是有效地支持文件的存储、检索和修改等操作。1.3 “麻雀”操作系统“麻雀”操作系统-ucore 写一个操作系统难吗?别被现在上百万行的 Linux 和 Windows 操作系统吓倒。当年Thompson 乘他老婆带着小孩度假留他一人在家时,写了 UNIX;当年 Linus 还是一个 21 岁大 4 学生时完成了 Linux 雏形。站在这些巨人的肩膀上,我们能否也尝试一下做“巨人”的滋味呢?MIT 的
10、 Frans Kaashoek 等在 2006 年参考 PDP-11 上的 UNIX Version 6 写了一个可在 X86上跑的操作系统 xv6(基于 MIT License),用于学生学习操作系统。我们可以站在他们的肩膀上,基于 xv6 的设计,尝试着一步一步完成一个从“空空如也”到“五脏俱全”的“麻雀”操作系统ucore,此“麻雀”包含虚存管理、进程管理、处理器调度、同步互斥、进程间通信、文件系统等主要内核功能,总的内核代码量(C+asm)不会超过 5K 行。充分体现了“小而全”的指导思想。ucore 的运行环境可以是真实的 X86 计算机,不过考虑到调试和开发的方便,我们可采用 X8
11、6 模拟器,比如 QEMU、BOCHS 等,或 X86 虚拟运行环境,比如 VirtualBox、VMware Player等。ucore 的开发环境主要是 GCC 中的 gcc、gas、ld 和 MAKE 等工具,也可采用集成了这些工具的 IDE 开发环境 Eclipse-CDT。运行环境和开发环境既可以在 Linux 或 Windows 中使用。那我们准备如何一步一步实现 ucore 呢?安装一个操作系统的开发过程,我们可以有如下的开发步骤:1)启动操作系统的 bootloader,用于了解操作系统启动前的状态和要做的准备工作,了解运行操作系统的硬件支持,操作系统如何加载到内存中,理解两类
12、中断-“外设中断”,“陷阱中断”,内核态和用户态的区别;2)内存管理子系统,用于理解 x86 分段/分页模式,了解操作系统如何管理物理内存和虚存、页表管理、一类中断-“故障中断”、缺页故障处理、基于页的内存替换;3)进程管理子系统,用于了解进程创建、执行、切换和结束的动态管理过程,了解在用户态通过系统调用得到内核态的内核服务的过程;4)处理器调度子系统,用于理解操作系统的调度过程和调度算法;5)同步互斥子系统,用于了解同步互斥的具体实现以及对系统性能的影响,研究死锁产生的原因,以及如何避免死锁;6)进程间通信子系统:用于了解进程间如何进行信息交换和共享;7)文件系统,了解文件系统的具体实现,与
13、进程管理等的关系,了解缓存对操作系统IO 访问的性能改进,了解虚拟文件系统(VFS)、buffer cache 和 disk driver 之间的关系。8)网络协议栈(选做):了解网卡驱动、TCP/IP 协议栈实现和 Web 应用。其中每个开发步骤都是建立在上一个步骤之上的,就像搭积木,从一个一个小木块,最终搭出来一个小房子。在搭房子的过程中,完成从理解操作系统原理到实践操作系统设计与实现的探索过程。这个房子最终的建筑架构和建设进度如下图所示(要标注处各个 proj 的特点,可在最后写):5 外设控制器外设控制器/中断控制器中断控制器串口串口CGACGA并口并口I I/O O地址空间地址空间M
14、EMMEM地址空间地址空间CPUCPU设备驱动层设备驱动层initinit子系统子系统库函数子系统库函数子系统cprintfcprintf/strstr*.*.软件层软件层硬件层硬件层硬盘硬盘网卡网卡键盘键盘时钟时钟串口串口CGACGA并口并口硬盘硬盘网卡网卡键盘键盘时钟时钟中断控制器中断控制器中断管理子系统中断管理子系统bootloaderbootloader内存管理子系统内存管理子系统物理内存分配管理物理内存分配管理虚拟内存分配管理虚拟内存分配管理段式内存管理段式内存管理页式内存管理页式内存管理页替换算法页替换算法swapswap管理管理页故障管理页故障管理连续地址空间分配算法连续地址空间
15、分配算法不连续地址空间分配算法不连续地址空间分配算法写时复制写时复制按需分页按需分页进程管理子系统进程管理子系统进程调度算法进程调度算法进程生命周期管理进程生命周期管理进程调度框架进程调度框架进程间共享库支持进程间共享库支持文件管理子系统文件管理子系统Buffer CacheBuffer CacheUNIXUNIX文件系统文件系统FATFAT文件系统文件系统同步互斥同步互斥/死锁死锁同步互斥应用实例同步互斥应用实例LockLock实现实现semaphoresemaphore实现实现解决死锁问题的实例解决死锁问题的实例进程间通信进程间通信PIPEPIPE消息队列消息队列MonitorMonito
16、r监控子系统监控子系统远程远程debugdebug调试子系统调试子系统系统调用接口系统调用接口内核态内核态用户态用户态用户态函数库用户态函数库各种用户态应用和测试用例各种用户态应用和测试用例网络网络TCPTCP/IPIP协议栈协议栈实验进度颜色图实验进度颜色图 6 1.4 处理器硬件基础简介处理器硬件基础简介 要想深入理解 ucore,就需要了解支撑 ucore 运行的硬件环境,即了解处理器体系结构(了解硬件对 ucore 带来影响)和机器指令集(读懂 ucore 的汇编)。ucore 目前支持的硬件环境是基于 Intel 80386 以上的计算机系统。更多的硬件相关内容(比如保护模式等)将随
17、着实现 ucore 的过程逐渐展开介绍。1.4.1 Intel 80386 运行模式运行模式 80386 有四种运行模式:实模式、保护模式、SMM 模式和虚拟 8086 模式。这里对涉及 ucore 的实模式、保护模式做一个简要介绍。实模式:80386 加电启动后处于实模式运行状态,在这种状态下软件可访问的物理内存空间不能超过 1MB,且无法发挥 Intel 80386 以上级别的 32 位 CPU 的 4GB 内存管理能力。实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。这样用户程序的一个指针如果指向了操
18、作系统区域或其他用户程序区域,并修改了内容,那么其后果就很可能是灾难性的。实模式:实模式是为了和 8086 处理器兼容而设置的。在实模式下,80386 处理器就相当于一个快速的 8086 处理器。80386 处理器被复位或加电的时候以实模式启动。这时候处理器中的各寄存器以实模式的初始化值工作。80386 处理器在实模式下的存储器寻址方式和8086 是一样的,由段寄存器的内容乘以 16 当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的 32 位地址线只使用了低 20 位,即可访问 1MB 的物理地址空间。在实模式下,80386 处理器不能对内存进行页机制管理,所以指令寻址的地址就是内
19、存中实际的物理地址。在实模式下,所有的段都是可以读、写和执行的。实模式下 80386 不支持优先级,所有的指令相当于工作在特权级(即优先级 0),所以它可以执行所有特权指令,包括读写控制寄存器 CR0 等。实模式下不支持硬件上的多任务切换。实模式下的中断处理方式和 8086处理器相同,也用中断向量表来定位中断服务程序地址。中断向量表的结构也和 8086 处理器一样,每 4 个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。保护模式:实际上,80386 就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR与 TR 等管理寄存器以及页表,然后再通过加载 CR0 使其
20、中的保护模式使能位置位而进入保护模式的。当 80386 工作在保护模式下的时候,其所有的 32 根地址线都可供寻址,物理寻址空间高达 4GB。在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。保护模式下 80386 支持多任务,还支持优先级机制,不同的程序可以运行在不同的优先级上。优先级一共分 03 4 个级别,操作系统运行在最高的优先级 0 上,应用程序则运行在比较低的级别上;配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。1.4.2 Intel 80386 内存架构内存架构 80386 是 32 位的处理器,即可以寻址的物理内存地址空间为 232=
21、4G 字节。在理解操作系统的过程中,需要用到三个地址空间的概念。地址是访问地址空间的索引。物理内存地址物理内存地址空间空间是处理器提交到总线上用于访问计算机系统中的内存和外设的最终地址。一个计算机系 7 统中只有一个物理地址空间。线性地址空间线性地址空间是每个运行的应用程序看到的地址空间,在操作系统的虚存管理之下,每个运行的应用程序都认为自己独享整个计算机系统的地址空间,这样可让多个运行的应用程序之间相互隔离。处理器负责把线性地址转换成物理地址。一个计算机系统中可以有多个线性地址空间(比如一个运行的程序就可以有一个私有的线性地址空间)。线性地址空间的大小与物理地址空间的大小没有必然的连续。逻辑
22、地址空间逻辑地址空间是应用程序直接使用的地址空间。这是由于 80386 中无法禁用段机制,使得逻辑地址一直存在。比如如下 C 代码片段:int boo=1;int*foo=&a;这里的 boo 是一个整型变量,foo 变量是一个指向 boo 地址的整型指针变量,foo 中储存的内容就是 boo 的逻辑地址。逻辑地址由一个 16 位的段寄存器和一个 32 位的偏移量构成。Foo 中放的就是 32 位的偏移量,而对应的段信息位于段寄存器中。上述三种地址的关系如下:分段机制启动、分页机制未启动:逻辑地址-段机制处理段机制处理-线性地址=物理地址 分段机制和分页机制都启动:逻辑地址-段机制处理段机制处
23、理-线性地址-页机制处理页机制处理-物理地址 1.4.3 Intel 80386 寄存器寄存器 80386 的寄存器可以分为 8 组:通用寄存器,段寄存器,指令指针寄存器,标志寄存器,系统地址寄存器,控制寄存器,调试寄存器,测试寄存器,它们的宽度都是 32 位。一般程序员看到的寄存器包括通用寄存器,段寄存器,指令指针寄存器,标志寄存器。General Register(通用寄存器通用寄存器):EAX/EBX/ECX/EDX/ESI/EDI/ESP/EBP 这些寄存器的低 16 位就是 8086 的 AX/BX/CX/DX/SI/DI/SP/BP,对于 AX,BX,CX,DX 这四个寄存器来讲,
24、可以单独存取它们的高 8 位和低 8 位(AH,AL,BH,BL,CH,CL,DH,DL)。它们的含义如下:EAX:累加器 EBX:基址寄存器 ECX:计数器 EDX:数据寄存器 ESI:源地址指针寄存器 EDI:目的地址指针寄存器 EBP:基址指针寄存器 ESP:堆栈指针寄存器 8 Segment Register(段寄存器,也称段寄存器,也称 Segment Selector,段选择符,段选择子,段选择符,段选择子):除了 8086 的 4 个段外(CS,DS,ES,SS),80386 还增加了两个段 FS,GS,这些段寄存器都是 16 位的,它们的含义如下:CS:代码段(Code Seg
25、ment)DS:数据段(Data Segment)ES:附加数据段(Extra Segment)SS:堆栈段(Stack Segment)FS:附加段 GS 附加段 Instruction Pointer(指令指针寄存器指令指针寄存器):EIP 的低 16 位就是 8086 的 IP,它存储的是下一条要执行指令的内存地址,在分段地址转换中,表示指令的段内偏移地址。EAXEAXEDXEDXECXECXEBXEBXEBPEBPESIESIEDIEDIESPESPAHAHAXAXALALDHDHDXDXDLDLCHCHCXCXCLCLBHBHBXBXBLBL31231570通用寄存器BPBPSISI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 设计 实现
限制150内