您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 北京邮电大学操作系统实验
操作系统班级:2011211302学号:2011211168姓名:康雅微目录实验1.2虚拟机VM软件安装实验2.3内核模块实验2.4系统调用实验3.3进程管理实验-shell编程实验实验4.1存储管理--观察实验实验1.2虚拟机VM软件安装1.、实验目的在配备Windows操作系统Host机上,安装虚拟机软件VirtualPCforWindows或VMwareForWindows,进行BIOS设定,对硬盘进行分区和格式化,安装Linux操作系统,以便在一台机器上模拟出多种操作系统运行环境。通过本实验,进一步掌握课堂上所讲的虚拟机的概念。2、实验内容实验前的准备:1、获取安装介质2、熟悉虚拟机的操作安装步骤(以Vmware为例):1、虚拟机软件的安装及设置(1)、安装VMware,输入虚拟机序列号(2)、创建一个新的虚拟机。第一步:“File”-“NewVirtualMachine”-“Custom”-“Next”-操作系统那栏选Linux-“Next”。第二步:设置虚拟机名以及配置文件-“Next”。第三步:设置虚拟机的内存大小。第四步:网络连接,使用默认设置-“Next”。第五步:磁盘设定,如果你不是想让红旗Linux桌面4.0终生运行在虚拟机里,请选“Useaphysicaldisk”,让虚拟机与当前系统共用同一硬盘,而不是虚拟出一个硬盘。有一定风险,但是只要不胡乱操作,风险不大-“Next”。第六步:指定要使用的硬盘-“Next”,设置配置文件的位置-“Finish”,忽略那个风险提示。(3)、光驱软驱默认情况下也是和当前系统共用的,使用iso文件引导虚拟机,则“Editvirtualmachinesettings”,在左侧列表中选“DVD/CD-ROM”那项,再在右侧选“UseISOimage:”,指定安装红旗Linux桌面4.1的iso文件。(4)、虚拟机默认不是从光盘引导的,要在它的BIOS里改,得先“Startthisvirtualmachine”。如果出现“Donotforgetto...”的提示框,直接点“OK”。待VMware窗口中一大块变黑的时候,赶快用鼠标点那块黑,那块黑是虚拟机的屏幕。现在你的鼠标和键盘就转为控制虚拟机了。注意虚拟机屏幕下方的进度条,在走完之前,按“F2”键进行BIOSs设定。(5)、用键盘的左右箭头键选中“Boot”标签,用上下箭头键选中“CD-ROM”。同时用“Shift”键和“+”键,把“CD-ROM”拎到顶上。用键盘的左右箭头键选中“Exit”标签,用上下箭头键选中“ExitSavingChanges”,回车-“YES”,等待虚拟机重新启动。同时按“Ctrl”和“Alt”键,鼠标和键盘就从虚拟机中解脱出来了。看到进度条的时候按VMware窗口左上方的红方块,停掉虚拟机。安装实验:进入界面输入用户名和密码:实验2.3内核模块1、实验目的模块是Linux系统的一种特有机制,可用以动态扩展操作系统内核功能。编写实现某些特定功能的模块,将其作为内核的一部分在管态下运行。本实验通过内核模块编程在/porc文件系统中实现系统时钟的读操作接口。2、实验内容设计并构建一个在/proc文件系统中的内核模块clock,支持read()操作,read()返回值为一字符串,其中包块一个空各分开的两个子串,为别代表xtime.tv_sec和xtime.tv_usec。3、实验原理Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合。在装载这些模块式,将它的代码链接到内核中。Linux模块可以在内核启动时装载,也可以在内核运行的过程中装载。如果在模块装载之前就调用了动态模块的一个函数,那么这次调用将会失败。如果这个模块已被加载,那么内核就可以使用系统调用,并将其传递到模块中的相应函数。4、实验步骤编写内核模块文件中主要包含init_module(),cleanup_module(),proc_read_clock()三个函数。其中init_module(),cleanup_module()负责将模块从系统中加载或卸载,以及增加或删除模块在/proc中的入口。read_func()负责产生/proc/clock被读时的动作。编译内核模块Makefile文件#Makefileunder2.6.25ifneq($(KERNELRELEASE),)#kbuildsyntax.dependencyrelationshsipoffilesandtargetmodulesarelistedhere.obj-m:=proc_clock.oelsePWD:=$(shellpwd)KVER?=$(shelluname-r)KDIR:=/lib/modules/$(KVER)/buildall:$(MAKE)-C$(KDIR)M=$(PWD)modulesclean:rm-rf.*.cmd*.o*.mod.c*.ko.tmp_versions*.symvers*.orderendif编译完成之后生成pro_clock.o模块文件。内核模块源代码clock.c#includelinux/kernel.h#includelinux/module.h#includelinux/proc_fs.h6/58#includelinux/string.h#includelinux/vmalloc.h#includeasm/uaccess.h#defineMODULE#defineMODULE_VERSION1.0#defineMODULE_NAMEclockstructproc_dir_entry*my_clock;intread_clock(char*page,char**start,off_toff,intcount,int*eof,void*data){intlen;structtimevalxtime;do_gettimeofday(&xtime);len=sprintf(page,%d%d\n,xtime.tv_sec,xtime.tv_usec);printk(clock:read_func()\n);returnlen;}structproc_dir_entry*clock_proc_file;intinit_clock(void){clock_proc_file=create_proc_read_entry(clock,0,NULL,read_clock,NULL);return0;}voidexit_clock(void){remove_proc_entry(clock,clock_proc_file);}module_init(init_clock)module_exit(exit_clock)MODULE_LICENSE(GPL);编译内核模块#make加载内核模块在系统root用户下运行用户态模块命令装载内核模块#insmodproc_clock.ko测试在终端中输入以下命令:#cat/proc/clock或者使用以下测试代码:#includestdio.h#includesys/time.h#includefcntl.hintmain(void){structtimevalgetSystemTime;charprocClockTime[256];intinfile,len;8/58gettimeofday(&getSystemTime,NULL);infile=open(/proc/clock,O_RDONLY);len=read(infile,procClockTime,256);close(infile);procClockTime[len]='\0';printf(SystemTimeis%d%d\nProcClockTimeis%s\n,getSystemTime.tv_sec,getSystemTime.tv_usec,procClockTime);sleep(1);}卸载内核模块在系统root用户下运行用户态模块命令卸载内核模块#rmmodclock.o实验结果及分析在终端中输入以下命令:#cat/proc/clock输出了时间信息:1293006692797591在终端中运行测试程序:#./test输出了时间信息:SystemTimeis1293006786585309ProcClockTimeis1293006786585322cat命令使用了文件系统read()调用,可以获得read_clock()中的时间字符串信息。实验2.4系统调用1、实验目的向现有Linux内核加入一个新的系统调用从而在内核空间中实现对用户空间的读写。例如,设计并实现一个新的内核函数mycall(),此函数通过一个引用参数的调用返回当前系统时间,功能上基本与gettimeofday()相同。也可以实现具有其它功能的系统调用。2、实验内容与步骤在2.6.33.7内核中加入一个新的系统调用xwlcall(),功能与gettimeofday()相同。3、实验原理linux的系统调用形式与POSIX兼容,也是一套C语言函数名的集合。然而,linux系统调用的内部实现方式却与DOC的INT21H相似,它是经过INT0X80H软中断进入后,再根据系统调用号分门别类地服务。Linux通过sys_call_table来管理系统调用号。如果要增加新的系统调用,那不仅要在内核中实现这个系统调用函数,还要在sys_call_table中增加这个系统调用的索引。4、实验步骤添加新调用的源代码在./linux-2.6.33.7/arch/x86/kernel/sys_i386_32.c中添加相应的调用代码asmlinkageintsys_xwlcall(structtimeval*tv){structtimevalktv;do_gettimeofday(&ktv);copy_to_user(tv,&ktv,sizeof(ktv));printk(KERN_ALERTPID%ldcalledsys_xwlcall()./n,(long)current-pid);return0;}连接系统调用a、修改./linux-2.6.33.7/arch/x86/include/asm/unistd_32.h,在系统调用列表后面相应位置添加一行,这样在用户空间做系统调用时就不需要知道系统调用号了,如果在用户空间指明了调用号,就可以省略这一步,实际上我就没写:#define__NR_xwlcall338新增加的调用号位338b、修改./linux-2.6.33.7/arch/x86/kernel/syscall_table_32.S在ENTRY(sys_call_table)清单最后添加一行,这步至关重要,338就是这里来的:.longsys_xwlcall重建新的Linux内核先安装好编译内核必要的软件包:#sudoapt-getinstallbuild-essentialkernel-packagelibncurses5-dev复制当前内核的配置文件#cp/boot/config-`uname-r`./.config保存配置文件#sudomakemenuconfig使用debian的的内核编译方法,要简单很多#sudomake-kpkg-initrd--initrd--append-to-version=xwlcallkernel_imagekernel-headers运行以下deb包,安装内核镜像和模块:linux-image-2.6.33.7xwlcall_2.6.33.7xwlcall-10.00.Custom_i386.deb运行以下deb包,安装内核头文件:linux-headers-2.6.33.7xwlcall_2.6.33.7xwlcall-10.00.Custom_i386.deb运行以下命令,使内核启动时能调用模块,比如硬件驱动:#su
本文标题:北京邮电大学操作系统实验
链接地址:https://www.777doc.com/doc-4283390 .html