操作系统-Linux课程实验报告.doc
《操作系统-Linux课程实验报告.doc》由会员分享,可在线阅读,更多相关《操作系统-Linux课程实验报告.doc(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验1.1、1.2 Linux Ubuntu的安装、创建新的虚拟机VMWare实验1.3 Shell编程1.实验目的与容通过本实验,了解Linux系统的shell机制,掌握简单的shell编程技巧。编制简单的Shell程序,该程序在用户登录时自动执行,显示某些提示信息,如“Welcome to Linux”, 并在命令提示符中包含当前时间、当前目录和当前用户名等基本信息。2.程序源代码清单#include#include int main()printf(Hello Linuxn);int pid;int state;int pfd2;pipe(pfd);if (fork()=0)printf
2、(In the grep progressn);dup2(pfd0,0);close(pfd0);close(pfd1);execlp(grep,grep,sh,0);perror(exelp grep error);esle if(fork()=0) printf(In the ps progressn);dup2(pfd1,1);close(pfd0);close(pfd1);execlp(ps,ps,-ef,0);perror(execlp ps -ef);close(pfd1);close(pfd0);wait(&state);wait(&state);实验2.3 核模块实验步骤:(1
3、).编写核模块 文件中主要包含init_clock(),exit_clock(),read_clock()三个函数。其 中init_clock(),exit_clock()负责将模块从系统中加载或卸载,以及增加或删除模块在/proc中的入口。read_clock()负责产生/proc/clock被读时的动作。(2).编译核模块Makefile文件# Makefile under 2.6.25 ifneq ($(KERNELRELEASE),) #kbuild syntax. dependency relationshsip of files and target modules are lis
4、ted here. obj-m := proc_clock.o else PWD := $(shell pwd) KVER ?= $(shell uname -r) KDIR := /lib/modules/$(KVER)/build all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.symvers *.order endif 编译完成之后生成proc_clock.ko模块文件。(3).核模块源代码clock.c#include #include #inc
5、lude #include #include #include #define MODULE #define MODULE_VERSION 1.0 #define MODULE_NAME clock struct proc_dir_entry* my_clock; int read_clock(char* page, char* start, off_t off, int count, int* eof, void* data) int len; struct timeval xtime; do_gettimeofday(&xtime); len = sprintf(page, %d %dn,
6、 xtime.tv_sec, xtime.tv_usec); printk(clock: read_func()n); return len; struct proc_dir_entry *clock_proc_file; int init_clock(void) clock_proc_file =create_proc_read_entry(clock,0,NULL,read_clock,NULL); return 0; void exit_clock(void) remove_proc_entry(clock,clock_proc_file); module_init(init_clock
7、) module_exit(exit_clock) MODULE_LICENSE(GPL);(4).编译核模块# make (5) .加载核模块 在系统root用户下运行用户态模块命令装载核模块 # insmod proc_clock.ko(6).测试在终端中输入以下命令: cat /proc/clock (7).卸载核模块在系统root用户下运行用户态模块命令卸载核模块#rmmod proc_clock.ko 实验2.4 系统调用实验步骤:(1). 添加新调用的源代码 在./linux-2.6.33.7/arch/x86/kernel/sys_i386_32.c中添加相应的调用代码asmli
8、nkage int sys_xwlcall(struct timeval *tv) struct timeval ktv; do_gettimeofday(&ktv); copy_to_user(tv,&ktv,sizeof(ktv); printk(KERN_ALERTPID %ld called sys_xwlcall()./n,(long)current-pid); return 0; (2). 连接系统调用 a、修改./linux-2.6.33.7/arch/x86/include/asm/unistd_32.h,在系统调用列表后面相应位置添加一行,这样在用户空间做系统调用时就不需要知
9、道系统调用号了,如果在用户空间指明了调用号,就可以省略这一步,实际上我就没写:#define _NR_xwlcall338 新增加的调用号位338 b、修改./linux-2.6.33.7/arch/x86/kernel/syscall_table_32.S 在ENTRY(sys_call_table)清单最后添加一行,这步至关重要,338就是这里来的: .long sys_xwlcall (3). 重建新的Linux核先安装好编译核必要的软件包:# sudo apt-get install build-essential kernel-package libncurses5-dev 复制当前
10、核的配置文件 # cp /boot/config-uname -r ./.config 保存配置文件# sudo make menuconfig 使用debian的的核编译方法,要简单很多# sudo make-kpkg-initrd-initrd-append-to-version=xwlcallkernel_image kernel-headers 运行以下deb包,安装核镜像和模块:linux-image-2.6.33.7xwlcall_2.6.33.7xwlcall-10.00.Custom_i386.deb运行以下deb包,安装核头文件:linux-headers-2.6.33.7x
11、wlcall_2.6.33.7xwlcall-10.00.Custom_i386.deb 运行以下命令,使核启动时能调用模块,比如硬件驱动:# sudo update-initramfs -c -k 2.6.33.7xwlcall此次编译的核采用ubuntu默认配置文件,通用性非常好,可以拷贝到大部分x86机器上安装。安装后系统自动会修改grub启动选单。4. 重建引导信息 a、安装deb包就自动重建引导信息了,无须另行处理。 b、如果仍然不放心,可以运行# update-grub5. 重新引导从新的核进入6. 修改系统调用表 7. 测试实验3.3 Shell编程实验(进程管理实验)1、实验目
12、的通过编写shell程序,了解子进程的创建和父进程与子进程间的协同,获得多进程程序的编程经验。2、实验容1设计一个简单的shell解释程序,能实现基本的bsh功能。3、实验原理 将每一条命令分子段压入argv栈。然后再子进程中调用execvp()来实现该命令的功能。4、代码(源代码清单)#include #include #include #define BUFFERSIZE 256 /最简单的shell,只是简单的执行命令调用,没有任何的其他功能 int main() char bufBUFFERSIZE,*cmd,*argv100; char inchar; int n,sv,buflen
13、gth; int result; buflength = 0; for(;) printf(= ); /处理过长的命令; inchar = getchar();/读取命令 while (inchar != n & buflength BUFFERSIZE) printf(Command too long,please enter again!n); buflength = 0; continue; else bufbuflength = 0; /解析命令行,分成一个个的标记 /char *strtok(char *s,char *delim) /分解字符串为一组字符串。s为要分解的字符串,de
14、lim为分隔符字符串。 cmd=strtok(buf, tn); if(cmd) if(strcmp(cmd,exit)=0) exit(0); n=0; argvn+=cmd; while(argvn+=strtok(NULL, tn); if(fork()=0) execvp(cmd,argv); fprintf(stderr,sxh:%s:command not found.n,buf);/如果子进程顺利执行,这段话是不会执行的 exit(1); wait(&sv); buflength = 0; 实验容2编写一个带有重定向和管道功能的Shell1.设计思路通过fork()创建子进程,用
15、execvp()更改子进程代码,用wait()等待子进程结束。这三个系统调用可以很好地创建多进程。另一方面,编写的Shell要实现管道功能,需要用pipe()创建管道使子进程进行通信。2.源代码清单#include #include #include #include #define BUFFERSIZE256 /具有输入输出重定向的功能 和管道功能 int main() char buf256,*buf2,*cmd,*cmd2,*argv64,*argv264,*infile,*outfile; char inchar; int n,sv,buflength,fd2; for(;) bufl
16、ength = 0; printf(= ); inchar = getchar(); while (inchar != n & buflength BUFFERSIZE) fprintf(stderr,Command too long,please enter again!n); buflength = 0; continue; else bufbuflength = 0; /检查是否具有管道操作符 /strstr()在字符串中查找指定字符串的第一次出现,buf2指向管道符号前端的命令 buf2=strstr(buf,|); if(buf2) *buf2+=0; else /否则查看是否具有重
17、定向的操作符 infile=strstr(buf,); if(infile) *infile=0; infile=strtok(infile+1, tn); if(outfile) *outfile=0; outfile=strtok(outfile+1, tn); /解析命令行,分成一个个的标记 cmd=strtok(buf, tn); /执行管道命令 if(buf2) if(strcmp(cmd,exit)=0) exit(0); if(!cmd) fprintf(stderr,Command token error.n); exit(1); n=0; /管道后端的命令 argvn+=cm
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 Linux 课程 实验 报告
限制150内