中国石油大学(华东)操作系统课程设计设计报告螺旋Matrix字符串对比Ncurse界面脚本FloppyLinux驱动Driver进程汇总线程警察小偷线程哲学家系统调用Shell编写模拟内存评语成绩中国石油大学(华东)计算机科学与技术学院要求(本页打印):1、双面打印,内容篇幅不要过长(每个实验不要超过3页),禁止贴全部程序,只贴关键代码即可。2、禁止抄袭3、实验列表如下:实验1:螺旋矩阵实验——Linux下的C编程实验2:字符串对比实验——Linux下的C编程实验3:界面编写实验——基于NCurses的文本界面实验4:脚本编写实验——批量建立和删除用户实验5:内核定制实验——FloppyLinux的实现实验6:驱动程序实验——实现驱动程序插入内核并调用实验7:进程汇总实验——创建、信号量机制和管道实验8:线程操作实验——警察小偷的PV操作实验9:线程操作实验——哲学家进餐的资源竞争实验10:系统调用实验——添加系统调用实验11:终端编写实验——模拟终端shell实验12:内存模式实验——实现malloc和free的内存模拟过程4、每个实验要求格式如下(内容使用5号字):实验:实验题目一、实验情景描述二、实验原理三、关键代码(包括截图)四、实验结果及说明总结实验1:螺旋矩阵实验——Linux下的C编程一、实验情景描述完成一个程序,要求输入两个数字即可形成相应的字母螺旋矩阵。例如输入5,6,则程序会生成如下5行6列的矩阵,Z之后循环至A:ABCDEFRSTUVGQBCDWHPAZYXIONMLKJ二、实验原理完成程序ju.c,并用Makefile完成编译。三、关键代码Makefile如下CC=gccOBJS=ju.oEXEC=juall:$(EXEC)$(EXEC):$(OBJS)$(CC)-o$@$(OBJS)clean:rm-f$(OBJS)$(EXEC)ju.c部分代码如下inttotal=1;chardigit=65;x=0,y=0;a[x][y]=65;while(totalm*n){while(y+1n&&!a[x][y+1]){if(digit=90){digit=64;}a[x][++y]=++digit;++total;}while(x+1m&&!a[x+1][y]){if(digit=90){digit=64;}a[++x][y]=++digit;++total;}while(y-1=0&&!a[x][y-1]){if(digit=90){digit=64;}a[x][--y]=++digit;++total;}while(x-1=0&&!a[x-1][y]){if(digit=90){digit=64;}a[--x][y]=++digit;++total;}}四、实验结果实验2:字符串对比实验——Linux下的C编程一、实验情景描述完成一个程序,输入两个字符串,判断其中一个字符串是否是另一个的子串,如果是则输出true,否则输出false。二、实验原理完成程序ju.c,并用Makefile完成编译。CC=gccOBJS=mystring.oEXEC=mystringall:$(EXEC)$(EXEC):$(OBJS)$(CC)-o$@$(OBJS)clean:rm-f$(OBJS)$(EXEC)三、关键代码(包括截图)Ju.c的部分代码如下:intmain(){chars1[N],s2[N];gets(s1);gets(s2);if(strstr(s1,s2)){printf(true\n);}else{printf(false\n);}return0;}四、实验结果及说明总结实验3:界面编写实验——基于NCurses的文本界面一、实验情景描述将螺旋矩阵程序和字符串程序集成在基于Ncurse的文本界面上,对其进行实现。二、实验原理Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。其中,libncurses库用来在显示器上显示文本界面。二、关键代码部分代码如下:intx=StartX,y=StartY,ch;initial();box(stdscr,0,0);attron(A_REVERSE);mvaddstr(0,20,TCSNASServerv1.13byCyberAct);attroff(A_REVERSE);mvaddstr(6,19,[*]juzheng);mvaddstr(8,19,[*]mystring);mvaddstr(18,19,[*]Exit);move(y,x);do{ch=getch();switch(ch){caseKEY_UP:if(y=7)y=y-2;elsey=y;break;caseKEY_DOWN:if(y=17)y=y+2;elsey=y;break;case'\r':if(y==18){endwin();exit(1);}elseif(y==16)system(sudo-b/sbin/init0);elseif(y==14)system(sudo-b/sbin/init6);elseif(y==6){endwin();system(./ju);}elseif(y==8){endwin();system(./mystring);}elseif(y==10){endwin();clear();}elseif(y==12){endwin();clear();}break;case27:endwin();exit(1);default:break;}move(y,x);}while(1);}四、实验结果实验4:脚本编写实验——批量建立和删除用户一、实验情景描述此shell程序实现给系统添加四个新组,每个组代表一个班级,每个班级中添加30个用户。二、实验原理Shell脚本以文本方式存储,并且必须通过Shell解释后才能够执行。Shell本身是一个程序,负责解释和执行用户输入的命令,也可以用来进行程序设计,它是用户和Linux系统交互的纽带。因为Shell脚本是以文本方式进行存储的,所以可以用任何的文本编辑器来编辑。在文本中输入要执行的Shell命令或Linux命令并保存为一个新的文件。当要运行这个脚本时,可调用这个脚本来执行其中的所有指令。三、关键代码部分代码如下:#!/bin/shforclassin1234dofornumberin$(seq0130)doUSERNAME=stu${class}${number}useradd$USERNAMEchown-R$USERNAME/home/$USERNAMEdonedone四、实验结果实验5:内核定制实验——FloppyLinux的实现一、实验情景描述使用软盘进行GRUB配置,之后使用makemenuconfig进行内核配置,之后使用Busybox编译生成一个新的根文件系统,把这些整合到软盘中完成FloppyLinux。二、实验原理首先打开RedHat虚拟机,将老师给的busybox-1.00.tar.bz2文件拷贝到虚拟机中。为虚拟机增加虚拟软盘在软盘上安装引导器(grub)。首先对软盘建立ex2文件系统,之后将系统中grub目录下的引导文件stage1,stage2复制到软盘最后配置grub信息配置busybox相关选项a.在根目录下新建floppylinux目录,floppylinux下再新建floppylinux,将busybox-1.00.tar.bz2复制到第二个floppylinux下。b.进入busybox-1.00文件夹makemenuconfig之后进入配置界面。编译并安装busybox建立临时目录,该目录为软盘的文件系统建立设备列表建立启动配置文件,之后建立连接文件menu.lst制作镜像文件initrd.img,将先前做好的floppylinux根文件系统拷贝到ram1上。检查initrd.img,用loop设备来把他重新挂载到文件系统里,之后压缩initrd.img镜像文件查看压缩之后的大小,大约在403k左右编译linux系统内核,完成配置,执行完毕之后会生成一个bzImage文件,大约在660k左右整合启动盘,重启电脑,输入回车即可输入linux的命令,进入floppylinux。三、关键代码每一步骤的部分代码如下:[root@localhostroot]#mke2fs/dev/fd0[root@localhostroot]#mount/dev/fd0/mnt/floppy[root@localhostfloppy]#mkdirboot[root@localhostfloppy]#mkdirboot/grub[root@localhostfloppy]#cp/boot/grub/stage1/mnt/floppy/boot/grub/[root@localhostfloppy]#cp/boot/grub/stage2/mnt/floppy/boot/grub/[root@localhostfloppylinux]#tar-xjvfbusybox-1.00.tar.bz2[root@localhostbusybox-1.00]#makemenuconfig[root@localhost_install]#mkdir/floppylinux/floppylinux/floppyImage[root@localhostfloppyImage]#cp/floppylinux/floppylinux/busybox-1.00/_install/*/floppylinux/floppylinux/floppyImage/-r[root@localhostfloppyImage]#mkdirdevetcetc/init.dprocmnttmpvar[root@localhostfloppyImage]#chmod755devetcetc/init.dbinmnttmpvar[root@localhostfloppyImage]#chmod555proc[root@localhostetc]#viinittabinittab内容为:::sysinit:/etc/init.d/rcS::askfirst:/bin/sh[root@localhostetc]#vifstabfstab内容为proc/procprocdefaults00[root@localhostinit.d]#vircSrcS内容为:#!/bin/shmount–a[root@localhostgrub]#vigrub.confgrub.conf内容为:timeout0default10titleFloppyLinuxroot(fd0)kernel/boot/bzImageinitrd/initrd.img.gz[root@localhostgrub]#ln-sgrub.confmenu.lst四、实验结果实验6:驱动程序实验——实现驱动程序插入内核并调用一、实验情景描述在其中编写驱动程序matrixdriver.c文件和Makefile文件。之后编译生成驱动程序模块。基于该驱动程序模块编写测试程序matrixtest.c文件。然后将驱动程序模块装入到目标开发板上,建立设备结点并连接,运行测试程序测试之。设定驱动程序实现的字符设备,主设备号为111,此设备号为0。实现的功能是,将驱动程序和第二章的第三题结合起来。即测试程序输入两个数字,在驱动程序即可形成相应的字母螺旋矩阵。二、实验原理首先完成三个脚本的内容。分别编写matrixdriver.c、Makefile和matrixtest.c。其中matrixdriver.c是驱动程序,matrixtest.c是测试程序。完成编写之后,执行make,生成驱动模块evan.o和可执行文件test_demo。之后首先在/dev目录下建立设备结点,并插入驱动模块。之后运行程序matrixtest。完成之后,卸载驱动模块,删除结