第一篇:操作系統(tǒng)課程設(shè)計(jì)
課程實(shí)驗(yàn)報(bào)告
課程名稱:
操作系統(tǒng)原理課程設(shè)計(jì)
專業(yè)班級: 學(xué)
號: 姓
名 指導(dǎo)教師: 報(bào)告日期:
計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院
目錄
1.實(shí)驗(yàn)?zāi)康?...........................................................................................................................4 2.實(shí)驗(yàn)環(huán)境..........................................................................................................................4 3.實(shí)驗(yàn)內(nèi)容..........................................................................................................................4 3.1 實(shí)驗(yàn)一....................................................................................................................4 3.2 實(shí)驗(yàn)二....................................................................................................................4 3.3 實(shí)驗(yàn)三....................................................................................................................5 3.4 實(shí)驗(yàn)四....................................................................................................................5 4.實(shí)驗(yàn)設(shè)計(jì)..........................................................................................................................5 4.1 實(shí)驗(yàn)一....................................................................................................................5 4.1.1 文件拷貝......................................................................................................5 4.1.2 并發(fā)進(jìn)程分窗口顯示....................................................................................5 4.2 實(shí)驗(yàn)二....................................................................................................................6.....................................................................................................................................6 4.3 實(shí)驗(yàn)三....................................................................................................................6 4.4 實(shí)驗(yàn)四....................................................................................................................7 5.實(shí)驗(yàn)步驟..........................................................................................................................8 5.1 實(shí)驗(yàn)一.............................................................................................................8 5.1.1 文件拷貝......................................................................................................8 5.1.2 并發(fā)進(jìn)程分窗口顯示....................................................................................9 5.2 實(shí)驗(yàn)二..................................................................................................................14 5.3 實(shí)驗(yàn)三..................................................................................................................15 2 5.4 實(shí)驗(yàn)四..................................................................................................................17 6.調(diào)試記錄........................................................................................................................19 7.心得體會........................................................................................................................21 8.程序清單........................................................................................................................22 8.1實(shí)驗(yàn)一...................................................................................................................22 8.1.1 文件拷貝....................................................................................................22 8.1.2并發(fā)進(jìn)程窗口顯示......................................................................................23 8.2實(shí)驗(yàn)二...................................................................................................................33 8.3實(shí)驗(yàn)三...................................................................................................................34 8.4實(shí)驗(yàn)四...................................................................................................................38
1.實(shí)驗(yàn)?zāi)康?/p>
(1)掌握Linux操作系統(tǒng)的使用方法;(2)了解Linux系統(tǒng)內(nèi)核代碼結(jié)構(gòu);(3)掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。
2.實(shí)驗(yàn)環(huán)境
本次課程設(shè)計(jì)采用的操作系統(tǒng)環(huán)境是Windows7、Ubuntu雙系統(tǒng),Ubuntu系統(tǒng)版本為15.04,內(nèi)核版本是Linux 3.19。
3.實(shí)驗(yàn)內(nèi)容
3.1 實(shí)驗(yàn)一
1)編寫一個(gè)C程序,用fread、fwrite等庫函數(shù)實(shí)現(xiàn)文件拷貝功能。
2)編寫一個(gè)C程序,使用基于文本的終端圖形編程庫(curses)或圖形界面(QT/GTK),分窗口顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行(一個(gè)窗口實(shí)時(shí)顯示當(dāng)前時(shí)間,一個(gè)窗口實(shí)時(shí)監(jiān)測CPU的利用率,一個(gè)窗口做1到100的累加求和,刷新周期分別為1秒,2秒和3秒)。
3.2 實(shí)驗(yàn)二
采用編譯內(nèi)核的方法,添加一個(gè)新的系統(tǒng)調(diào)用實(shí)現(xiàn)文件拷貝功能 編寫一個(gè)應(yīng)用程序,測試新加的系統(tǒng)調(diào)用
3.3 實(shí)驗(yàn)三
采用模塊方法,添加一個(gè)新的字符設(shè)備的驅(qū)動程序,實(shí)現(xiàn)打開/關(guān)閉、讀/寫等基本操作,編寫一個(gè)應(yīng)用程序,測試添加的驅(qū)動程序。
3.4 實(shí)驗(yàn)四
1)了解/proc文件的特點(diǎn)和使用方法。2)監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)部件的使用情況。
3)用圖形界面監(jiān)控系統(tǒng)狀態(tài),包括CPU和內(nèi)存利用率、所有進(jìn)程信息等(可自己補(bǔ)充、添加其他功能)。
4.實(shí)驗(yàn)設(shè)計(jì)
4.1 實(shí)驗(yàn)一
4.1.1 文件拷貝
實(shí)現(xiàn)文件拷貝功能需要使用的函數(shù)是fopen、fgetc、fputc,由命令行參數(shù)獲取2個(gè)文件名,根據(jù)其文件名和路徑分別打開該2個(gè)文件,設(shè)置循環(huán),使用fgetc和fputc函數(shù)每次從源文件復(fù)制1個(gè)字節(jié)到目的文件,直到源文件指針到文件尾,實(shí)現(xiàn)文件拷貝操作。4.1.2 并發(fā)進(jìn)程分窗口顯示
使用圖形界面GTK實(shí)現(xiàn)窗口的顯示,使用fork()創(chuàng)建三個(gè)并發(fā)進(jìn)程: pid=fork():創(chuàng)建子進(jìn)程。
返回值:0
從子進(jìn)程返回 >0
從父進(jìn)程返回
exit進(jìn)程自我終止,進(jìn)入僵死狀態(tài) wait()等待進(jìn)程終止(由父進(jìn)程調(diào)用)exec()執(zhí)行一個(gè)可執(zhí)行程序(文件)。
4.2 實(shí)驗(yàn)二
不同的Linux內(nèi)核版本編譯內(nèi)核和添加系統(tǒng)調(diào)用的方法不盡相同,在網(wǎng)上查閱了資料之后找到適合3.19版本內(nèi)核的編譯方法。
所謂系統(tǒng)調(diào)用,即Linux內(nèi)核中設(shè)置了一組用于實(shí)現(xiàn)各種系統(tǒng)功能的子程序,稱為系統(tǒng)調(diào)用,用戶可以通過系統(tǒng)調(diào)用命令在自己的應(yīng)用程序中調(diào)用它們。其調(diào)用機(jī)制為:使用寄存器中適當(dāng)?shù)闹堤D(zhuǎn)到內(nèi)核中事先定義好的代碼中執(zhí)行:跳轉(zhuǎn)到系統(tǒng)調(diào)用的總?cè)肟趕ystem_call,檢查系統(tǒng)調(diào)用號,再查找系統(tǒng)調(diào)用表sys_call_table,調(diào)用內(nèi)核函數(shù),最后返回。
實(shí)驗(yàn)二目的是更改內(nèi)核中系統(tǒng)調(diào)用模塊,增加自定義函數(shù)實(shí)現(xiàn)文件拷貝功能。
4.3 實(shí)驗(yàn)三
Linux設(shè)備驅(qū)動程序是一組常駐內(nèi)存的具有特權(quán)的共享庫,是低級硬件處理例程,每個(gè)設(shè)備文件有兩個(gè)設(shè)備號,主設(shè)備號標(biāo)識驅(qū)動程序,從設(shè)備號表示使用 6 同一個(gè)設(shè)備驅(qū)動程序的不同硬件設(shè)備。
設(shè)備驅(qū)動程序的功能包括:對設(shè)備初始化和釋放,把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù),讀取應(yīng)用程序傳給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請求的數(shù)據(jù),檢測和處理設(shè)備出現(xiàn)的錯(cuò)誤。
Linux支持的設(shè)備包括三種:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。添加設(shè)備驅(qū)動程序大致需要以下幾個(gè)步驟:
1.注冊設(shè)備 2.定義功能函數(shù) 3.卸載設(shè)備
4.4 實(shí)驗(yàn)四
proc文件系統(tǒng)特點(diǎn):
1.進(jìn)程文件系統(tǒng)和內(nèi)核文件系統(tǒng)組成的復(fù)合體
2.將內(nèi)核數(shù)據(jù)對象化為文件形式進(jìn)行存取的一種內(nèi)存文件系統(tǒng)
3.監(jiān)控內(nèi)核的一種用戶接口,擁有一些特殊的純文本文件,從中可以獲取系統(tǒng)狀態(tài)信息
4.系統(tǒng)信息:與進(jìn)程無關(guān),隨系統(tǒng)配置的不同而不同 5.進(jìn)程信息:系統(tǒng)中正在運(yùn)行的每一個(gè)用戶級進(jìn)程的信息 其中各個(gè)文件保存的信息如下: /proc/cmd/line: 內(nèi)核啟動的命令行 /proc/cpuinfo: CPU信息
/proc/stat: CPU的使用情況、磁盤、頁面、交換、所有的中斷、最后一次的啟動 7 時(shí)間等
/proc/meminfo: 內(nèi)存狀態(tài)的有關(guān)信息
利用/proc文件獲取系統(tǒng)狀態(tài)信息,并通過GTK圖形化編程將系統(tǒng)信息以及通過這些信息計(jì)算得出的如CPU利用率、內(nèi)存使用等通過窗口顯示出來。
5.實(shí)驗(yàn)步驟
5.1 實(shí)驗(yàn)一
5.1.1 文件拷貝
文件拷貝主要是利用文件指針操作,在源文件和目的文件之間進(jìn)行字符的復(fù)制,拷貝之前要判斷源文件是否存在以及能否打開,這需要設(shè)置一個(gè)判斷語句,同時(shí)也要設(shè)置判斷語句判斷目的文件是否存在,若不存在需要能夠創(chuàng)建一個(gè)目的文件,最后執(zhí)行循環(huán)拷貝。
步驟如下:
1.在Linux終端使用編譯命令:gcc mycopy.c-o mycopy產(chǎn)生可執(zhí)行文件。2.創(chuàng)建源文件wangzihao目的文件shaochongjun。3.編輯源文件:
4.打開可執(zhí)行程序:./mycopy wangzihao shaochongjun 5.查看目的文件發(fā)現(xiàn)已經(jīng)實(shí)現(xiàn)拷貝:
6.若源文件不存在會報(bào)錯(cuò):
5.1.2 并發(fā)進(jìn)程分窗口顯示
1.使用fork()函數(shù)創(chuàng)建三個(gè)進(jìn)程,使用exec函數(shù)族實(shí)現(xiàn)程序的調(diào)用:
2.調(diào)用創(chuàng)建窗口函數(shù)init_window(),將進(jìn)程中的信息在窗口中顯示:
3.分別創(chuàng)建三個(gè)程序?qū)崿F(xiàn)顯示系統(tǒng)時(shí)間、CPU利用率、累加求和功能:
4.運(yùn)行結(jié)果如下:
5.2 實(shí)驗(yàn)二
原內(nèi)核版本:3.19.0 編譯新內(nèi)核版本:3.19.8 1.下載內(nèi)核并解壓
2.系統(tǒng)調(diào)用函數(shù)實(shí)現(xiàn):修改kernel/sys.c文件,在文件的最后添加新的系統(tǒng)調(diào)用函數(shù):sys_mycall(char* sourceFile,char* destFile)3.設(shè)置系統(tǒng)調(diào)用號:修改arch/x86/syscalls/syscall_32.tbl,在最后一行添加新的系統(tǒng)調(diào)用號
4.添加系統(tǒng)調(diào)用聲明到頭文件 :~$ vi include/asm-generic/syscalls.h 在#endif前添
#ifndef sys_mycall asmlinkage long sys_mycall(long number);#endif
5.安裝基本編譯套件:apt-get install build-essential kernal-package libncurses5-dev fakeroot 6.配置內(nèi)核:make menuconfig 7.編譯內(nèi)核:make-j4 8.安裝內(nèi)核:make modules_install make install 9.重啟進(jìn)入新的內(nèi)核
10.編寫測試程序測試新的系統(tǒng)調(diào)用:
測試結(jié)果如下:
5.3 實(shí)驗(yàn)三
1.編寫Makefile文件:
2.編寫設(shè)備功能函數(shù):(見程序清單)
3.設(shè)備加載:make clean make
加載模塊:insmod wzhdriver.ko
輸入 cat /proc/devices得 設(shè)備驅(qū)動的主設(shè)備號為:
加載 設(shè)備,分配設(shè)備號:mknod /dev/wzhdriver c 248 0
更改操作權(quán)限:chmod 666 /dev/wzhdriver 4.運(yùn)行測試程序,結(jié)果:
5.4 實(shí)驗(yàn)四
1系統(tǒng)信息頁:
2進(jìn)程信息頁:
3內(nèi)存資源頁:
6.調(diào)試記錄
1.在編譯gtk程序時(shí),需要添加` pkg-config --cflags--libs gtk+-3.0`.參數(shù)。2.實(shí)驗(yàn)一程序過于簡單,健壯性不大。
3.由于一開始沒有加入刷新函數(shù),導(dǎo)致實(shí)驗(yàn)一顯示窗口數(shù)據(jù)不變化,在同學(xué)幫助下改正。
4.編譯內(nèi)核占用大量時(shí)間后來發(fā)現(xiàn)在make后添加-j4可以大大提升速度。
7.心得體會
本次課程設(shè)計(jì)主要目的是熟悉Linux系統(tǒng),掌握Linux操作系統(tǒng)的使用方法,了解Linux系統(tǒng)內(nèi)核代碼結(jié)構(gòu),掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。由于剛開始接觸Linux,實(shí)驗(yàn)的開始遇到了不少困難,GTK的安裝和使用花費(fèi)了我不少時(shí)間,并行程序是操作系統(tǒng)課程學(xué)過的內(nèi)容,主要難點(diǎn)是圖形化界面的設(shè)計(jì)。
實(shí)驗(yàn)二是耗費(fèi)時(shí)間最多的,由于每個(gè)版本的內(nèi)核編譯方式不同,耗費(fèi)了大量時(shí)間查找編譯內(nèi)核的方法,同時(shí)編譯一次內(nèi)核需要一個(gè)小時(shí)以上,不過皇天不負(fù)有心人最后我成功添加了系統(tǒng)調(diào)用。
添加設(shè)備驅(qū)動比較簡單,主要是了解了Linux設(shè)備驅(qū)動的原理,熟悉設(shè)備驅(qū)動的安裝過程。
分析/proc文件主要是搭建圖形化界面,在借鑒了網(wǎng)上資源設(shè)計(jì)的窗口之后,我設(shè)計(jì)了簡單的監(jiān)控系統(tǒng)圖形界面,其中CPU利用率以及占用曲線等需要計(jì)算。通過本次實(shí)驗(yàn)我學(xué)到了很多東西,熟悉了Linux系統(tǒng)的使用方法,對Linux系統(tǒng)內(nèi)核代碼結(jié)構(gòu)有了大致的了解,掌握了圖形化界面GTK的使用,總而言之本次試驗(yàn)我獲益匪淺。
8.程序清單
8.1實(shí)驗(yàn)一
8.1.1 文件拷貝 #include
if(argc!=3)
{ printf(“Error in argc!n”);return 0;
}
FILE * fsource=NULL;
FILE * ftarget=NULL;
if((fsource=fopen(argv[1],“rb”))==NULL)
{ printf(“Fail to open source file!n”);return 0;
}
if((ftarget=fopen(argv[2],“wb”))==NULL)
{ printf(“Fail to open target file!n”);22 return 0;
}
int c;
while((c=fgetc(fsource))!=EOF)
{ fputc(c,ftarget);
}
fclose(fsource);
fclose(ftarget);
return 0;} 8.1.2并發(fā)進(jìn)程窗口顯示
主函數(shù):
#include
if((time=fork())==-1){
}
if(time==0){ execlp(“./time”,0);printf(“fork errorn”);return-1;}else {
if((cpu=fork())==-1)//create cpu {
} if(cpu==0){ execlp(“./cpu”,0);printf(“fork errorn”);return-1;}else 24
{ if((sum=fork())==-1)//create sum
{
printf(“fork errorn”);
return-1;
}
if(sum==0)
{
execlp(“./sum”,0);
}else //father process
{
wait(&time);
wait(&cpu);
wait(&sum);
}
}
}
} 系統(tǒng)時(shí)間:
#include char t[50];GtkWidget *label;gettime(){ time_t timep; time(&timep); sprintf(t,“%s”,ctime(&timep));} void *thread(void * argc){ while(1){ gettime(); gtk_label_set_text(GTK_LABEL(label),t); sleep(1);} } int main(int argc, char *argv[]){ pthread_t id; int i,ret; ret=pthread_create(&id,NULL,(void *)thread,NULL);26 GtkWidget *vbox; GtkWidget *window; //定義一個(gè)組裝盒; /*初始化整個(gè)GTK+程序,是每一個(gè)GTK+程序必不可少的部分*/ gtk_init(&argc, &argv); /*這里生成了一個(gè)窗口構(gòu)件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的標(biāo)題欄和邊框,同意用窗口管理器來進(jìn)行管理*/ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), “time”); gtk_window_set_default_size(GTK_WINDOW(window), 300, 200); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); label = gtk_label_new(t); gtk_container_add(GTK_CONTAINER(window), label); gtk_widget_show(label); /*開始顯示窗口*/ gtk_widget_show(window); gtk_main(); return 0;} CPU利用率: #include #include } float cpu(){ FILE* fp;char buf[128];char cpu[5];long int user,nice,sys,idle,iowait,irq,softirq;float usage;while(1){ } sleep(2);usage=cpu();sprintf(c,“the usage of cpu is %f %%”,usage);gtk_label_set_text(GTK_LABEL(label), c);28 fp=fopen(“/proc/stat”,“r”);if(fp==NULL)printf(“errorn”);long int all1,all2,idle1,idle2;float usage;fgets(buf,sizeof(buf),fp); sscanf(buf,“%s%ld%ld%ld%ld%ld%ld%ld”,cpu,&user,&nice,&sys,&idle,&iowait,&irq,&softirq); sscanf(buf,“%s%ld%ld%ld%ld%ld%ld%ld”,cpu,&user,&nice,&sys,&idle,&iall1=user+nice+sys+idle+iowait+irq+softirq;idle1=idle;rewind(fp);//second sleep(1);memset(buf,0,sizeof(buf));cpu[0]='