华中科技大学计算机学院操作系统课程设计报告1
- 格式:doc
- 大小:1.22 MB
- 文档页数:27
华中科技大学 嵌入式操作系统课程设计实验报告
院 系: 计算机科学与技术学院 专 业: 班 级: 姓 名: 指导老师: 报告时间:
计算机科学与技术学院 目 录 1、课程设计目的…………………………………………………………3 2、课程设计环境搭建……………………………………………………3 3、内容一:熟悉与理解Linux编程环境 3、1 内容要求……………………………………………………………………5 3、2 设计过程及实现……………………………………………………………5 4、内容二:掌握添加系统调用的方法 4、1 内容要求……………………………………………………………………9 4、2 设计过程及实现……………………………………………………………9 5、内容三:掌握添加设备驱动程序的方法 5、1 内容要求 …………………………………………………………………17 5、2 设计过程及实现 …………………………………………………………17 6、内容四:理解与分析/proc文件 6、1 内容要求 …………………………………………………………………22 6、2 设计过程及实现 …………………………………………………………22 1 课程设计目的 (1)掌握Linux操作系统的使用方法; (2)了解Linux系统内核代码结构; (3)掌握实例操作系统的实现方法。
2 课程设计环境搭建 (1)windows 7上,利用虚拟机软件VMware软件搭建的linux平台: ◎Ubuntu 11、10 (安装包:ubuntu-11、10-desktop-i386) ◎内核:linux-headers-3、0、0-12-generic (2)更改root登录: 在现阶段Ubuntu的系统中,就是不允许直接以root身份登录系统的,但就是在做课设的过程中,需要大量的使用root权限来进行命令的操作。如果以普通用户登录ubuntu,会连编辑一个文件都非常周折。为此,我找到了一种修改系统文件,以达到直接使用root身份登录的方法: ◎开始的时候,只能以普通用户登录,用Ctrl+Alt+T打开终端: 初始化/修改root密码 sudo passwd root 用vi编辑器修改这个文件: sudo vi /etc/lightdm/lightdm、conf 在文件最后加入这么一行代码: greeter-show-manual-login=true 然后保存退出,sudo reboot 重启系统。之后就可以输入root用户登录。 (3)在添加系统调用中用到的其她内核包: ◎下载与当前实验环境最为接近的系统版本(这点很重要) 使用apt-get install linux-source-3、0、0 命令, ◎下载结果就是linux-source-3、0、0、tar、bz2 ◎解压命令:tar –xjvf linux-source-3、0、0、tar、bz2 –C /usr/src ◎解压后,在/usr/src目录下得到内核文件夹linux-source-3、0、0 (4)在调用linux图形库时需要安装GTK环境: ◎安装gcc/g++/gdb/make 等基本编程工具 apt-get install build-essential Tip:如果提示由于依赖项不能安装,需要使用apt的强化版aptitude,这个工具可以自动分析软件包依赖,系统一般不自带,需要先安装,具体过程就是: apt-get install aptitude aptitude install build-essential aptitude这个工具很强大,对于解决软件包安装时的依赖问题很有帮助。 ◎安装 libgtk2、0-dev libglib2、0-dev 等开发相关的库文件: apt-get install gnome-core-devel ◎安装GTK核心组件: apt-get install libgtk2、0-dev 这个安装完成后,GTK环境就基本搭建成功,网上有些教程说要安装其她配置文件,经我亲测,发现只要安装libgtk2、0-dev这个包就能搞定。3 内容一:熟悉与理解Linux编程环境 3、1 内容要求 (1)编写一个C程序,实现文件拷贝功能 (2)编写一个C程序,使用Linux下的图形库,分窗口显示三个并发进程运行; 3、2 设计过程及实现 (1)文件拷贝: ①文件的拷贝主要的思想就就是利用文件指针操作,在两个文件之间进行按字符的fget与fput。从而完成整个文件的拷贝操作。在这个基本功能之外,需要增加程序的健壮性,具体有以下几个方面: ·源文件就是否存在且能读取数据; ·就是否能创建目的文件,且能向里面写入数据; ·程序需要的argc参数个数就是否满足要求; ②基于以上几点与内容要求,主要的程序段如下: if(argc!=3) //判断参数个数就是否为3 ,否则返回 { printf("Error in argc!\n"); return 0; } if( (fsource=fopen(argv[1],"rb"))==NULL ) { printf("Error in open source file!\n"); //判断源文件就是否能打开与读出 return 0; } if( (ftarget=fopen(argv[2],"wb"))==NULL ) { printf("Error in open target file!\n"); //判断目的文件时候能创建与写入 return 0; } while((c=fgetc(fsource))!=EOF) { fputc(c,ftarget); //按字符读取与写入数据 } ③执行结果如下: 将source/source、txt文件拷贝到到target、txt,开始时如下图3-1所示:
图3-1 复制开始前source/source、txt文件内容 利用mycopy程序复制,查瞧target、txt文件复制结果如下图3-2所示:
图3-2 复制后target、txt文件的具体内容 (2)实现三个进程之间的并发程序: 这里需要用到课程实验时的fork( )程序以及GTK的图形显示。 ①基本fork()程序,调用显示一个父进程与两个子进程的结构如下: if((pid_1=fork())==0) { printf("Child 1# is running、、、、、、\n"); //第一个子进程 Child 1# show(argc,argv,"This is Child 1#"); //调用函数显示窗口 } else { if((pid_2=fork())==0){ printf("Child 2# is running、、、、、、\n"); //第二个子进程 Child 2# show(argc,argv,"This is Child 2#"); //调用函数显示窗口 } else { printf("Parent # is running、、、、、、\n"); //父进程 Parent # //由于父进程需要显示全部子进程PID,所以这里直接用参数画窗口 } } ②调用GTK显示窗体函数模块的结构: void show(int argc,char *argv[ ],char *title ) { gtk_init (&argc, &argv); //初始化工具包并且获取命令行参数; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); //创建新的窗口; //设定窗口的位置; gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); //监听窗口的destroy事件; 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), 20);//设定宽度; //使用gtk_vbox_new函数建立纵向组装盒; //为了显示构件,必须将构件放入组装盒中,并将组装盒放在窗口内; vbox = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (vbox), 100);//设定宽度; gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox);
//使用gtk_box_pack_start函数将构件放到组装盒中; sprintf (id_char, "%s ,My ID:%d", title,getpid ()); //显示PID号 label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); gtk_widget_show (label);
sprintf (id_char, "父进程ID:%d", getppid ()); //显示PPID号 label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); gtk_widget_show (label); button = gtk_button_new_with_label ("close"); //关闭窗口按钮
//信号登记函数,监听按钮的clicked事件。 //当窗口clicked时, gtk_widget_destroy 就会被调用。 //而 gtk_widget_destroy 函数又调用 gtk_main_quit() 结束程序运行。 g_signal_connect_s (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), window); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 10); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); //函数显示窗口中的组件 gtk_widget_show (button); gtk_widget_show (window); //准备将窗口与所有的组件显示在屏幕上,函数必须在GTK程序的最后调用、 gtk_main (); }