操作系统课程设计实验大纲
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《操作系统课程设计》实验指导手册
苏州大学计算机科学与技术学院
2009年9月
《操作系统课程设计》实验指导手册目录
目录
一、实验环境
二、实验内容
三、准备知识
四、实验步骤
实验一安装Red Hat Linux
实验二编译Linux内核
实验三观察Linux行为
实验四系统调用
一、实验环境
硬件平台:普通PC机硬件环境。
操作系统:Linux环境,Red Hat Linux 9.0以上版本,启动管理器使用LILO。
编译环境:伴随着操作系统的默认gcc环境。
工作源码环境:一个调试的内核源码,版本不低于2.4.18。
二、实验内容
本实验侧重于Linux操作系统的认识、应用,并对Linux内核进行初步探索。实验分为四个部分,每个部分大约2次实验。所有实验完成后,将在计算机上安装一个可用的Linux操作系统,并完成至少一个的可调试内核。
1.安装Red Hat Linux
2.编译Linux内核
3.观察Linux行为
4.系统调用
三、准备知识
1.Linux的内核
Unix操作系统家族将功能分为两类。首先,内核执行时CPU处于管态;其次,所有其他操作系统部件执行时CPU处于用户态。内核负责抽象与管理一台机器的硬件资源以及这些资源在执行程序之间的共享。因为Linux实现的是一种UNIX方式的接口,资源抽象和共享模型的通用定义已经被确定了。
资源抽象(Resource abstraction)是指编写软件(通常情况)来简化必须应用于硬件的操作以使该硬件能恰当的工作。Linux将计算机部件抽象为进程和资源。一个进程是执行一个目标程序的CPU操作的一个抽象。进程抽象使得操作系统能够控制一个程序中的每个实例的执行。操作系统中的所有执行进程抽象的所有方面称为进程管理。资源管理是创建资源抽象以及在进程执行时为它们分配和回收系统资源的过程。RAM是一种系统资源。另一种系统资源是CPU。内核的其他资源包括系统的所有设备,它们具有各自的抽象模型。UNIX 试图将除CPU和可执行内存之外的每一种资源视为一个文件。
Linux中,一个进程使用资源时,通常需要对该资源的独占使用。资源管理有两个关键的方面:对获得资源的竞争和对独占使用的确保。对资源的竞争由资源管理程序控制。操作系统必须包含一个部件来负责接收使用每个资源的请求、为一个进程分配资源,以及当一个进程释放资源时进行回收。如不能满足进程的资源请求,则阻塞该进程。Linux和其他现代操作系统用模式位来确保对系统资源,包括CPU、内存和设备的独占使用。模式位使系统可以工作在管态(supervisor mode)或用户态(user mode)。在一些情况下,两个或更多进程需要共享一个资源,Linux采用有控制的共享策略。
2.内核的组织结构
Linux内核被设计和实现为单内核。硬件设备日益发展,不断包括更新的设备,完全在一个设备驱动程序中提供适当的内核支持变得日益困难。Linux通过一个新的“容器”,称为模块(module),来解决这个问题,在模块中执行内核主要部分的扩展。
2.1 Linux的中断机制
同i386体系结构中的中断机制,使用cli()和sti()两个内核函数来清除和设置中断启用标志。
2.2 使用Linux的内核服务
用户将内核看作一个大的抽象数据类型(ADT),它保持状态并在其公共接口——系统调用接口上提供大量函数。在Linux中,系统调用接口名义上由POSIX.1规范定义。一个系统调用发生时,用户进程执行内核代码。存在一个问题,如何由用户进程(处在用户态)切换到内核代码(处在管态)?
具有模式位的CPU通常也具有硬件陷阱指令。陷阱指令(trap instruction)是一条用于将CPU转移到一个预定地址(有时作为一个指令操作数的函数)并将其自身切换为管态的指令。陷阱指令并不是一条特权指令,因此任何程序都可以执行一条陷阱指令。对于系统调用F,stub过程用于调用F。stub被链接到用户空间正调用的程序。一个进程在运行期间执行对F的调用,控制被转换到stub过程而不是直接转换到内核。利用陷阱指令和stub过程可以实现由用户空间向内核空间的安全转换。
2.3 串行执行
Linux的内核函数执行时处在一个临界区,即,一旦进程调用一个系统函数,该函数通
常要运行到结束并在CPU分配给不同的进程之前返回,但是中断除外。这种类型的内核是单线程(single-threaded)的,因为在任何时刻(忽略ISR)在内核中只允许一个执行线程在执行。这至少有两个重要的意义:
1.一个内核函数可以更新各种内核数据结构而不用担心另一个进程会中断它的执行并改变相同的数据结构。竞争状态不会发生。
2.在编写一个新的内核函数时,始终注意不能编写可能阻塞并等待消息或其他只有某些另外的进程才能释放的资源的代码。这类代码可能在内核中导致死锁。
2.4 守护进程
当一台Linux机器启动时,几个称作守护进程(daemon)的对用户透明的进程也被启动,并且它们的存在对操作系统的正确运行是必需的。习惯上,守护进程是执行名字以字符―d‖结尾的程序。通过在shell里敲入以下命令来观察哪些守护进程正在Linux机器上运行:
ps aux | more
典型情况下,将发现syslogd、klogd、crond和lpd在系统上运行。
2.5 引导过程
一台i386计算机可以通过一张引导记录包含Linux引导程序而不是Windows操作系统引导程序的Linux引导盘来引导Linux。对于一个分区的硬盘来说,装载处于不同分区的不同操作系统是可能的。Windows操作系统可以通过标识一个分区为活动分区来处理多分区磁盘,系统总是从活动分区引导。Linux提供一个可以存放在系统引导记录中的特殊Linux装载程序(LILO)使用户在引导时可以选择活动分区。在这种情况下,LILO将会被载入到引导记录中以使BIOS在POST之后运行它。
在POST之后,引导记录已经被读取,并且装载程序已经将操作系统放入主存,引导过程开始运行内核代码以初始化计算机硬件。计算机通过设置CPU为管态并转移到在内核中的主入口点准备启动内核。内核初始化陷阱列表、中断处理程序、调度程序等,并初始化管理程序。然后硬件进程创建初始进程(initial process)。初始进程创建第一个有用的Linux 进程来运行init程序并开始执行一个空闲周期。在内核初始化完成以后,初始进程的唯一职责就是使用空闲CPU时间。也就是说,当没有其他进程想要使用CPU时它将占用CPU。初始进程有时也称为空闲进程(idle process)。
2.6 登录到机器
在初始化时,内核在每个可以用于支持用户登录的通信端口创建一个进程。这些进程将运行getty程序的一个拷贝。getty进程初始化自身后等待用户使用这个端口。当用户开始使用该端口时,getty运行login程序,期望一个用户标识出现在第1行并且一个口令出现在第2行。一旦端口的login程序得到了标识和口令,它通过系统的/etc/passwd文件确认用户的身份。如果本次验证成功,那么login进程改变当前目录到用户主目录并执行指定的shell 程序以便用户通过shell直接与login进程进行交互。一个登录到UNIX机器的用户只是使用一个在机器启动时创建的进程。因此用户进程通过该shell数据段和堆栈段的唯一拷贝执行一个shell程序。
3.进程与资源管理
进程管理程序负责创建程序员使用的进程抽象并提供措施以便一个进程可以创建、销毁、同步和保护其他进程。类似的,资源管理程序涉及创建合适的抽象来代表一个进程可能请求的实体(并在资源不可得时阻塞它们的执行)。除抽象外,资源管理程序必须提供一个进程用来请求、获得和释放资源的接口。