当前位置:首页 > 华科操作系统实验报告(DOC)
华 中 科 技 大 学 课 程 设 计 报 告
图3 执行1后文件b中的内容
同时,源程序还可以实现图片等字符流数据的拷贝。
2) 编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到
Linux下的图形库。
① 任务分析:程序是指令的有序集合,是一个静态概念,其本身并没有任何运行的含义。而进程是程序在处理机上的一次执行过程,是一个动态概念。一个程序可能有许多进程,而每一个进程又可以有许多子进程。为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我 们的身份证)以便识别。 为了充分的利用资源,系统还对进程区分了不同的状态,将进程分为新建、运行、阻塞、就绪和完成五个状态。当一个进程调用了fork以后,系统会创建一个子进程。这个子进程和父进程不同的地方只有他的进程ID和父进程ID,其他的都是一样,就像父进程克隆(clone)自己一样。当然创建两个一模一样的进程是没有意义的。为了区分父进程和子进程,我们必
华 中 科 技 大 学 课 程 设 计 报 告
须跟踪fork的返回值, 当fork调用失败的时候(内存不足或者是用户的最大进程数已到)fork返回-1。否则fork的返回值有重要的作用。对于父进程fork返回子进程的ID,而对于fork子进程返回0。我们可以根据这个返回值来区分父子进程。
Qt是一个跨平台的C++图形用户界面库,具有优良的跨平台特性:
1) Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, Linux,
Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。 2) 面向对象
3) Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开
发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单。 4) 丰富的 API
5) Qt 包括多达 250 个以上的 C++ 类,还提供基于模板的 collections,
serialization, file, I/O device, directory management, date/time 类。甚至还包括正则表达式的处理 功能。 6) 支持 2D/3D 图形渲染,支持 OpenGL 7) 大量的开发文档 8) XML 支持。
在编译qt程序时,需要用到与编译普通程序不同的命令。比如程序名为hello,则编译过程为: 用qt的工具qmake来生成工程文件:qmake -project;生成Makefile文件:qmake hello.pro;接下来就是make;运行程序./hello。
② 程序源代码为: int main(int argc, char *argv[]) {
QApplication a(argc, argv); MainWindow w; w.show();
华 中 科 技 大 学 课 程 设 计 报 告
pid_t p1,p2,p3; if ((p1=fork()) == 0) {
execv(\ }
else if ((p2=fork())==0) {
execv(\ }
return a.exec(); }
二、 掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,调用新增加的系统调用(实现的功能为文件拷贝)。
① 任务分析:一般的,进程是不能访问内核的。它不能访问内核所占内存空间也不能调用内核函数。CPU硬件决定了这些(这就是为什么它被称作\保护模式\)。系统调用是这些规则的一个例外。其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。在Intel CPU中,这个由中断0x80实现。硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统内核。 进程可以跳转到的内核位置叫做sysem_call。这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程(或到其他进程,如果这个进程时间用尽)。
系统调用是应用程序和操作系统内核之间的功能接口,通过系统调用进程可
华 中 科 技 大 学 课 程 设 计 报 告
由用户模式转入内核模式。在内核模式下完成相应的服务之后再返回到用户模式。系统调用的主要目的是使得用户可以使用操作系统提供的有关设备管理、输入输出系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及提高资源利用率的作用。
本次课设,我通过编译内核的方式,增加了一个系统调用,其功能为文件拷贝。
② 添加的系统调用源代码和测试程序
系统调用源代码
asmlinkage int sys_mycall(char* sourceFile,char* destFile) {
int source=sys_open(sourceFile,O_RDONLY,0);
int dest=sys_open(destFile,O_WRONLY|O_CREAT|O_TRUNC,0600); char buf[4096]; mm_segment_t fs; fs = get_fs(); set_fs(get_ds()); int i;
if(source>0 && dest>0) { do {
i=sys_read(source,buf,4096); sys_write(dest,buf,i); } while(i); } else
共分享92篇相关文档