操作系统课程设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

操作系统课程设计一.目的掌握Linux操作系统的使用方法;了解Linux系统内核代码结构;掌握实例操作系统的实现方法。二.设计内容1.掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。编一个C程序,其内容为实现文件拷贝的功能(使用系统调用open/read/write...);编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。(gtk/Qt)2.掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,使用新增加的系统调用。(1)内核编译、生成,用新内核启动;(2)新增系统调用实现:文件拷贝或P、V操作。3.掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱动程序,其功能可以简单。实现字符设备的驱动4.使用GTK/QT实现系统监控器(1)了解/proc文件的特点和使用方法;(2)监控系统状态,显示系统中若干部件使用情况;(3)用图形界面实现系统监控状态。5.设计并实现一个模拟的文件系统(1)基于一大文件(10M或100M),模拟磁盘;(2)格式化,建立文件系统管理数据结构;(2)基本操作,实现文件、目录相关操作。三.设计说明1.实验环境windows+虚拟机linux或单独Linux分区linux系统版本Fedora5.06.0ubuntu9.010.0414.04...内核版本linux-2.6Linux-2.31...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内核源代码的文件组织Linux核心源代码位于编号约定:任何偶数的核心(例如2.4.7)都是一个稳定的发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心。核心源程序的文件按树形结构进行组织,简要介绍目录结构如下: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中。2.Linux编程环境1、函数库glibc:要构架一个开发环境,glibc是必不可少的,它是Linux下C的主要函数库。2、编译器gcc(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器,gcc编译器能将C、C++语言源程序、汇编程序和目标程序编译、连接成可执行文件.3、系统头文件glibc_header缺少了系统头文件,就会无法编译C源程序4、其他软件:vi,rpm,tar,binutils,make5、开发环境相关软件包的下载程序调试gdbgcc–gFedora软件包管理:system-config-packgesUbuntu软件包管理$sudoapt-getinstallpackage$apt-getinstalllibncurses5-devLinux的图形编程X-Window已经成为了Unix/Linux图形界面的标准。MIT1984X-Window分为三个层次:1)X-SERVER,与显卡相关的中间层服务程序用来控制实际的显示设备和输入设备(键盘和鼠标或其他输入设备)根据客户程序请求建立窗口、在窗口中画图形、图像和文字;2)X-Window底层库,是最低实现层(XLib);3)窗口管理器,实现最终用户界面:最常见的是KDE(KDesktopEnvironment)和GNOME(GNUNetworkObjectModelEnvironment)。X-Window基于一种客户机/服务器的思想。应用程序可以使用底层的XlibAPI、也可以使用高级一些的QT、GTK+等图形用户界面库。gtk语言框架qtC++图形用户界面库跨平台面向对象,模块化程度非常高,可重用性较好有丰富的API和控件支持2D/3D图形渲染,支持OpenGL编写gtk程序1初始化Gtk2建立控件3登记消息与消息处理函数4执行消息循环函数gtk_main()只有gtk_main_quit()函数才能停止Gtk+的执行,从而最终退出应用程序。把gtk_main_quit()函数放在某个消息处理函数之中编译和执行程序中用到Gtk+函数或定义的每一部分必须包含gtk/gtk.h文件,此外,还必须连接若干库。gcchello.c-ohello`pkg-config--cflags``pkg-config--libs`反引号(在键盘上位于字符1的左边chmod-777hello”将hello设定为可执行的文件。3.Linux系统调用Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。系统调用核心态操作系统核心提供普通的函数调用用户态函数库或用户自己提供很多已经被我们习以为常的C语言标准函数,在Linux平台上的实现都是靠系统调用完成的,如open(),close(),malloc(),fork().所以如果想对系统的原理作深入的了解,掌握各种系统调用是初步的要求。系统调用工作原理不能访问内核所占内存空间也不能调用内核函数。进程调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。在IntelCPU中,这个由中断INT0x80实现。跳转到的内核位置叫做sysem_call。检查系统调用号,这个号码代表进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程(或到其他进程,如果这个进程时间用尽)。系统调用号表示数组sys_call_table[]中的位置。Linux2.6.6:sys_call_table在arch/i386/kernel/entry.S中:Entry(system_call_table)Linux2.6.31:sys_call_table在文件arch/x86/kernel/syscall_table_32.S中如何使用系统调用#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()展开来得到一个函数原型,如果把程序改成下面的样子,程序也可以运行得同样的结果。#includetime.hmain(){time_tthe_time;the_time=time((time_t*)0);/*调用time系统调用*/printf(Thetimeis%ld\n,the_time);}time.h中已经用库函数的形式实现了time这个系统调用,省掉了调用_syscall1宏大多数系统调用都在各种C语言函数库中有所实现,一般情况下,都调用普通的库函数如何使用系统调用续自2.6.19版本开始,_syscall宏被废除,我们需要使用syscall函数,通过指定系统调用号和一组参数来调用系统调用。syscall函数原型为:其中number是系统调用号,number后面应顺序接上该系统调用的所有参数。mm_segment_told_fs=get_fs()set_fs(KERNEL_DS)增加一个新的系统调用•实现方式把新的系统调用永久性的加入内核中,需要编译生成新的内核;以模块的方式加入系统调用,可在运行时添加,不须重新编译内核。要求:采用编译内核方式!编译内核---生成核心映像#bzip2–dlinux-2.6.6.tar.bz2#tarxvflinux-2.6.6.tar#cd/linux-2.6.6#makemenuconfig存盘退出,生成内核配置文件#makebzImage#cp/linux-2.6.6/arch/i386/boot/bzImage/boot/vmlinuz-2.6.6Fedora/Ubuntu10.04+linux2.6+grub1.0编译内核---生成对应核心模块#makemodules#makemodules_installmodules安装到/lib/modules/2.6.6#mkinitramfs-o/boot/initrd-2.6.6.img2.6.6修改/boot/grub/grub.conf如下:default=0timeout=50splashimage=(hd0,0)/boot/grub/splash.xpm.gzhiddenmenutitleFedoraCore(2.6.9-1.667)root(hd0,0)kernel/boot/vmlinuz-2.6.9-1.667roroot=LABEL=/rhgbquietinitrd/boot/initrd-2.6.9-1.667.img/*类似增加自己的核心*/titleFedoraCore(2.6.6)root(hd0,0)kernel/boot/vmlinuz-2.6.6roroot=LABEL=/rhgbquietinitrd/boot/initrd-2.6.6.imgUbuntu14.04+linux3.xx+grub2makemenuconfigmakebzImagemakemodulesmakemodules_installmakeinstall注:linux3.18linux3.8成功;linux3.11图形界面登录失败;直接修改/etc/default/grub(然后update-grub)GRUB_HIDDEN_TIMEOUT=0此配置将影响菜单显示。若

1 / 59
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功