




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 可行性研究合同范本
- 甘肅土地流轉(zhuǎn)合同范本
- 化肥農(nóng)藥購買合同范本
- 一般租賃合同范本
- 冷柜租賃合同范本
- 寫農(nóng)業(yè)合作社合同范本
- 名宿托管簽約合同范本
- 做微商城合同范本
- 供用熱合同范本
- 酒店轉(zhuǎn)讓經(jīng)營合同范本
- 《胸外按壓》課件
- 2024屆南通二模(又蘇北七市二模)數(shù)學(xué)試題
- 北師大版六年級下冊書法練習(xí)指導(dǎo)教案教學(xué)設(shè)計(jì)
- 江西省南昌市2024屆高三一模語文試題及答案解析
- 2023年小學(xué)音樂2022版新課程標(biāo)準(zhǔn)考試測試題及答案(共五套)
- 第一章村集體經(jīng)濟(jì)組織會計(jì)制度講解
- 湖北煙草公司招聘考試真題
- 2024年江蘇護(hù)理職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- -藝術(shù)博覽會與藝術(shù)品拍賣
- 保健滋補(bǔ)品行業(yè)報(bào)告
- 2024智能燃?xì)獗硗ㄓ眉夹g(shù)要求
評論
0/150
提交評論