掌握linux操作系统的使用方法;
了解linux系统内核**结构;
掌握实例操作系统的实现方法;
本次课程设计采用的操作系统环境是windows10、ubuntu双系统,ubuntu系统版本号为16.04,内核版本号为linux 4.4.
4;前两个实验在当前ubuntu环境下完成,后两个实验在win10下虚拟机virtualbox的ubuntu 15.10(内核为linux4.2.
0-42) 中完成。
要求熟悉和理解linux下的编程环境。
1)编写一个c程序,用fread、fwrite等库函数实现文件拷贝功能。
2)编写一个c程序,使用基于文本的终端图形编程库(curses)或图形界面(qt/gtk),分窗口显示三个并发进程的运行(一个窗口实时显示当前时间,一个窗口实时监测cpu的利用率,一个窗口做1到100的累加求和,刷新周期分别为1秒,2秒和3秒)。
要求掌握添加系统调用的方法,采用编译内核方法,添加一个新的系统调用,实现文件拷贝的功能,另外编写一个应用程序,测试新增加的系统调用。
掌握增加设备驱动程序的方法。采用模块方法,添加一个新的字符设备驱动程序,实现打开/关闭,读/写等基本操作。另外编写一个应用程序,测试新添加的驱动程序。
要求理解和分析/proc文件。
1)了解/proc文件的特点和使用方法;
2)监控系统状态,显示系统部件的使用状态;
3)用图形界面实现系统监控状态,包括cpu和内存利用率、所有进程信息等(可自己补充、添加其他功能);
要求理解和掌握文件系统的设计方法(选做)。
设计、实现一个模拟的文件系统。包括文件/目录创建/删除,目录显示等基本功能(可自行扩充文件读/写、用户登录、权限控制、读写保护等其他功能)。
要求熟悉和理解linux下的编程环境。
1)编写一个c程序,其内容为实现文件拷贝的功能。
这个实验的思路是声明两个文件指针*fp_read和*fp_write,前者用来打开要读的文件,后者打开要写的文件,再创建一个1000个字节大小的缓冲区buff,然后调用fread将内容从文件1读到buff里,再调用fwrite把内容从buff写到文件2中。这个实验重点要掌握fread和fwrite的使用方法,注意它们的参数和返回值。**见附件中源码。
实验结果如下图4.1:
图4.1 运行之前图。
运行。/lab1_1 后结果如下图4.2:
图4.2 运行之后图。
由上图可见成功拷贝至。
2)编写一个c程序,本次实验使用的是图形界面gtk,分窗口显示三个并发进程的运行(一个窗口实时显示当前时间,一个窗口实时监测cpu的利用率,一个窗口做1到100的累加求和,刷新周期分别为1秒,2秒和3秒)。
这个实验要用到gtk,首先要配置gtk,在终端中输入:
sudo apt-get install libgtk2.0-dev
涉及到3个进程的并发,所以要调用函数fork来创建3个进程。我的思路是在这3个进程中分别创建一个线程,去完成相应的功能:显示当前时间,监测cpu利用率,做累加求和。
分别通过函数void h**etime()、void cpu_usage()、void add()实现,在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)h**etime, null, false, null);
通过**程h**etime()中实时更新标签label的内容,然后在main()中创建的窗口中展示来完成所要求的功能。进程2和3所要求的功能也是通过这种方法实现。注意用到gtk的编译命令与以往不同,为:
gcc -o lab1_2 lab1_ `pkg-config --cflags --libs gtk+-2.0`
**见附件中的源码,实验结果如下图4.3:
图4.3 运行结果图。
小插曲:在调用sprintf(s,"cpu利用率为%f%% usage)想把利用率的“%”拷进缓冲区s后打印出来时,一个百分号是不能够打印出来的,要写两个%,如想要打印两个%,则要写4个%,以此类推。
要求掌握添加系统调用的方法,采用编译内核方法,添加一个新的系统调用,实现文件拷贝的功能,另外编写一个应用程序,测试新增加的系统调用。
1) **一个内核。
**。在 /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目录下的最后。
3) 添加系统调用号。
在 /usr/src/linux-4.4.4/arch/x86/entry/syscalls目录下修改 syscall_ 文件,添加一个自己的调用程序的系统调用号,我的之前用到了325好,所以添加326号,如下:
326 common mysyscall sys_mysyscall
4) 添加系统调用程序的声明。
在/usr/src/linux-4.4.4/include/linux 目录下的最后加上自己添加的系统调用程序的声明如下:
asmlinkage int sys_mysyscall(char* sourcefile,char* destfile);
5) 编译、安装内核。
在 /usr/src/linux-4.4.4 目录下对内核选项进行配置:
sudo make menuconfig
图4.4 内核配置图。
选择s**e后退出。
接下来就是漫长的编译内核了(4个线程跑会快一些):
sudo make -j 4
大概1个小时左右编译完毕,再安装内核:
sudo make modules_install //安装内核模块。
sudo make install //安装内核。
安装完毕后重启,在ubuntu高级选项中进入新的内核。
6) 编写系统调用测试程序。
#include
#include <>
int main(){
syscall(326,""
return 0;
实验结果如下图4.5:
图4.5 运行之前的图。
/lab2 后如下图:
图4.6 运行之后的图。
可见系统调用成功。
掌握增加设备驱动程序的方法。采用模块方法,添加一个新的字符设备驱动程序,实现打开/关闭,读/写等基本操作。另外编写一个应用程序,测试新添加的驱动程序。
1)添加设备驱动原理:linux设备一般分为:字符设备、块设备和网络设备。
驱动程序运行在内核空间,应用程序通常通过文件系统接口函数访问/dev目录下的设备文件来访问驱动程序。编写设备驱动程序的主要工作就是编写file_operations子函数,这次实验主要完成的就是file-operations数据结构中的。open\.
release\.read\.write4个模块,file_operations结构的每个域都对应一个系统调用。
用户进程利用系统调用在对设备文件进行诸如read/write等操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取该数据结构相应的函数指针,接着把控制权交给该函数。
《操作系统原理》课程设计报告
姓名。学号。指导老师。起始时间 2010年3月4日。起止时间 2010年6月 22 日。为了提高同学们的自学能力,老师决定给予一项我们没有接触过的课程设计,也是我们很不熟悉,但是在it界却是很重要的一门技艺,我觉得老师的目的就是为了锻炼我们的自学力,而不是课程设计的能力,课程设计的能力是通过自学能力...
《操作系统原理》课程设计报告
操作系统原理 课程设计报告书。题目 进程控制模块的设计与实现。专业 网络工程 学号 131007111 学生姓名 李亚豪。指导教师 刘双红。完成日期 2015 12 05 第1章课题概述 3 1.1 设计要求 3 1.2 设计理论依据 3 第2章设计简介和内容 6 2.1 设计简介 6 2.2 设计...
操作系统原理课程设计
操作系统原理 课程设计。课题名称 进程调度算法。姓名 班级 学号 课程设计起止时间 2005年1月2日 2005年1月7日。指导教师成绩 课程设计任务书。进程调度算法。一 设计说明。该程序实现了进程的创建,且对该进程队列进行动态优先权抢占式和时间片轮转算法的调度。二 详细设计。1.流程图。2.程序运...