操作系统专题实验指导书 .doc_第1页
操作系统专题实验指导书 .doc_第2页
操作系统专题实验指导书 .doc_第3页
操作系统专题实验指导书 .doc_第4页
操作系统专题实验指导书 .doc_第5页
免费预览已结束,剩余70页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操 作 系 统 专 题 实 验 实验指导书 杨麦顺 董骐 电信学院计算机系 2009.2 目 录 实验一 编译内核 .1 1.1 安装 LINUX 操作系统 .1 1.1.1 实验目的.1 1.1.2 实验内容.1 1.1.3 实验步骤.1 1.2 编译 LINUX 内核 .4 1.2.1 实验目的.4 1.2.2 实验内容.5 1.2.3 实验原理.5 1.2.4 实验步骤.5 实验二 系统调用 .1 2.1 实验目的 .1 2.2 实验内容 .1 2.3 实验原理 .1 2.4 实验步骤 .1 实验三 模块编程 .5 3.1 模块编程 .5 3.1.1 实验目的.5 3.1.2 实验内容.5 3.1.3 实验原理.5 3.1.4 实验步骤.5 3.2 PROC 编程 .8 3.2.1 实验目的.8 3.2.2 实验内容.8 3.2.3 实验原理.8 3.2.4 实验步骤.9 实验四 进程通信与调度 .19 4.1 进程通信 .19 4.1.1 实验目的.19 4.2.2 实验内容.19 4.2.3 实验原理.19 4.2.4 实验步骤.19 4.2 进程调度 .22 4.2.1 实验目的.22 4.2.2 实验内容.22 4.2.3 实验原理.22 4.2.4 实验步骤.24 实验五 文件系统 .41 5.1 类 EXT2 文件系统 .41 5.1.1 实验目的.41 5.1.2 实验内容.41 5.1.3 Ext2 文件系统分析.41 5.1.4 设计原理.48 5.1.5 实验步骤.54 5.2 添加一个文件系统 .57 5.2.1 实验目的.57 5.2.2 实验内容.57 5.2.3 实验原理.57 5.2.3 实验步骤.57 参考文献 .62 1 实验一 编译内核 实验内容 z 安装 Linux 操作系统 z 实现对新内核代码的编译并使用 1.1 安装 Linux 操作系统 1.1.1 实验目的 熟悉 Linux 操作系统的安装步骤,建立实验环境。 1.1.2 实验内容 安装 VMwrae 虚拟机,并在其上安装 Linux 操作系统,或在 PC 上已有其它操作系统(如 Windows)的基础上安装 Linux,构成双系统。 1.1.3 实验步骤 在虚拟机下安装 Linux。目前的虚拟机软件主要有那么几种,比较好的是 Wmware 的 VMware Workstation,它对宿主机的仿真性很高,尤其是在显示上比其他虚拟机软件都要好, 另一种是 Virtual PC,这个软件有不同公司的产品,但都大同小异,特点是通用性好,但是 显示技术较差,有时在安装图形桌面时会出现花屏的现象。以下我们以 VMware Workstation 为例,演示如何安装虚拟机下的 Linux。而 Vmware 虚拟机的安装只要按向导提示操作即可。 Linux 有很多发行版,但是如果要安装有 2.4 内核版本的系统,推荐 redhat 9.0。安装时, 默认虚拟机软件已经装好。 Linux 虚拟机安装的主要步骤如下: 步骤一:新建虚拟机。 图 1-1 新建虚拟机 步骤二:虚拟机磁盘应选择 IDE 类型,SCSI 类型会导致内核编译出错。 图 1-2 确定磁盘类型 步骤三:将虚拟机光驱设为 Linux 安装光盘镜像。 图 1-3 选择 Linux 光盘镜像文件 步骤四:启动虚拟机开始安装。 图 1-4 Linux 安装引导 2 步骤五: 建立 Linux 分区,如图 1-5 所示。 图 1-5 建立 Linux 分区 分区中最简单的分区实际就是一个根/分区,和一个 swap 交换分区,但是由于在根/ 中有一个引导分区/boot,这里面有引导系统的很多文件,所以有时侯也会将/boot 单独构成 一个分区。 步骤六:按照提示完成后续安装。注意为了可以选择 RPM 包,最好选择定制安装,以 便给据需要选择安装需要的系统文件。 安装完毕就可以从虚拟机启动新的系统了。 如果安装 2.6 版本的系统,其步骤与上述方法相同。 如果在 PC 上安装双系统,则需要在磁盘上分出至少 6G 的空间。安装内核版本为 2.6 的 Linux 系统,这个分出的空间可以不是主分区,逻辑分区就可以。安装时将系统设为光盘 启动,之后就和以上虚拟机一样进行分区再继续安装,过程是一样的,至于 Linux 的发行版 本目前有很多,如 ubuntu、fedora、SeSu 以及 Redflag 等都可以。 注意:为了使得诸操作系统和虚拟机下的了 Linux 方便地共享文件,还得安装 VMware Tools。VMware 安装完成后,默认 VMware Tools 是没有安装的,启动 Linux 后,在左下方 提示 You do not have VMware Tools installed(没有安装虚拟工具)。下面介绍如何安装安装 VMware Tools。 安装 VMware Tools 其步骤如下: 1)进入 Linux(xwindow 界面); 2)以 root 身份进入 Linux.; 3)按下 CTRL + ALT 组合键,进入主操作系统,点击虚拟菜单下的安装虚拟机工具子菜 单; 3 4)菜单:VM-Install VMware tools.(虚拟机-安装 VMware Tools.); 5)点击弹出的对话框中的Install按钮,确认安装 VMware Tools; 6)鼠标点击 Linux 界面,进入 Linux,Linux 将会自动加载 cdrom 到/mnt,并打开窗口 /mnt/cdrom , 显 示 VMware Tools 的 Linux 软 件 包 的 两 个 文 件 VMwareTools-5.5.3-34685.i386.rpm 和 VMwareTools-5.5.3-34685.i386.tar.gz(其中 5.5.3-34685 为版本号,可能会有所不同)。这两个文件针对两种不同的安装方式,下面以 rpm 文件为例 进行介绍。 7)安装 VMwareTools-5.5.3-34685.i386 可以在命令行方式完成也可以在 Xwindow 完成: a) 命令行方式 x x x 必要的话使用如下命令挂载光驱设备,注意大小写: mount -t iso9660 /dev/cdrom /mnt/cdrom 使用如下命令进入/mnt 文件夹: cd /mnt/cdrom 使用如下命令,直接运行 rpm 包: rpm -ivh VMwareTools-5.5.2-29772.i386.rpm 你将会看到: Preparing. 1:VmwareTools x x x # 100% # 100% 使用如下命令,进入/usr/bin 目录: cd /usr/bin 使用如下命令,查找 vmware-config-tools.pl 文件: ls *.pl 运行 vmware-config-tools.pl 文件: ./ware-config-tools.pl 最后会出现一个界面,让你选择当前屏幕的分辨率.选择一个数字,重新执行一路回车即可。 b) Xwindow 方式 在/mnt/cdrom 窗口,双击 VMwareTools-5.5.3-34685.i386.rpm,打开 VMwareTools-5.5.3-34685.i386.rpm 文件窗口选择安装即可安装此 rpm 包文件。 进入/usr/bin 目录,查找到 vmware-config-tools.pl 文件运行之: ./vware-config-tools.pl 运行过程中一路回车即可。 之后在/mnt 下可以看到已经创建有一个名为 hgfs 的文件夹,该文件夹作为主操作系统 与虚拟机 Linux 共享信息的文件夹,利用它可以实现两者之间的信息共享。 为了实现共享还需要将主操作系统的共享目录纳入到虚拟机中,这个可以在虚拟机菜 单 VMSetting 打开对话框,选择标签 Options 对话框中的 Shared Folders,在右边框中即 可增加主操作系统(Windows)下的共享目录(文件夹),确定后,这里设置的共享文件即 可出现在上面出现的/mnt/hgfs 之下,这样即可实现主操作系统与虚拟机 Linux 的信息共享。 1.2 编译 Linux 内核 1.2.1 实验目的 通过编译 Linux 内核,掌握对内核功能的裁剪,以构造满足自身环境需要的 Linux 内核。 4 1.2.2 实验内容 通过下载新的内核源代码,配置之后再进行编译链接,形成自己所需的内核映像文件, 并予以使用。 1.2.3 实验原理 内核是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网 络系统,决定着系统的性能和稳定性。 Linux 作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订 了旧内核的 bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的 系统度身定制一个更高效、更稳定的内核,就需要重新编译内核。 为了正确、合理地设置内核编译配置选项,从而只编译系统需要的功能代码,一般主要 有下面四个考虑: 1) 2) 3) 4) 自己定制编译的内核运行更快(具有更少的代码); 系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中); 不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞; 将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些。 1.2.4 实验步骤 目前内核版本主要分为 2.4 版本与 2.6 版本,对于它们的内核编译这里将分别予以介绍。 1) 2.4 版本内核的编译 步骤一:将内核代码下载(下载地址网上颇多,这里不再一一列出)至/usr/src 目录下, 并进行解压缩: #cd /usr/src #tar -xvf 下面以 linux 2.4.20-8(RedHeat 9.0)为例说明其编译过程。其中的内核代码在安装 Redhat 时已经完全安装于/usr/src/linux 2.4.20-8。 首先进入内核源码目录: #cd /usr/src/linux2.4 #make mrproper 该命令确保源代码目录下没有不正确的.o 文件以及文件的互相 依赖。如果多次编译内核最好执行此步骤。 步骤二:配置 linux 内核。 #make menuconfig 启动一个菜单模式的配置界面(如图 1-6 所示)。 5 图 1-6 Linux 内核配置主菜单 配置完成后,退出内核配置主菜单,将生成一个.config 文件,作为配置的结果,作 为后起编译的依据。 (现用 Linux 系统配置文件为/boot/config-2.4.20-8 好的,可以将其拷贝到当前目录下, 并命名为.config) 步骤三:开始编译,输入: # make dep #make clean #make bzImage 读取配置过程生成的配置文件(已经产生的配置文件),来创建对应 于配置的依赖关系树, 从而决定哪些需要编译而那些不需要。 完成删除前面步骤留下的一些文件,以避免出现一些错误。 实现完全编译内核。内核编译成功后,会在 /usr/src/Linux-2.4.20-8/arch/i386/boot 目录中生成一个新内核的映像 文件 bzImage (其实也可以#make zImage,只是用#make bzImage 生成的内核大一些)。 步骤四: 开始编译模块,输入: #make modules #make modules_install #make install 设置了可加载模块 所以用此命令生成内核模块。 安装生成的内核模块。 安装编译生成的内核文件。 make install 安装内核文件外,并将引导信息加入/boot/grub/grub.conf 文件: # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # # # # all kernel and initrd paths are relative to /boot/, eg. root (hd0,0) kernel /vmlinuz-version ro root=/dev/hda2 initrd /initrd-version.img #boot=/dev/hda default=1 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz title Red Hat Linux (2.4.20-8custom) root (hd0,0) kernel /vmlinuz-2.4.20-8custom ro root=LABEL=/ initrd /initrd-2.4.20-8custom.img title Red Hat Linux (2.4.20-8) root (hd0,0) kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ initrd /initrd-2.4.20-8.img 其中的黑体加粗部分为新加入的内容。 6 步骤五: 重新启动系统,输入: # reboot 重新启动系统 重启系统后就可以选择启动新编译的内核了,如图 1-7 所示,有custom项的为新的内 核。 2) 图 1-7 GRUB 引导管理 2.6 版本 (以 2.6.17 版本为例)内核的编译 步骤一: 同样将下载的源代码解压至/usr/src(有些版本可以解压至/usr/src/kernel),删 除源代码目录中残留的.o 文件和其它从属文件,如果是第一次编译也可不运行。 这 里 假 设 下 载 的 linux 内 核 文 件 为 Linux-2.6.17.13.tar.bz2 , 并 已 解 压 至 /usr/src/Linux-2.6.17.13(解压命令:tar -xvf linux-2.6.17.13.tar.bz2),输入: #cd /usr/src/Linux-2.6.17.13 #make mrproper 该命令确保源代码目录下没有不正确的.o 文件以及文件的互相依 赖,如果要多次编译内核最好执行此步骤。 步骤二:启动内核配置程序。 这里有以下几种等同的命令,可以任选其一: #make config 基于文本的最为传统的配置界面,不推荐使用 #make menuconfig 基于文本选单的配置界面,字符终端下推荐使用 #make xconfig #make oldconfig 基于图形模式的配置界面,Xwindow 下推荐使用,但需要安装 QT。 如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻 烦。 这里我们用 make menuconfig 命令。 #make menuconfig 其界面如图 1-6 所示。 步骤三:配置内核。 首先,在文件系统中,要选择对 ext3 文件系统的支持。 - 7 File systems- * Ext3 journalling file system support * Ext3 Security Labels * JBD (ext3) debugging support - 其次,要将管理硬盘的 LVM(Logical Volume Manager)的相应特性编译进内核,否则 将无法启动内核。 - * Multiple devices driver support (RAID and LVM) RAID support Linear (append) mode RAID-0 (striping) mode RAID-1 (mirroring) mode RAID-10 (mirrored striping) mode (EXPERIMENTAL) RAID-4/RAID-5 mode Support adding drives to a raid-5 array (experimental) RAID-6 mode Multipath I/O support Device mapper support Crypt target support Snapshot target (EXPERIMENTAL) Mirror target (EXPERIMENTAL) Zero target (EXPERIMENTAL) Multipath target (EXPERIMENTAL) - 最后,鉴于之后要进行模块加载的实验所以需要将模块加载支持的选项选中。 - Loadable module support - * Enable loadable module support * Module unloading Module versioning support (EXPERIMENTAL) * Automatic kernel module loading - 注意在配置中还应加上: Device Drivers - SCSI device support - SCSI disk support Device Drivers - SCSI device support -SCSI low-level drivers -BusLogic SCSI support。 步骤四:编译内核。 #make dep #make clean 读取配置过程生成的配置文件(配置完成后产生的配置文件),以 创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需 要及建立从属文件。 完成删除前面步骤留下的文件,以避免出现一些错误。 8 #make bzImage 内核编译成功后,会在/usr/src/Linux/arch/i386/boot 目录中生成一个 新内核的映像文件 bzImage。 步骤五: 编译可加载模块。 #make modules 设置了可加载模块 所以用此命令生成内核模块 #make modules_install 安装生成的内核模块 编译成功后,系统会在/lib/modules 目录下生成一个 2.6.17.13-x 子目录,其下存放着新 内核的所有可加载模块。 (注:上面几个命令也可以合成一个,make bzImage modules modules_install,经过漫 长的编译,如果不报错终止的话,那么就成功了。或者用 make 命令来替换 make bzImage 与 make modules。) 步骤六:安装编译生成的内核文件 #make install 安装编译生成的内核文件。 步骤七: 重启启动系统,选择新的内核。 #reboot 9 实验二 系统调用 2.1 实验目的 对系统调用添加过程的熟悉,为以后添加更复杂的系统调用奠定基础。 2.2 实验内容 实现一个系统调用,功能为完成一个整数的平方计算(也可自定义系统调用的功能)。 2.3 实验原理 系统调用是应用程序和操作系统内核之间的功能接口。其主要目的使用户可以使用操作 系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方 面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护 系统以及提高资源利用率的作用。 在 Linux 系统中,系统调用是作为一种异常类型实现的。它将执行相应的机器代码指令 来产生异常信号。产生中断或异常的重要效果是系统自动将用户态切换为核心态来对它进行 处理。这就是说,执行系统调用异常指令时,自动地将系统切换为核心态,并安排异常处理 程序的执行。Linux 用来实现系统调用异常的实际指令是: int $0x80 这一指令使用中断/异常向量号 128(即 16 进制的 80)将控制权转移给内核。为达到在 使用系统调用时不必用机器指令编程,在标准的 C 语言库中为每一系统调用提供了一段短 的子程序,完成机器代码的编程工作。事实上,机器代码段非常简短。它所要做的工作只是 将送给系统调用的参数加载到 CPU 寄存器中,接着执行 int $0x80 指令,然后运行系统调用。 系统调用的返回值将送入 CPU 的一个寄存器中,标准库的子程序取得这一返回值,并将它 送回用户程序。为使系统调用的执行成为一项简单的任务,Linux 提供了一组预处理宏,这 些宏指令取一定的参数,然后扩展为调用指定的系统调用的函数,这样就可以在用户程序中 执行这一系统调用。 2.4 实验步骤 由于 2.4 与 2.6 的模块机制有些不同,这里将分别予以介绍。 1) 2.4 版本动态模块的实现 步骤一:决定系统调用的名字 skernel(或是别的名字,可自定)。 在这个文件 include/Linux/unistd.h 中,将_NR_ni_syscall 改为_NR_skernel,内核中系 统调用实现程序的名字:sys_skernel。修改 /usr/src/ Linux-2.4.20-8/include/asm-i386/unitd.h 文 件,定义新的(或者修改已有的)系统调用号,其定义的代码段如下: . #define _NR_lookup_dcookie #define _NR_set_tid_address #define _NR_skernel 253 258 254 其中 254 为自定义的系统调用 skernel 的系统调用号。 步骤二: 添加系统调用源代码。 在/usr/src/Linux-2.4.20-8/kernel/sys.c 中添加代码如下: /my kernel asmlinkage int sys_skernel(int i) int j; j=i*i; renturn j; (注意:这里添加函数名前的 asmlinkage,是提示编译器在获取参数时是从堆栈中提 取而不是寄存器。) 步骤三: 添加入系统调用表。 修改/usr/src/Linux-2.4.20-8/arch/i386/kernel/entry.S 文件,在其中加入如下代码: .long SYMBOL_NAME(sys_lookup_dcokie) .long SYMBOL_NAME(sys_skernel) .long SYMBOL_NAME(sys_ni_syscall)/*255 sys_epoll_ctl*/ 步骤四:编译内核。 编译内核的步骤详见实验一,这里不再赘述。 步骤五:测试自己的系统调用。 为了测试自己添加的系统调用,应该在 C 程序的主函数前添加宏 syscall1(),以对新 添加的系统调用进行调用,其测试代码如下: #include #include #include #define _NR_skernel 254 #define skernel(x)syscall(_NR_skernel,x) main() int x,y; printf(ease input anember!n); scanf(%d,&x); y=skernel(x); if (y=x*x) printf(This is the result of my new kernel!n%d*%d=%dn,x,x,y); else printf(This is something worng!n); 之后在终端下对此 C 程序进行编辑和编译,并予以执行,其具体情况如下: 2 #vi testkernel.c #gcc -o sha testkernel.c #./sha Please input a number! 38 This is the result of my new kernel! 38*38=1444 编辑源程序。 编译所编辑的 C 程序。 运行编译好的程序。 运行程序中的提示信息。 输入的数据。 运行程序中的提示信息。 程序运行的结果。 2) 2.6 版本系统调用的实现 Linux2.6 版本系统调用的实现与 2.4 版本稍有不同,具体步骤如下: 步骤一: 添加源代码。 在/usr/src/Linux-2.6.xx.x/kernel 目录下,打开文件 sys.c,在文件的最后部位可以增加系 统调用函数: asmlinkage int sys_my_syscall() int i = 0; struct task_struct *p; p=&init_task; do printk ( pid = %d , p-pid); printk ( uid = %d , p-uid); printk ( gid = %dn, p-gid); i +; while (p = next_task(p)&( p != &init_task); return i; (注:asmlinkage 的意义和 2.4 版本下一样) 步骤二:修改与系统调用号相关的文件。 编辑入口表文件。 (注意与 2.4 内核的区别:2.4 内核在/usr/src/Linux/arch/i386/kernel/entry.S,而 2.6 内核 的入口文件为 /usr/src/Linux-2.6.xx.x/arch/i386/kernel/syscall_table.S )可将: .long sys_ni_syscall /* reserved for TUX */ .long sys_ni_syscall 换成: .long sys_ni_syscall /* reserved for TUX */ .long sys_my_syscall 步骤三: 修改头文件 unistd.h。 最后需要定义新的系统调用号,但此时需要修改两个不同地方的 unistd.h,分别是: 3 /usr/src/Linux-2.6.x.x/include/asm/ /usr/include/asm/ 它们一个代表了内核代码的头文件,一个代表了标准 C 库的头文件,建议两个文件都 进行修改。 步骤四:编译内核。 编译内核的步骤详见实验一,这里不再赘述。 步骤五: 测试。 #include extern int errno; _syscall0(int,my_syscall) main() my_syscall(); 编译并运行这个用户态程序,并使用 dmesg 命令查看内核的系统日志。如果能够看到 一个列表,显示了进程的 PID 等信息,那么实验就成功了。 4 实验三 模块编程 实验内容 z 内核模块的加载和卸载 z Proc 文件系统的模块化编程 3.1 模块编程 3.1.1 实验目的 熟悉 Linux 下的内核动态模块的添加与卸载。 3.1.2 实验内容 为内核添加一个简单的内核动态模块,并进行测试,之后再予以卸载。 3.1.3 实验原理 编写一个简单的内核动态模块,该模块至少包括两个函数,一个是 init_moudule 函数, 在把模块加载到内核时被调用,它为内核注册一个处理程序,或是用自身的代码取代某个内 核函数;另一个函数是 cleanup_module 函数,在卸载内核模块时被调用,其任务是清除 init_moudule 函数所做的一切操作。编写完

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论