您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 62操作系统实验报告
课程设计报告课程名称:操作系统专业班级:学号:姓名:报告日期:指导老师:计算机科学与技术学院目录1实验一1.1实验内容与要求............................................31.2实验知识准备..............................................31.3算法设计及分析............................................41.3.1文件拷贝..............................................41.3.2分窗口显示三进程......................................51.4实验步骤..................................................51.5源程序及注释..............................................51.6程序测试与结果............................................51.6.1文件拷贝..............................................51.6.1分窗口显示三进程......................................52实验二2.1实验内容与要求............................................62.2实验知识准备..............................................62.3算法设计..................................................72.4实验步骤..................................................72.5程序测试与结果.............................................83实验三添加字符设备驱动3.1实验目的..................................................93.2实验内容..................................................93.3实验知识准备..............................................93.4算法设计.................................................103.5实验步骤.................................................103.6程序测试及结果............................................114实验四linux的proc文件系统4.1实验内容与要求...........................................124.2实验知识准备.............................................124.3算法设计.................................................124.4实验步骤.................................................134.5程序测试及结果............................................135实验体会实验一1.1实验内容与要求掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。A,编一个C程序,其内容为实现文件拷贝的功能;B,编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。实验知识准备1.2.1Linux系统的相关知识Linux文件系统目录结构:/dev:dev是device(设备)的缩写。这个目录下是所有Linux的外部设备,在Linux中设备和文件是用同种方法访问的。例如:/dev/hda代表第一个物理IDE硬盘;/etc:这个目录用来存放系统管理所需要的配置文件和子目录;/lib:这个目录里存放着系统最基本的动态链接共享库,几乎所有的应用程序都须要用到这些共享库;/usr:这是最庞大的目录,我们要用到的应用程序和文件几乎都存放在这个目录下。其中包含以下子目录:/usr/include:Linux下开发和编译应用程序需要的头文件,在这里查找;/usr/lib:存放一些常用的动态链接共享库和静态档案库;/usr/local:这是提供给一般用户的目录,在这里安装软件最适合;/usr/man:帮助文档的存放目录;/usr/src:由rpm安装的Linux开放的源代码就存在这个目录。Linux内核源程序的文件组织核心源程序的文件按树形结构进行组织,简要介绍目录结构如下:arch:arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intelcpu及与之相兼容体系结构的子目录,PC机一般都基于此目录;drivers:放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录,如/block下为块设备驱动程序;include:include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在include/linux子目录下,与intelcpu相关的头文件在include/asm-i386子目录下;init:这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和version.c,这是研究核心如何工作的一个非常好的起点;mm:这个目录包括所有独立于cpu体系结构的内存管理代码,如页式存储管理内存的分配和释放等,而和体系结构相关的内存管理代码则位于arch/*/mm/;kernel:主要的核心代码,此目录下的文件实现了大多数Linux系统的内核函数,其中最重要的文件当属进程调度sched.c,同样,和体系结构相关的代码在arch/*/kernel中。Linux的图形编程:Gtk(具有OO特色的C语言框架)GTK(GIMPToolkit):控件、消息处理器和回调函数;利用控件可以实现一些图形的显示,比如显示窗口等等;消息处理器等待事件的发生(关闭窗口、点击按钮等),并捕获该信号,告诉GTK程序应该调用哪个回调函数进行相应的处理,并在终端中显示结果。编写gtk程序:1初始化Gtk;2建立控件;3登记消息与消息处理函数;4执行消息循环函数gtk_main();只有gtk_main_quit()函数才能停止Gtk+的执行,从而最终退出应用程序。把gtk_main_quit()函数放在某个消息处理函数之中编译和执行gtk程序:程序中用到Gtk+函数或定义的每一部分必须包含gtk/gtk.h文件,此外,还必须连接若干库。gcchello.c-ohello`gtk-config--cflags``gtk-config--libs`反引号(在键盘上位于字符1的左边),chmod-777hello”将hello设定为可执行的文件。1.2.3Linux编程环境函数库:glibc:要构架一个开发环境,glibc是必不可少的,它是Linux下C的主要函数库。编译器:gcc(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器,gcc编译器能将C、C++语言源程序、汇编程序和目标程序编译、连接成可执行文件.系统头文件:glibc_header,缺少了系统头文件,就会无法编译C源程序其他软件:vi,rpm,tar,binutils,make算法设计及分析1.3.1文件拷贝设计思路:A,用open函数打开源文件,并做出错处理;B,用open函数以创建的方式打开目的文件,并作出错处理;C,用read函数循环从源文件中读出BUFFER_SIZE个字节的字符,wirte函数写入目的文件,至文件全部写完;D,关闭源文件和目的文件。分窗口显示三进程软件实现:用gtk实现图形界面。设计思路:main函数中,用fork创建子进程和父进程,子进程实现./time可执行文件,父进程再次调用fork创建二个进程。再为每个进程设计一个弹框1.4实验步骤这个实验比较简单,首先编写源程序,后编译,再执行。需要注意的是,显示三个进程的实验编译时,使用的命令为:假设源程序名为“col.c”gcc`pkg-config--cflags--libsgtk+-2.0`col.c-ocol而且首先分别编译好三个子程序,再编译main程序,最后运行main可执行文件。这里因为使用了gtk,故编译的命令和以前直接编译有所不同。1.5源程序及注释见电子档1.6程序测试及结果实验二2.1实验内容与要求掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,调用新增加的系统调用。(1)实现的功能是:文件拷贝;(2)实现的功能是:P、V操作。实验知识准备2.2.1系统调用Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。关键字:系统调用核心态操作系统核心提供普通的函数调用用户态函数库或用户自己提供很多已经被我们习以为常的C语言标准函数,在Linux平台上的实现都是靠系统调用完成的,如open(),close(),malloc(),fork().2.2.2系统调用工作原理用户权限不能访问内核所占内存空间,也不能调用内核函数。进程调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。在IntelCPU中,这个由中断INT0x80实现。(与DOS功能调用int0x21很相似)跳转到的内核位置叫做sysem_call。检查系统调用号,这个号码代表进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程(或到其他进程,如果这个进程时间用尽)。系统调用号表示数组sys_call_table[]中的位置。文件../Arch/i386/kernel/entry.S中:Entry(system_call_table)3.2.3如何使用系统调用#includelinux/unistd.h/*定义宏_syscall1*/#includetime.h/*定义类型time_t*/_syscall1(time_t,time,time_t*,tloc)/*宏,展开后得到time()函数的原型*/main(){time_tthe_time;the_time=time((time_t*)0);/*调用time系统调用*/printf(Thetimeis%ld\n,the_time);}标准的系统调用的形式,宏_syscall1()展开来得到一个函数原型;time.h中已经用库函数的形式实现了time这个系统调用,省掉了调用_syscall1宏,大多数系统调用都在各种C语言函数库中有所实现,一般情况下,都调用普通的库函数syscall函数原型为:其中number是系统调用号,number后面应顺序接上该系统调用的所有参数。mm_segment_told_fs=get_fs()set_fs(KERNEL_DS)2.2.4与系统调用相关的内核代码文件(2.6内核)/usr/src/linux/include/asm-i386/unistd.h系统调用清单(为每个系统调用分配唯一号码)/usr/src/linux/arch/i386/kernel/entry.S包含系统调用和异常的底层处理程序、信号量的识别程序ret_from_sys_c
本文标题:62操作系统实验报告
链接地址:https://www.777doc.com/doc-3111064 .html