操作系统课程设计报告
- 格式:docx
- 大小:2.66 MB
- 文档页数:39
课程实验报告课程名称:操作系统课程设计专业班级:计算机科学与技术1003班学号:姓名:鲁辰指导教师:报告日期:2013.03.24计算机科学与技术学院目录1 课程设计目的 (3)2 课程设计内容 (3)2.1 课程设计题目 (3)2.1.1题目1:C语言、GTK编程 (3)2.1.2 题目2 (3)2.1.3 题目3 (3)2.1.4 题目4 (3)2.1.5 题目5 (4)3 课程设计过程 (4)3.1 系统的安装与配置 (4)3.1.1系统的安装 (4)3.1.2 系统的配置 (4)3.2 题目一:C语言编程与GTK编程 (4)3.2.1 实现文件拷贝 (4)3.2.2 GTK三个并发进程 (6)3.3 题目二:Linux内核编译 (7)3.3.1 下载、解压Linux内核 (7)3.3.2增加系统调用 (7)3.3.3 编译内核 (9)3.4 题目三:增加Linux系统功能调用 (12)3.4.1 关于Linux内核模块和设备驱动程序 (12)3.4.2实现步骤 (12)3.5 题目四:应用/proc设计任务管理器 (16)3.5.1 分模块设计 (16)3.5.2 程序的实现 (17)3.5.3 功能演示 (23)4 课程设计体会 (25)5 参考文献 (25)附录:第四题源代码 (26)1 课程设计目的掌握Linux操作系统的使用方法;了解Linux系统内核代码结构;掌握实例操作系统的实现方法。
2 课程设计内容2.1 课程设计题目2.1.1题目1:C语言、GTK编程掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。
编一个C程序,其内容为实现文件拷贝的功能;编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。
要求用到Linux下的图形库。
gtk/qt2.1.2 题目2掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。
另编写一个应用程序,调用新增加的系统调用。
实现的功能是:文件拷贝;2.1.3 题目3掌握增加设备驱动程序的方法。
通过模块方法,增加一个新的设备驱动程序,其功能可以简单。
实现字符设备的驱动2.1.4 题目4了解和掌握/proc文件系统的特点和使用方法(选做)了解/proc文件的特点和使用方法监控系统状态,显示系统中若干部件使用情况用图形界面实现系统监控状态。
2.1.5 题目5设计并实现一个模拟的文件系统(选做)多用户的多级目录的文件系统设计。
多用户、多级目录、login (用户登录)、系统初始化(建文件卷、提供登录模块)、文件的创建、文件的打开、文件的读、文件的写、文件关闭、删除文件、创建目录(建立子目录)、改变当前目录、列出文件目录、退出3 课程设计过程3.1 系统的安装与配置3.1.1系统的安装虽然课程设计的PPT推荐使用VMware虚拟机,但是经过尝试,虚拟机上的Ubuntu操作系统速度太慢,所以选择了直接将Ubuntu安装在本机上的方式,使用这样的方式速度更快,特别是在编译内核的时候,在虚拟机上需要3小时以上,而在本机的Linux系统上编译内核只需要30~40分钟。
系统:Ubuntu-10.04.4-desktop-i386安装方法:1)将Ubuntu的ISO文件载入虚拟光驱2)打开虚拟光驱,选择相应的安装文件进行安装3)安装后,重启,在开机时选择进入Ubuntu即可3.1.2 系统的配置配置root用户:1)执行指令:sudo passwd root 然后设置密码2)注销当前用户,使用root用户登录3.2 题目一:C语言编程与GTK编程3.2.1 实现文件拷贝1)编写源代码:3.2.2 GTK三个并发进程1)下载GTK图3. 1 第一题运行结果3.3 题目二:Linux内核编译3.3.1 下载、解压Linux内核kernel的下载网站:https:///从上述网站上下载内核linux2.6.34.14并在ubuntu中进行解压,解压时直接点击右键选择解压,然后再拷贝到/usr/src目录。
3.3.2增加系统调用系统调用工作原理:不能访问内核所占内存空间也不能调用内核函数。
进程调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。
在Intel CPU中,这个由中断INT0x80实现。
(与DOS功能调用int0x21很相似)跳转到的内核位置叫做sysem_call。
检查系统调用号,这个号码代表进程请求哪种服务。
然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。
接着,就调用函数,等返回后,做一些系统检查,最后返回到进程(或到其他进程,如果这个进程时间用尽)。
系统调用号表示数组sys_call_table[]中的位置。
文件../Arch/i386/kernel/entry.S中:Entry(system_call_table)增加系统调用的实现:要添加一个文件拷贝的系统调用需要如下的步骤:1)对/usr/src/linux-2.6.37.4/kernel/sys.c进行修改,添加实现文件拷贝功能的源代码:添加的源代码如下:图3. 2 修改sys.c图3. 3 修改unistd_32.h在系统调用号的末尾增加: #define __NR_sys_mycall 338 即添加第338号系统调用,调用的函数名称为:sys_mycall 并将系统调用的总数改为3393)修改系统调用表/usr/src/linux-2.6.32.10/arch/x86/kernel/syscall_table_32.S图3. 4 修改syscall_table_32.s在最后一行添加: .long sys_mycall4)修改系统版本号,以免混淆 3.3.3 编译内核 内核编译步骤:图3. 5 修改 makefilemenuconfig图3. 7 安装ncurse 的选择-j4个任务这样编译的过更快。
图3. 8 make menuconfig执行指令图3. 9 make modules_install安装内核时发图3. 10 make install目录下文件,所以安装内核无法成功。
o图3. 11 拷贝对应的.img文件到/lib/boot入内核,进入终端,使用指令查看当前系统图3. 12 查看内核版本编写测试成图3. 13 测试程序3.4 题目三:增加Linux 系统功能调用3.4.1 关于Linux 内核模块和设备驱动程序 参考书: 《 Linux Device Drvier 2 》 《 Linux 内核编程 》Linux 核心是一种monolithic 类型的内核,即单一的大核心另外一种形式是MicroKernel ,核心的所有功能部件都被拆成独立部分,这些部分之间通过严格的通讯机制进行联系。
linux 内核是一个整体结构,因此向内核添加任何东西.或者删除某些功能 ,都十分困难 。
为了解决这个问题,引入了模块机制,从而可以动态的在内核中添加或者删除模块。
模块一旦被插入内核,他就和内核其 他部分一样。
3.4.2实现步骤 1)编写源代码2)编译驱动程序拷贝到/usr/src/linux-2.6.34.14/drive图3. 14 Mydev.c的拷贝/usr/src/linux-2.6.34.14/ 最图3. 15 修改makefileC /usr/src/图3. 16 编译内核模块加载内核中的模块,使用指图3. 17 加载内核模块创建新的虚拟设备文件,使mknod /dev/mydev 通过查表找到设备文件号cat 找到系统分配 后面是设备驱动源代码中定义的设图3. 18 创建虚拟设备文件图3. 19 找到驱动设备通过运行程序,测试新的设图3. 20 运行测试程序3)测试程序的源代码:3.5 题目四:应用/proc 设计任务管理器3.5.1 分模块设计为了实现系统任务管理器System Mointer ,首先将待实现的功能模块分为6个不同的部分,分别为:Process Info(查找进程信息)、CPU Ratio(CPU 使用率)、MM Ratio(内存使用率)、System Info(系统基本信息)、New Process(创建新的进程)、Shut Down(关机)几个功能部分。
下面详细描述这几个模块:图3. 21 SystemMonitor 主界面按钮后,会弹出一个新的窗口,界面如图所示。
在文本框中输入所按钮,即弹出右、进程名称、进程为当前文图3. 22 查找进程信息按钮后,弹出窗口如的使用的历史曲图3. 23 查看CPU 使用率按钮后,弹出窗口如右图所示。
在窗口中显示内存的使用的历史曲图3. 24 查看内存使用率弹出窗口如系统启动的系统图3. 25 查看系统的基本信息按钮后,弹出窗口如右图所示。
在文本框中输入程序的位置名称,图3. 26 运行新的程序3.5.2 程序的实现通过上述总结,对功能的需求有了一个全面的了解,为了实现上述功能,将需要做的工作分成以下几步:1)界面基本控件的使用 2)查找/proc 信息的函数 3)利用/proc 返回的信息计算CPU 、MM 使用率的函数、画图在程序设计之前,先解决编译器和调试程序的问题。
在下载了gtk 后,使用code blocks 即可进行程序的编译和调试,比使用gcc 和gdb 更为方便。
界面的实现:通过模块的设计,总结出所需要的控件主要有窗口、按钮、显示文本框、输入文本框、列表。
查找资料,找到实现这4个控件的方法。
以下程序在一个窗口中分别实现了按钮、显示文本框、输入文本框:纳为以下几步:1)定义GtkWidget型指针2)调用函数新建控件3)控件内容、位置、类型的设置4)显示控件列表的实现:在查找进程的信息时使用了gtk的table控件,下面的例子是关于列表控件实现的。
void select_row_callback(GtkWidget *clist,gint row,gint column,GdkEventButton *event,gpointer data);图3. 28 基本界面2查找和处理/proc信息:CPU、MM使用率:CPU的不一样之外,其他部分基本相同,不再赘述。
3.5.3 功能演示查找进程信息并杀死进程:图3. 29 功能演示--查找杀死进程图3. 30 功能演示--查找杀死进程2 运行一个新的程序:图3. 31 功能演示--运行一个新的程序图3. 32 功能演示--运行一个新的程序2其他的功能在前面的模块设计部分已经基本讲清,不再赘述。
4 课程设计体会在本次的课程设计中,我有很多收获。
首先,通过做题目,我对Linux系统即内核编译有了更深入的了解,并熟悉了GTK的程序设计。