已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计实验报告专业:信息安全 班级:0903 姓名:付晓帆 学号:U200915328一、 实验目的掌握Linux操作系统的使用方法;了解Linux系统内核代码结构;掌握实例操作系统的实现方法。二、 实验要求1、 掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。l 编一个C程序,其内容为实现文件拷贝的功能;l 编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。2、 掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,调用新增加的系统调用。实现的功能是:文件拷贝;3、 掌握增加设备驱动程序的方法。通过模块方法,增加一个新的设备驱动程序,其功能可以简单。实现字符设备的驱动;4、 了解和掌握/proc文件系统的特点和使用方法l 了解/proc文件的特点和使用方法l 监控系统状态,显示系统中若干部件使用情况l 用图形界面实现系统监控状态。5、 设计并实现一个模拟的文件系统(选作)三、 实验一1、 编一个C程序,其内容为实现文件拷贝的功能要实现文件拷贝功能,主要用到的函数是open、write、read。以前在windows下写C语言打开文件常用的fopen,此时不能用,因为fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api ;所以应该直接使用linux中的系统函数open。主要用到的头文件:Unistd.h包含了许多Linux系统服务的函数原型,如:read、writeFcntl.h定义了很多宏和open,fcntl函数原型Stdio.h标准输入输出头文件sys/types.h此头文件包含适当时应使用的多个基本派生类型sys/stat.h 包含了获取文件属性的一些函数errno.h用于调试错误代码是所需要的一些errno变量string.h包含了处理字符串的一些函数设计思路:由命令行参数获取2个文件名,根据其文件名和路径分别打开该2个文件,设置一个循环,从源文件复制N个字节到目的文件,直到源文件指针到文件尾,最后关闭2个文件。在可能出错的地方需要加上相应的报错代码和中断,并输出错误信息,以方便调试或是往后应用在第2小题中可能发生的错误。理清楚设计思路后,根据需求写出相应的源代码见后页源程序代码scopy.c ;在Linux终端使用编译命令 gcc o scopy scopy.c将程序编译并生产exe可执行文件。然后手动创建一个测试文件test.txt ,在终端输入命令./scopy test.txt target.txt这样就能将源文件test.txt复制到目标文件target.txt程序源代码 scopy.c:#include #include #include #include #include #include #include #define BUFFER_SIZE 1024 /缓冲区大小int main(int argc,char *argv) int from_fd,to_fd; int bytes_read,bytes_write; char bufferBUFFER_SIZE; /设定一个缓冲区 char *ptr; if(argc!=3) /三个参数 fprintf(stderr,Usage:%s fromfile tofilena,argv0); return(-1); /* 打开源文件 */ if(from_fd=open(argv1,O_RDONLY)=-1) fprintf(stderr,Open %s Error:%sn,argv1,strerror(errno); return(-1); /* 创建目的文件 */ if(to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1) fprintf(stderr,Open %s Error:%sn,argv2,strerror(errno); return(-1); while(bytes_read=read(from_fd,buffer,BUFFER_SIZE) /* 出错*/ if(bytes_read=-1)&(errno!=EINTR) break; else if(bytes_read0) ptr=buffer; while(bytes_write=write(to_fd,ptr,bytes_read) /* 出错*/ if(bytes_write=-1)&(errno!=EINTR)break; /* 写完了所有读的字节 */ else if(bytes_write=bytes_read) break; /* 只写了一部分,继续写 */ else if(bytes_write0) ptr+=bytes_write; bytes_read-=bytes_write; /* 写的时候出错*/ if(bytes_write=-1)break; close(from_fd); close(to_fd); return(1);2、 编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。 安装Linux下的GTK+:首先要在Linux下载GTK+相关库文件并安装。在终端输入sudo apt-get install gnome-core-devel ,然后根据提示操作,就会安装 libgtk2.0-dev libglib2.0-dev 等开发所需的相关库文件。 $sudo apt-get install build-essential$sudo apt-get install gnome-core-devel$sudo apt-get install pkg-config$sudo apt-get install libgtk2.0*编译GTK+代码时需要包含的头文件是gtk/gtk.h,此外,还必须连接若干库;比如编译test.c时用以下命令。gcc o test test.c pkg-config -cflags -libs gtk+-2.0在编写代码时需要用到的控件、窗口等视窗物件形态,用类GtkWidget定义其为指针类型。编写一个GTK+程序的基本步骤如下:l 初始化Gtkl 建立控件l 登记消息与消息处理函数l 执行消息循环函数gtk_main()之后所设计的3个进程,基本上都是以这样的方式编写代码的,因为之前曾用过OpenGL,所以在这方面掌握的比较快。初始化主要使用的函数有gtk_init(&argc,&argv); /启动GTK gtk_window_new(GTK_WINDOW_TOPLEVEL); /创建窗口 gtk_window_set_title(GTK_WINDOW(window),标题名); /设置窗口标题名 gtk_widget_set_usize(window, 200, 200); /设置窗口大小 gtk_widget_show(window); /显示窗口建立控件的一般流程/*创建表格准备封装*/gtk_table_new (/创建多少列gint rows,/创建多少栏gint columns,/用来决定表格如何来定大小gint homogeneous);/*这个函数是将表格table,结合到窗口window里*/gtk_container_add(GTK_CONTAINER(window),table);gtk_widget_show(table);/ 显示该表格/*要把物件放进box中,可用以下函数*/void gtk_table_attach_defaults (GtkTable*table,/参数(table)是选定某表格GtkWidget*widget,/(child)是想放进去的物件gintleft_attach,/以下参数是指定把物件放在哪里, 及用多少个boxesgintright_attach,ginttop_attach,gintbottom_attach);实验截图:实验源代码:process.c:#include #include #include gint progress_timeout( gpointer pbar ) gdouble new_val; char s10; new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pbar) + 0.01; if (new_val 1.0) new_val = 0.0; sprintf (s, %.0f%, new_val*100); gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pbar), new_val); gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pbar),s); return TRUE; void destroy_progress( GtkWidget *widget) gtk_main_quit ();void show(int argc,char *argv,char *title ) GtkWidget *window; GtkWidget *vbox; GtkWidget *pbar; GtkWidget *pbar2; GtkWidget *button; GtkWidget *label; int timer; char id_char50; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_resizable (GTK_WINDOW (window), TRUE); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); g_signal_connect (G_OBJECT (window), destroy, G_CALLBACK (destroy_progress), NULL); gtk_window_set_title (GTK_WINDOW (window), title); gtk_container_set_border_width (GTK_CONTAINER (window), 0); vbox = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); sprintf (id_char, 本进程ID:%d, getpid (); label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); sprintf (id_char, 父进程ID:%d, getppid (); label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); pbar = gtk_progress_bar_new (); gtk_box_pack_start (GTK_BOX (vbox), pbar, FALSE, FALSE, 0); gtk_widget_show (pbar); timer = gtk_timeout_add (100, progress_timeout, pbar); button = gtk_button_new_with_label (close); g_signal_connect_swapped (G_OBJECT (button), clicked, G_CALLBACK (gtk_widget_destroy), window); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); gtk_widget_show (button); gtk_widget_show (window); gtk_main ();int main(int argc, char *argv) int pid = fork (); if (pid 0)printf (error!n); else if (pid = 0) int pid = fork (); if (pid 0 & dest0) do i=sys_read(source,buf,4096); sys_write(dest,buf,i); while(i); else printk(Error!); sys_close(source); sys_close(dest); set_fs(fs); return 10;修改完函数之后,接下来要修改系统调用号所对应的函数名,即修改/usr/src/linux-2.6.32.10/arch/x86/include/asm/unistd_32.h该文件定义了系统调用号,我们只要找一没被使用的系统调用号,用该号给我们自定义函数使用,比如#define _NR_sys_mycall337/*定义系统调用sys_mycall 的系统调用号为337*/修改完系统调用号后,接下来要修改系统调用表,即/usr/src/linux-2.6.32.10/arch/x86/kernel/syscall_table_32.S,这个文件是用汇编语言编写的,因此要让自定义的系统调用相对于其他系统调用的顺序337个,写上.long sys_mycall /*337*/基本修改完以上源码后,接下来对其进行默认的净化、设置等。使用下列代码对其源码进行处理sudo make mrproper 净化解压后的源代码sudo make menuconfig对内核选项进行配置如果这一步有错误可能是正在使用的系统没有安装必要的库文件,如ncurses、libncurses*,这时候需要输入如下指令来安装首先回到系统根目录sudo apt-get install ncursessudo apt-get install libncurses*依照提示就能安装好必要的库文件了。然后再回到内核源码的目录下尝试使用sudo make menuconfig对内核选项进行配置。sudo make dep 建立模块间的依赖信息sudo make clean 删除配置时留下的一些不用的文件3. 编译内核接下来是最费时间的环节,少则2个小时,多则3个小时的编译,需要再三确保前面步骤是否正确后再进行下一步。sudo make bzImage编译内核这个过程大概是20多分钟sudo make modules编译内核模块这个过程大概要100分钟150分钟左右,一般如果有错误,会在前十几分钟就停止编译并报错。4. 安装内核比较简单,只需要两条指令sudo make modules_install 安装内核模块sudo make install 安装内核安装完毕后,需要开机时选择使用新的Linux核心,要做下列修改:1)复制内核到系统启动引导目录cp /usr/src/linux-2.6.37.4/arch/i386/boot/bzImage /boot/vmlinuz-2.6.37.4-mykernel2)创建初始RAM磁盘initrd在创建之前先安装必要的程序apt-get install bootcd-mkinitramfsmkinitramfs -o /boot/initrd.img-2.6.37.43)更新grub在/boot/grub/grub.cfg中, 复制一段旧的核心代码,并将里面linux和initrd中的路径改为新增的,注意不能用update-grub2在/boot中复制一个旧的config-xxxxxx做为自己的4)cd /bootcp initrd.img-2.6.37.4 initrd-2.6.37.4.old以上是备份initrid,下面是修改depmod aupdate-initramfs -k 2.6.37.4 ccd /tmpgzip -dc /boot/initrd.img-2.6.37.4| cpio -idtouch lib/modules/2.6.37.4/modules.depfind ./ | cpio -H newc -o /boot/initrd.img-2.6.37.4.newgzip /boot/initrd.img-2.6.37.4.newcd /bootmv initrd.img-2.6.37.4.new.gz initrd.img-2.6.37.45)重开机测试5. 测试功能用C语言编写测试程序testsys.c,源代码如下:#include #include #include int main(int argc,char*argv) int i=syscall(337,argv1,argv2); /*337为系统调用号*/ printf(successfully!rn); printf(%d,i); return 1;编译gcc o testsys testsys.c运行./testsys test.txt target.txt系统调用337号功能,拷贝文件test.txt到target.txt运行结果截图如下:五、 实验三本题是为了更深刻了解模块机制,这种机制可以动态的在内核中添加或者删除模块。模块一旦被插入内核,他就和内核其他部分一样了。Unix系统将设备分为三种类型字符设备、块设备、网络接口;一般对应这三种模块字符模块、块模块、网络模块。字符设备,是能够像字节流一样被访问的设备,由字符设备驱动程式来实现这种特性。源代码:Mydev.c:#include #include #include #include #include #include #define BUFFER_SIZE 2048MODULE_LICENSE(GPL);static int mydev_major = 0;unsigned char mybufferBUFFER_SIZE=cs0905 U200915015 xc;int Device_Open=0;static ssize_t my_open(struct inode *inode,struct file *file)static int counter=0;if(Device_Open)return -EBUSY;Device_Open+;printk(the device has been called %d timesn,counter+);return 0;static ssize_t my_release(struct inode *inode,struct file *file)if(Device_Open=0)return -1;elseDevice_Open=0;return 0;static ssize_t my_write (struct file *filp, const char _user *buf, size_t count,loff_t *pos) int size=count; if(sizeBUFFER_SIZE) printk(out of the max size!n);size=BUFFER_SIZE; if(copy_from_user(mybuffer,buf,sizeof(mybuffer)return -ENOMEM; return size;static ssize_t my_read(struct file *filp, char _user *buf,size_t count, loff_t *pos) int size=count; if(sizeBUFFER_SIZE) printk(out of the max size!n);size=BUFFER_SIZE; if(copy_to_user(buf, mybuffer, size) return -ENOMEM; return size;static struct file_operations mydev_fops=.read=my_read,.write=my_write,.open=my_open,.release=my_release,;static int _init mydev_init(void)int result;result=register_chrdev(0,mydev,&mydev_fops);if(result0)printk(error:can not register the devicen);return -1; if(mydev_major=0)mydev_major=result;printk(hehe,the device has been registerstatic ssize_t my_open(struct inode *inode,struct file *file)ed!n); printk(the virtual device was assigned major number %d.n,mydev_major)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 审计职业生涯规划必-备手册
- 碳排放核算员创新思维知识考核试卷含答案
- 畜牧技术员岗前基础综合考核试卷含答案
- 仪器仪表维修工持续改进考核试卷含答案
- 烧结法溶出工岗前实操知识水平考核试卷含答案
- 建筑信息模型技术员常识竞赛考核试卷含答案
- 趸船水手岗前技能安全考核试卷含答案
- 2025年口腔执业医师考试口腔正畸学临床专项训练试卷及答案
- 未来五年定心或校平装置行业直播电商战略分析研究报告
- 未来五年实时传输及监控系统装备企业制定与实施新质生产力战略分析研究报告
- 2025云南温泉山谷康养度假运营开发(集团)有限公司社会招聘笔试备考试题附答案
- 2.2《谋求互利共赢》 课件 2024-2025学年统编版道德与法治九年级下册
- SY-T 6257-2024 蒸汽吞吐注采工艺方案设计
- 2025年自动售货机市场调研报告
- 贵州大学《财务管理》2024 - 2025 学年第一学期期末试卷
- 2025-2026学年统编版三年级语文上册第六单元素养提优卷(含答案)
- 门窗安装施工资源配置方案
- 党政面试浙江备考宝典
- (2)文学类文本阅读(小说)【课件篇】-2026届高考语文一轮复习讲学练全攻略
- 三年级上册口算练习题200道
- 造价咨询沟通和协调方案(3篇)
评论
0/150
提交评论