课程设计报告课程名称:操作系统原理院系:计算机科学与技术专业班级:CS140______学号:U201414_____姓名:_________指导教师:_________完成时间:2017年3月11日_I华中科技大学课程设计报告目录1实验目的..............................................................................................22实验环境..............................................................................................23实验内容..............................................................................................23.1实验一...............................................................................................23.2实验二...............................................................................................23.3实验三...............................................................................................33.4实验四...............................................................................................33.5实验五(选做)................................................................................34设计与实现...........................................................................................34.1实验一...............................................................................................34.2实验二...............................................................................................64.3实验三...............................................................................................94.4实验四.............................................................................................115心得体会............................................................................................142华中科技大学课程设计报告1实验目的·掌握Linux操作系统的使用方法;·了解Linux系统内核代码结构;·掌握实例操作系统的实现方法;2实验环境本次课程设计采用的操作系统环境是windows10、Ubuntu双系统,Ubuntu系统版本号为16.04,内核版本号为linux4.4.4;前两个实验在当前Ubuntu环境下完成,后两个实验在win10下虚拟机VirtualBox的Ubuntu15.10(内核为linux4.2.0-42)中完成。3实验内容3.1实验一要求熟悉和理解Linux下的编程环境。(1)编写一个C程序,用fread、fwrite等库函数实现文件拷贝功能。(2)编写一个C程序,使用基于文本的终端图形编程库(curses)或图形界面(QT/GTK),分窗口显示三个并发进程的运行(一个窗口实时显示当前时间,一个窗口实时监测CPU的利用率,一个窗口做1到100的累加求和,刷新周期分别为1秒,2秒和3秒)。3.2实验二要求掌握添加系统调用的方法,采用编译内核方法,添加一个新的系统调用,实现文件拷贝的功能,另外编写一个应用程序,测试新增加的系统调用。3华中科技大学课程设计报告3.3实验三掌握增加设备驱动程序的方法。采用模块方法,添加一个新的字符设备驱动程序,实现打开/关闭,读/写等基本操作。另外编写一个应用程序,测试新添加的驱动程序。3.4实验四要求理解和分析/proc文件。(1)了解/proc文件的特点和使用方法;(2)监控系统状态,显示系统部件的使用状态;(3)用图形界面实现系统监控状态,包括CPU和内存利用率、所有进程信息等(可自己补充、添加其他功能);3.5实验五(选做)要求理解和掌握文件系统的设计方法(选做)。设计、实现一个模拟的文件系统。包括文件/目录创建/删除,目录显示等基本功能(可自行扩充文件读/写、用户登录、权限控制、读写保护等其他功能)。4设计与实现4.1实验一4.1.1实验要求要求熟悉和理解Linux下的编程环境。4.1.2实验设计及调试(1)编写一个C程序,其内容为实现文件拷贝的功能。这个实验的思路是声明两个文件指针*fp_read和*fp_write,前者用来打开要读的文件,后者打开要写的文件,再创建一个1000个字节大小的缓冲区buff[],然4华中科技大学课程设计报告后调用fread将内容从文件1读到buff里,再调用fwrite把内容从buff写到文件2中。这个实验重点要掌握fread和fwrite的使用方法,注意它们的参数和返回值。代码见附件中源码。实验结果如下图4.1:图4.1运行之前图运行./lab1_1text1.txttext2.txt后结果如下图4.2:图4.2运行之后图由上图可见text1.txt成功拷贝至text2.txt(2)编写一个C程序,本次实验使用的是图形界面GTK,分窗口显示三个并发进程的运行(一个窗口实时显示当前时间,一个窗口实时监测CPU的利用率,一个窗口做1到100的累加求和,刷新周期分别为1秒,2秒和3秒)。这个实验要用到gtk,首先要配置gtk,在终端中输入:sudoapt-getinstalllibgtk2.0-dev涉及到3个进程的并发,所以要调用函数fork来创建3个进程。我的思路是在这3个进程中分别创建一个线程,去完成相应的功能:显示当前时间,监测CPU利5华中科技大学课程设计报告用率,做累加求和。分别通过函数voidhavetime()、voidcpu_usage()、voidadd()实现,在main函数里,初步画出3个进程相应的界面。具体的是调用gtk_window_new()函数创建一个窗口、gtk_window_set_title()设置窗口标题、gtk_window_set_position设置窗口在屏幕的位置、gtk_label_new()创建一个标签用来显示文本、gtk_container_add()把标签添加到窗口中、gtk_widget_show_all()来展示需要展示的控件。例如创建第一个线程:g_thread_create((GThreadFunc)havetime,NULL,FALSE,NULL);通过在线程havetime()中实时更新标签label的内容,然后在main()中创建的窗口中展示来完成所要求的功能。进程2和3所要求的功能也是通过这种方法实现。注意用到gtk的编译命令与以往不同,为:gcc-olab1_2lab1_2.c`pkg-config--cflags--libsgtk+-2.0`代码见附件中的源码,实验结果如下图4.3:图4.3运行结果图小插曲:在调用sprintf(s,CPU利用率为%f%%,usage)想把利用率的“%”拷进缓冲区s后打印出来时,一个百分号是不能够打印出来的,要写两个%,如想要打印两个%,则要写4个%,以此类推。6华中科技大学课程设计报告4.2实验二4.2.1实验要求要求掌握添加系统调用的方法,采用编译内核方法,添加一个新的系统调用,实现文件拷贝的功能,另外编写一个应用程序,测试新增加的系统调用。4.2.2实验设计及调试(1)下载一个内核下载linux-4.4.4.tar.gz在/usr/src/目录下解压(用超级用户权限),(2)编写新的系统调用程序用户空间所使用的open、read、write、close函数此时对应内核函数为sys_open、sys_read、sys_write、sys_close。首先通过sys_open()打开源文件和目标文件,分别返回文件描述符source和dest,然后把当前的用户地址范围保存在fs,再把当前内存访问地址范围设置为内核的内存地址访问范围,再通过sys_read()把源文件内容写到buf,再用sys_write()把buf内容写到dest,接着用sys_close()来关闭文件,最后再把内存访问地址范围设置为用户的。保存fs是避免使用的缓冲区超过了用户空间的地址范围而报错。把自己写的这个系统调用程序添加至/usr/src/linux-4.4.4/kernel目录下的sys.c最后。(3)添加系统调用号在/usr/src/linux-4.4.4/arch/x86/entry/syscalls目录下修改syscall_64.tbl文件,添加一个自己的调用程序的系统调用号,我的之前用到了325好,所以添加326号,如下:326commonmysyscallsys_mysyscall(4)添加系统调用程序的声明在/usr/src/linux-4.4.4/include/linux目录下的syscalls.h最后加上自己添加的系统调用7华中科技大学课程设计报告程序的声明如下:asmlinkageintsys_mysyscall(char*sourceFile,char*destFile);(5)编译、安装内核在/usr/src/linux-4.4.4目录下对内核选项进行配置:sudomakemenuconfig图4.4内核配置图选择save后退出接下来就是漫长的编译内核了(4个线程跑会快一些):sudomake-j4大概1个小时左右编译完毕,再安装内核:sudomakemodules_install//安装内核模块sudomakeinstall//安装内核安装完毕后重启,在Ubuntu高级选项中进入新的内核。(6)编写系统调用测试程序#includesys/syscall.h#includeunistd.hintmain(){8华中科技大学课程设计报告syscall(326,text1.txt,text2.txt);return0;}实验结果如下图4.5:图4.5运行之前的图./lab2后如下图:图4.6运行之后的图可见系统调用成功。9华中科技大学课程设计报告4.3实验三4.3.1实验要求掌握增加设备驱动程序的方法。采用模块方法,添加一个新的字符设备驱动程序,实现打开/关闭,读/写等基本操作。另外编写一个应用程序,测试新添加的驱动程序。4.3.2实验设计及调试(1)添加设备驱动原理:linux设备一般分为:字符设备、块设备和网络设备。驱动程序运行在内核空间,应用程序通常通过文件系统接口函数访问/dev目录下的设备文件来访问驱动程序。编写设备驱动程序的