内容简介
本书对操作系统的内存管理、进程管理、进程协调和同步、进程间通信、实时时钟管理、设备无关的I/O、设备驱动、网络协议、文件系统等进行了详细的介绍,并利用分层的设计范式,以一种有序、易于理解的方式来阐述这些内容。本书以Xinu操作系统为系统设计的样板和模式,从一个裸机开始,一步一步地设计和实现一个小型但优雅的操作系统。本书的样本代码可以运行在linksys E2100L无线路由器上。
本书适用于的本科生或低年级的研究生,也适用于那些想了解操作系统的计算机从业人员。学习本书前,学生需要具备基本的程序设计能力,应当理解基本的数据结构,包括链表、栈和队列,并且应当用C语言写过程序。
目录
目 录
Operating System Design:The Xinu Approach,linksys Version
出版者的话
译者序
前言
关于作者
第1章 引言和概述1
1.1 操作系统1
1.2 本书的研究方法1
1.3 分层设计2
1.4 Xinu操作系统3
1.5 操作系统不是什么3
1.6 从外面看操作系统4
1.7 其他章节概要4
1.8 观点5
1.9 总结5
练习5
第2章 并发执行与操作系统服务6
2.1 引言6
2.2 多活动的编程模型6
2.3 操作系统服务7
2.4 并发处理的概念和术语7
2.5 串行程序和并发程序的区别8
2.6 多进程共享同一段代码9
2.7 进程退出与进程终止11
2.8 共享内存、竞争条件和同步11
2.9 信号量与互斥14
2.10 Xinu中的类型命名方法15
2.11 使用Kputc和Kprintf进行操作系统的调试16
2.12 观点16
2.13 总结16
练习17
第3章 硬件和运行时环境概览18
3.1 引言18
3.2 E2100L的物理和逻辑结构18
3.3 处理器结构和寄存器19
3.4 总线操作:获取-存储范式19
3.5 直接内存访问19
3.6 总线地址空间20
3.7 内核段KSEG0和KSEG1的内容20
3.8 总线启动的静态配置21
3.9 调用约定和运行时栈21
3.10 中断和中断处理22
3.11 异常处理23
3.12 计时器硬件23
3.13 串行通信24
3.14 轮询与中断驱动I/O24
3.15 内存缓存和KSEG124
3.16 存储布局24
3.17 内存保护25
3.18 观点25
练习25
第4章 链表与队列操作26
4.1 引言26
4.2 用于进程链表的统一数据结构26
4.3 简洁的链表数据结构27
4.4 队列数据结构的实现28
4.5 内联队列操作函数29
4.6 获取链表中进程的基础函数29
4.7 FIFO队列操作30
4.8 优先级队列的操作32
4.9 链表初始化33
4.10 观点34
4.11 总结34
练习35
第5章 调度和上下文切换36
5.1 引言36
5.2 进程表36
5.3 进程状态38
5.4 就绪和当前状态38
5.5 调度策略38
5.6 调度的实现39
5.7 上下文切换的实现41
5.8 内存中保存的状态41
5.9 在MIPS处理器上切换上下文41
5.10 重新启动进程执行的地址43
5.11 并发执行和null进程44
5.12 使进程准备执行和调度不变式44
5.13 推迟重新调度45
5.14 其他进程调度算法47
5.15 观点47
5.16 总结47
练习47
第6章 更多进程管理49
6.1 引言49
6.2 进程挂起和恢复49
6.3 自我挂起和信息隐藏49
6.4 系统调用的概念50
6.5 禁止中断和恢复中断51
6.6 系统调用模板51
6.7 系统调用返回SYSERR和OK值51
6.8 挂起的实现52
6.9 挂起当前进程53
6.10 suspend函数的返回值53
6.11 进程终止和进程退出54
6.12 进程创建56
6.13 其他进程管理函数59
6.14 总结60
练习61
第7章 协调并发进程62
7.1 引言62
7.2 进程同步的必要性62
7.3 计数信号量的概念63
7.4 避免忙等待63
7.5 信号量策略和进程选择63
7.6 等待状态64
7.7 信号量数据结构64
7.8 系统调用wait65
7.9 系统调用signal66
7.10 静态和动态信号量分配66
7.11 动态信号量的实现示例67
7.12 信号量删除68
7.13 信号量重置69
7.14 多核处理器之间的协调69
7.15 观点70
摘要与插图
第1章 引言和概述第1章 引言和概述
第1章
Operating System Design:The Xinu Approach,linksys Version
引言和概述
第1章 引言和概述
我们的小小系统也有风光的时刻。
——Alfred,Lord Tennyson
1.1 操作系统
每一个智能设备和计算机系统中都隐藏着这么一类软件,它们控制着处理信息、管理资源以及与显示屏、网络、磁盘和打印机等设备通信的工作。总的来说,这些进行控制和协调工作的代码通常叫做执行器、监视器、任务管理器,或者内核,而我们将使用一个更宽泛的术语操作系统。
计算机操作系统是人类创造的杂的物体之一:计算机操作系统允许多个计算进程和用户同时共享一个CPU,保护数据免受未经授权的访问,并保持独立输入/输出(I/O)设备的正确运行。操作系统提供的服务都是通过向复杂的硬件发送一系列详细的命令实现的。有趣的是,操作系统并不是从外部控制电脑的独立机制——它还包括一些软件,这些软件由执行应用程序的同一处理器执行。事实上,当处理器运行应用程序的时候,处理器是不能执行操作系统的,反之亦然。
保证操作系统总在应用程序运行结束后重新夺回控制权的安排机制使得操作系统的设计变得复杂。操作系统人印象深刻的方面来自于服务和硬件之间的不同:操作系统在低级的硬件上提供服务。随着本书内容的推进,读者就会理解系统软件处理像串行接口这样简单的设备需要做的事情。而其中的哲学原理很简单:操作系统应该提供让编程更加容易的抽象,而不是反映底层硬1件设备的抽象。因此,我们得出结论:
设计操作系统时,应该隐藏底层的硬件细节,并创建一个为应用程序提供服务的抽象机器。
操作系统的设计并不是人们所熟知的工艺。,由于计算机的缺乏和价格的昂贵,只有少数程序员有从事操作系统相关工作的机会。而现在,由于的微电子技术降低了制造成本使得微处理器不再昂贵,操作系统便成为一种商品,与此同时也只有少数程序员从事操作系统方面的工作。有趣的是,由于微处理器变得便宜,大多数电子设备都是从可编程处理器构建得到,而不是从离散的逻辑构建得到。因此,设计与实现微机和微控制器的软件系统不再是专家的专利,它已成为一个称职的系统程序员必须能胜任的技术。
幸运的是,随着生产新机器的技术的发展,我们对于操作系统的理解也在不断提高。研究人员已经找出了根本问题,制定了设计原则,定义了基本的组件,并设计了组件一起工作的机制。更重要的是,研究人员还定义了一系列的抽象,如文件和当前进程(这些抽象对于所有的操作系统都是相同的),并且已经找到了实现这些抽象的有效方式。,我们知道了如何将操作系统的不同组件组织成一个有意义的系统设计与实现。
同早期系统相比,现代操作系统是简洁的、可移植的。设计良好的系统都遵循着将软件分割成一系列基本组件的基本设计模式。因此,现代系统就变得更容易理解和修改,相比早期的系统其处理开销也比较小。
供应商出售的大型商业操作系统通常包括很多额外的软件组件。例如,一个典型的操作系统软件发行版包括编译器、连接器、装载程序、库函数和一系列的应用程序。为了区分这些额外的软件和一个基本的操作系统,我们有时会用内核指代常驻在内存中并且提供诸如并发进程支持等关键性服务的代码。在本书中,操作系统这个术语指的就是内核,而不包括其他附加的功能。一个化内核功能的设计有时称为微内核设计。我们的讨论就将集中在微内核上。2
1.2 本书的研究方法
本书讲解了如何构建、设计并且实现操作系统的内核。书中使用了工程学方法,而不是仅仅罗列操作系统的