操作系统课程设计报告 - 图文 下载本文

内容发布更新时间 : 2024/5/13 23:10:14星期一 下面是文章的全部内容请认真阅读。

3.2.2 GTK三个并发进程 1)下载GTK 1 2 3 4 5 6 7 #apt-get install build-essential #apt-get install gnome-core-devel #apt-get install pkg-config #apt-get install devhelp #apt-get install libglib2.0-doc libgtk2.0-doc #apt-get instal glade libglade2-dev #pkg-config --modversion gtk+-2.0 查看GTK版本 2)编写源代码 try1.c #include #include #include void destroy_progress( GtkWidget *widget) { gtk_main_quit (); } void hello(GtkWidget *widget,gpointer data) { g_print(\} gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data) { g_print (\ gtk_main_quit(); return(TRUE); } void destroy(GtkWidget *widget,gpointer data) { gtk_main_quit(); } int show( int argc, char *argv[],char *name) { GtkWidget *window; GtkWidget *button; gtk_init (&argc, &argv); window=gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT(window),\ gtk_signal_connect (GTK_OBJECT (window), \ gtk_window_set_title (GTK_WINDOW (window), name); gtk_container_set_border_width (GTK_CONTAINER (window), 30); button = gtk_button_new_with_label (\ gtk_signal_connect (GTK_OBJECT (button), \ gtk_signal_connect_object (GTK_OBJECT (button), \(gtk_widget_destroy),GTK_OBJECT (window)); gtk_container_add (GTK_CONTAINER (window), button); gtk_widget_show (button); gtk_widget_show (window); gtk_main(); return(0); } int main(int argc, char *argv[]) { int pid = fork(); 6

if (pid<0) printf (\ if (pid == 0) { int pid = fork (); if (pid < 0) printf (\ else if (pid == 0) show (argc,argv,\ else show (argc,argv,\ } else show (argc,argv,\ } 3)编译,运行

图3. 1 第一题运行结果

3.3 题目二:Linux内核编译

3.3.1 下载、解压Linux内核

kernel的下载网站:https://www.kernel.org/

从上述网站上下载内核linux2.6.34.14并在ubuntu中进行解压,解压时直接点击右键选择解压,然后再拷贝到/usr/src目录。 3.3.2增加系统调用

系统调用工作原理 :不能访问内核所占内存空间也不能调用内核函数。

进程调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。在Intel CPU中,这个由中断INT0x80实现。 (与DOS功能调用int0x21很相似)

跳转到的内核位置叫做sysem_call。检查系统调用号,这个号码代表进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程(或到其他进程,如果这个进程时间用尽)。

系统调用号 表示数组sys_call_table[]中的位置。 文件../Arch/i386/kernel/entry.S中:

7

Entry(system_call_table)

增加系统调用的实现:要添加一个文件拷贝的系统调用需要如下的步骤: 1)对/usr/src/linux-2.6.37.4/kernel/sys.c进行修改,添加实现文件拷贝功能的源代码:

添加的源代码如下: sys_mycall asmlinkage int sys_mycall(char* sourceFile,char* destFile) { int source=sys_open(sourceFile,O_RDONLY,0); int dest=sys_open(destFile,O_WRONLY|O_CREAT|O_TRUNC,0600); char buf[4096]; mm_segment_t fs; fs = get_fs(); set_fs(get_ds()); int i; if(source>0 && dest>0) { do { i=sys_read(source,buf,4096); sys_write(dest,buf,i); }while(i); } else { printk(\ } sys_close(source); sys_close(dest); set_fs(fs); return 10; } 图3. 2 修改sys.c 2)修改/usr/src/linux-2.6.32.10/arch/x86/include/asm/unistd_32.h,增加系统调用号 8

在系统调用号的末尾增加: #define __NR_sys_mycall 338 即添加第338号系统调用,调用的函数名称为:sys_mycall 并将系统调用的总数改为339

图3. 3 修改unistd_32.h

3)修改系统调用表/usr/src/linux-2.6.32.10/arch/x86/kernel/syscall_table_32.S

在最后一行添加: .long sys_mycall

图3. 4 修改syscall_table_32.s

图3. 5 修改 makefile

4)修改系统版本号,以免混淆 3.3.3 编译内核 内核编译步骤:

9

cd /usr/src/linux-2.6.34.14 进入待编译内核的文件夹make clean 清空之前的编译的文件make menuconfig 编译内核在执行 make menuconfig 指令时遇到问题安装ncurses以解决,使用指令:apt-get install libncurses5-dev 图3. 6 编译内核遇到错误 安装完ncurses后再次执行指令make menuconfig可以顺利执行。 图3. 7 安装ncurse 遇到menuconfig的选择界面,Exit?Save 然后执行命令meke -j4 使用并发编译,4个任务同时进行,这样编译的过程会比使用make更快。 图3. 8 make menuconfig 10