操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第1頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第2頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第3頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第4頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PAGE華中科技大學(xué)計(jì)算機(jī)學(xué)院操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告班級:學(xué)號:姓名:指導(dǎo)教師:完成日期:2010-04-02一、實(shí)驗(yàn)?zāi)康模赫莆誏inux操作系統(tǒng)的使用方法;了解Linux系統(tǒng)內(nèi)核代碼結(jié)構(gòu);掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。二、實(shí)驗(yàn)題目:掌握Linux操作系統(tǒng)的使用方法,包括鍵盤命令、系統(tǒng)調(diào)用;掌握在Linux下的編程環(huán)境。編一個(gè)C程序,其內(nèi)容為實(shí)現(xiàn)文件拷貝的功能;編一個(gè)C程序,其內(nèi)容為分窗口同時(shí)顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行結(jié)果。要求用到Linux下的圖形庫。掌握系統(tǒng)調(diào)用的實(shí)現(xiàn)過程,通過編譯內(nèi)核方法,增加一個(gè)新的系統(tǒng)調(diào)用。另編寫一個(gè)應(yīng)用程序,調(diào)用新增加的系統(tǒng)調(diào)用。實(shí)現(xiàn)的功能是:文件拷貝;掌握增加設(shè)備驅(qū)動程序的方法。通過模塊方法,增加一個(gè)新的設(shè)備驅(qū)動程序,其功能可以簡單。實(shí)現(xiàn)字符設(shè)備的驅(qū)動。了解和掌握/proc文件系統(tǒng)的特點(diǎn)和使用方法(1)了解/proc文件的特點(diǎn)和使用方法(2)監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)中若干部件使用情況(3)用圖形界面實(shí)現(xiàn)系統(tǒng)監(jiān)控狀態(tài)。5.設(shè)計(jì)并實(shí)現(xiàn)一個(gè)模擬的文件系統(tǒng)(選做)三、實(shí)驗(yàn)步驟及源代碼:實(shí)驗(yàn)一題目一:源代碼如下:#include<dos.h>#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){ FILE*f1,*f2;f1=fopen("d:\\source1.txt","r");f2=fopen("d:\\source2.txt","w");while(!feof(f1)){fputc(fgetc(f1),f2);}fclose(f1);fclose(f2);printf("拷貝完成!!\n");}創(chuàng)建文件copy.c,輸入源代碼。進(jìn)入終端后使用編譯命令:gcccopy2.c-ocopy2編譯源代碼。然后運(yùn)行新生成文件./copy2,就會把source1.txt內(nèi)的文字復(fù)制到source2.txt中(如果source2.txt不存在則會新建該文件)。結(jié)果如上圖所示。題目二:源代碼如下:3.c:#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<sys/types.h>#include<linux/sem.h>intp1,p2;intmain(void){ if((p1=fork())==0) { execv("./gtk1",NULL); } else { if((p2=fork())==0) { execv("./gtk2",NULL); } else { if(fork()==0) { execv("./gtk3",NULL); } } } return0;}

gtk1.c:#include<gtk/gtk.h>/*傳到這個(gè)函數(shù)的數(shù)據(jù)被打印到標(biāo)準(zhǔn)輸出*/voidcallback(GtkWidget*widget,gpointerdata){g_print("Process1-%swaspressed\n",(char*)data);}/*這個(gè)回調(diào)退出程序*/gintdelete_event(GtkWidget*widget,GdkEvent*event,gpointerdata){gtk_main_quit();returnFALSE;}intmain(intargc,char*argv[]){GtkWidget*window;GtkWidget*button;GtkWidget*table;gtk_init(&argc,&argv);/*創(chuàng)建一個(gè)新窗口*/window=gtk_window_new(GTK_WINDOW_TOPLEVEL);/*設(shè)置窗口標(biāo)題*/gtk_window_set_title(GTK_WINDOW(window),"進(jìn)程一");/*為delete_event設(shè)置一個(gè)立即退出GTK的處理函數(shù)。*/g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(delete_event),NULL);/*設(shè)置窗口的邊框?qū)挾取?/gtk_container_set_border_width(GTK_CONTAINER(window),20);/*創(chuàng)建一個(gè)2x2的表*/table=gtk_table_new(2,2,TRUE);/*將表放進(jìn)主窗口*/gtk_container_add(GTK_CONTAINER(window),table);/*創(chuàng)建第一個(gè)按鈕*/button=gtk_button_new_with_label("button1");/*當(dāng)這個(gè)按鈕被點(diǎn)擊時(shí),我們調(diào)用"callback"函數(shù),并將一個(gè)*指向"button1"的指針作為它的參數(shù)*/g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(callback),(gpointer)"button1");/*將button1插入表的左上象限(quadrant)*/gtk_table_attach_defaults(GTK_TABLE(table),button,0,1,0,1);gtk_widget_show(button);/*創(chuàng)建第二個(gè)按鈕*/button=gtk_button_new_with_label("button2");/*當(dāng)這個(gè)按鈕被點(diǎn)擊時(shí),我們調(diào)用"callback"函數(shù),并將一個(gè)*指向"button2"的指針作為它的參數(shù)*/g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(callback),(gpointer)"button2");/*將button2插入表的右上象限*/gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,0,1);gtk_widget_show(button);/*創(chuàng)建"Quit"按鈕*/button=gtk_button_new_with_label("Quit");/*當(dāng)這個(gè)按鈕被點(diǎn)擊時(shí),我們調(diào)用"delete_event"函數(shù)接著*程序就退出了*/g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(delete_event),NULL);/*將退出按鈕插入表的下面兩個(gè)象限*/gtk_table_attach_defaults(GTK_TABLE(table),button,0,2,1,2);gtk_widget_show(button);gtk_widget_show(table);gtk_widget_show(window);gtk_main();return0;}gtk2.c和gtk3.c的源代碼與gtk1.c的大致相同。依照源代碼分別將gtk1.c、gtk1.c、gtk1.c和3.c文件編寫好。進(jìn)入終端后分別編譯這幾個(gè)文件。編譯gtk1.c的命令為:gccgtk1.c-ogtk2`pkg-config--cflags--libsgtk+-2.0`因?yàn)樵摮绦蚴褂昧薵tk編程,所以需要在后面加上參數(shù)`pkg-config--cflags--libsgtk+-2.0`。編譯3.c的命令與題目一中程序一樣為:gcc3.c-o3編譯完成后會生成相應(yīng)的兩個(gè)可執(zhí)行文件。最后輸入./3即可執(zhí)行main程序,所得結(jié)果如上圖所示,一共建立了3個(gè)進(jìn)程process1、process2和process3。點(diǎn)擊各自的quit按鈕即可關(guān)閉所在的進(jìn)程。實(shí)驗(yàn)二源代碼如下:系統(tǒng)調(diào)用代碼:asmlinkageintsys_filecopy(char*sourceFile,char*distFile)

{

intf1,f2,n;

charbuf[512];

mm_segment_tfs;

if((f1=sys_open(sourceFile,O_RDONLY,0))==-1){

printk("Can'topen%s\n",sourceFile);

sys_exit(-1);

}

if((f2=sys_open(distFile,O_CREAT|O_WRONLY|O_TRUNC,0666))==-1){

printk("Can'tcreat%s,mode%o\n",distFile,0666);

sys_exit(-1);

}

fs=get_fs();

set_fs(get_ds());

while((n=sys_read(f1,buf,512))>0)

{if(sys_write(f2,buf,n)!=n){

printk("writeerroronfile%s",distFile);

sys_exit(-1);

}

}

set_fs(fs);

sys_close(f1);

sys_close(f2);

return0;

filecopy.c(測試代碼):#include<linux/unistd.h>

#include</usr/src/linux-2.6.31.12/arch/x86/include/asm/unistd.h>

#include<stdio.h>

#include<sys/syscall.h>

#define__NR_filecopy337

intmain(intargc,char*argv[])

{

inti;

if(argc!=3)

printf("error!");

else

{

i=syscall(337,argv[0],argv[1]);

printf("ok!");

}

return0;

}實(shí)驗(yàn)步驟如下:1.將內(nèi)核包linux-2.6.31.12.tar解壓到/usr/src下。2.增加新的系統(tǒng)調(diào)用,修改sys.c。使用命令sudogedit/usr/src/linux-2.6.31.12/kernel/sys.c打開sys.c文件,將系統(tǒng)調(diào)用的代碼加入該文件中。3.修改系統(tǒng)調(diào)用表syscall_table_32.S::使用命令sudogedit/usr/src/linux-2.6.31.12/arch/x86/kernel/syscall_table_32.S打開系統(tǒng)調(diào)用表,在最后加上 .longsys_filecopy4.增加新系統(tǒng)調(diào)用號,修改unistd.h使用命令sudogedit/usr/src/linux-2.6.31.12/arch/x86/include/unistd_32.h打開該文件,在其中添加:#define__NR_filecopy337。5.編譯內(nèi)核,依次輸入以下命令:sudocd/usr/src/linux-2.6.31.12sudomakemenuconfigsudomakebzImagesudomakemodulessudomakemodules_installsudocparch/i386/boot/bzImage/boot/vmlinuz-2.6.31.12sudomkinitramfs-oinitrd.img-2.6.31.122.6.31.126.修改grub:使用命令sudogedit/boot/grub/grub.cfg打開grub.cfg文件,仿照文件中的格式加入下列代碼:menuentry"Ubuntu,Linux2.6.31.12"{

insmodntfs

setroot=(hd0,8)

search--no-floppy--fs-uuid--sete67496277495fb0f

loopbackloop0/ubuntu/disks/root.disk

setroot=(loop0)

linux/boot/vmlinuz-2.6.31.12root=/dev/sda8loop=/ubuntu/disks/root.diskroquietsplash

initrd/boot/inird-2.6.31.12.img7.重啟,導(dǎo)入新的內(nèi)核,測試。重啟后選擇Ubuntu,Linux2.6.31.12進(jìn)入,編譯寫好的測試文件filecopy.c。在終端中輸入gccfilecopy.c-ofilecopy編譯源代碼,然后輸入./filecopy1.txt2.txt運(yùn)行新生成文件,如果1.txt不存在,則會報(bào)錯(cuò),若存在,則成功復(fù)制。運(yùn)行結(jié)果如上圖所示,所達(dá)成的功能與實(shí)驗(yàn)一相同。實(shí)驗(yàn)三源代碼如下:device.c(驅(qū)動程序代碼):#include<linux/module.h>

#include<linux/init.h>

#include<linux/fs.h>

#include<asm/uaccess.h>

MODULE_LICENSE("GPL");

#defineMAJOR_NUM147

staticssize_td_read(structfile*,char*,size_t,loff_t*);

staticssize_td_write(structfile*,constchar*,size_t,loff_t*);

staticssize_td_open(structinode*,structfile*);

staticssize_td_release(structinode*,structfile*);

structfile_operationsd_fops=

{

.read=d_read,

.write=d_write,

.open=d_open,

.release=d_release,

};

staticcharvar[1024]="Devicetest:";

intcounter=12;

staticint__initdevice_init(void)

{

intresult;

result=register_chrdev(MAJOR_NUM,"device",&d_fops);

if(result)

{

printk("deviceregisterfailure");

}

else

{

printk("deviceregistersuccess");

}

returnresult;

}

staticvoid__exitdevice_exit(void)

{

unregister_chrdev(MAJOR_NUM,"device");

printk("unloadingthedevice...");

}

staticssize_td_read(structfile*filp,char*buf,size_tlen,loff_t*off)

{

if(copy_to_user(buf,var,1024*sizeof(char)))

{

return-EFAULT;

}

returnsizeof(char);

}

staticssize_td_write(structfile*filp,constchar*buf,size_tlen,loff_t*off)

{

if(copy_from_user(var+counter,buf,len*sizeof(char)))

{

return-EFAULT;

}

counter+=len;

returnsizeof(char);

}

staticssize_td_open(structinode*inode,structfile*file)

{

printk(KERN_INFO"openit!\n");

return0;

}

staticssize_td_release(structinode*inode,structfile*file)

{

printk(KERN_INFO"closeit\n");

return0;

}

module_init(device_init);

module_exit(device_exit);Makefile(Makefile文件):ifneq($(KERNELRELEASE),)#kbuildsyntax.mymodule-objs:=device.oobj-m:=device.oelsePWD:=$(shellpwd)KVER:=$(shelluname-r)KDIR:=/lib/modules/$(KVER)/buildall: $(MAKE)-C$(KDIR)M=$(PWD)clean: rm-f*.cmd*.o*.mod*.koendifsdevice.c(測試程序代碼):#include<sys/types.h>

#include<sys/stat.h>

#include<stdio.h>

#include<fcntl.h>

#include<string.h>

main()

{

intfd;

charbuffer[1024];

intnum;

fd=open("/dev/device",O_RDWR,S_IRUSR|S_IWUSR);

if(fd!=-1)

{

read(fd,buffer,1024*sizeof(char));

printf("Thedeviceis%s\n",buffer);

printf("Pleaseinputthecharacterswrittentodevice:\n");

fgets(buffer,1024,stdin);

num=st

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論