




已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系網(wǎng)站刪除課 程 設(shè) 計(jì) 報(bào) 告課程名稱(chēng): 操作系統(tǒng)課程設(shè)計(jì) 專(zhuān)業(yè)班級(jí): 班 學(xué) 號(hào): 姓 名: 指導(dǎo)教師: 報(bào)告日期: 2016.3.16 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院目錄課程設(shè)計(jì)任務(wù)書(shū)11課程設(shè)計(jì)目的32課程設(shè)計(jì)環(huán)境搭建32.1整體環(huán)境32.2更改root登陸32.3獲取內(nèi)核包32.4安裝GTK環(huán)境43實(shí)驗(yàn)一:熟悉和理解Linux編程環(huán)境53.1編一個(gè)C程序,其內(nèi)容為實(shí)現(xiàn)文件拷貝的功能53.1.1實(shí)驗(yàn)分析53.1.2實(shí)驗(yàn)過(guò)程63.1.3實(shí)驗(yàn)結(jié)果63.2分窗口顯示三個(gè)并發(fā)進(jìn)程運(yùn)行83.2.1實(shí)驗(yàn)分析83.2.2實(shí)驗(yàn)過(guò)程83.2.3實(shí)驗(yàn)結(jié)果104實(shí)驗(yàn)二:掌握系統(tǒng)調(diào)用實(shí)現(xiàn)過(guò)程114.1實(shí)驗(yàn)要求114.2實(shí)驗(yàn)分析114.3實(shí)驗(yàn)過(guò)程114.4實(shí)驗(yàn)結(jié)果185實(shí)驗(yàn)三:掌握增加設(shè)備驅(qū)動(dòng)的方法195.1實(shí)驗(yàn)要求195.2實(shí)驗(yàn)分析195.3實(shí)驗(yàn)過(guò)程195.4實(shí)驗(yàn)結(jié)果246實(shí)驗(yàn)四:使用GTK/QT實(shí)現(xiàn)系統(tǒng)監(jiān)控器256.1實(shí)驗(yàn)要求256.2實(shí)驗(yàn)分析256.3實(shí)驗(yàn)過(guò)程286.4實(shí)驗(yàn)結(jié)果387課設(shè)總結(jié)41此文檔僅供學(xué)習(xí)與交流課程設(shè)計(jì)任務(wù)書(shū)一、 課設(shè)目的1. 掌握Linux操作系統(tǒng)的使用方法;2. 了解Linux系統(tǒng)內(nèi)核代碼結(jié)構(gòu);3. 掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。二、 課設(shè)內(nèi)容1. 掌握Linux操作系統(tǒng)的使用方法,包括鍵盤(pán)命令、系統(tǒng)調(diào)用;掌握在Linux下的編程環(huán)境。a) 編一個(gè)C程序,其內(nèi)容為實(shí)現(xiàn)文件拷貝的功能(使用系統(tǒng)調(diào)用open/read/write.);b) 編一個(gè)C程序,其內(nèi)容為分窗口同時(shí)顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行結(jié)果。要求用到Linux下的圖形庫(kù)。(gtk/Qt)2. 掌握系統(tǒng)調(diào)用的實(shí)現(xiàn)過(guò)程,通過(guò)編譯內(nèi)核方法,增加一個(gè)新的系統(tǒng)調(diào)用。另編寫(xiě)一個(gè)應(yīng)用程序,調(diào)用新增加的系統(tǒng)調(diào)用。a) 內(nèi)核編譯、生成,用新內(nèi)核啟動(dòng);b) 新增系統(tǒng)調(diào)用實(shí)現(xiàn):文件拷貝或P、V操作。3. 掌握增加設(shè)備驅(qū)動(dòng)程序的方法。通過(guò)模塊方法,增加一個(gè)新的設(shè)備驅(qū)動(dòng)程序,其功能可以簡(jiǎn)單(實(shí)現(xiàn)字符設(shè)備的驅(qū)動(dòng))。4. 了解和掌握/proc文件系統(tǒng)的特點(diǎn)和使用方法(一) 了解/proc文件的特點(diǎn)和使用方法;(二) 監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)中若干部件使用情況;(三) 用圖形界面實(shí)現(xiàn)系統(tǒng)監(jiān)控狀態(tài)。5. 設(shè)計(jì)并實(shí)現(xiàn)一個(gè)模擬的文件系統(tǒng)(選做)a) 基于一大文件(10M或100M),模擬磁盤(pán);b) 格式化,建立文件系統(tǒng)管理數(shù)據(jù)結(jié)構(gòu);c) 基本操作,實(shí)現(xiàn)文件、目錄相關(guān)操作。三、 設(shè)計(jì)說(shuō)明實(shí)驗(yàn)環(huán)境 windows +虛擬機(jī)linux或單獨(dú)Linux分區(qū) linux系統(tǒng)版本 Fedora 5.0 6.0 ubuntu 9.0 10.04 14.04. 內(nèi)核版本linux-2.6 Linux-2.31 . 四、 考核要求1. 必須獨(dú)立完成課程設(shè)計(jì)內(nèi)容,不分小組不能有相同的拷貝;2. 上機(jī)考試:學(xué)生根據(jù)老師提出的要求,演示所完成的系統(tǒng);并回答老師的問(wèn)題;3. 課程設(shè)計(jì)報(bào)告,內(nèi)容包括:實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容、實(shí)驗(yàn)設(shè)計(jì)、實(shí)驗(yàn)環(huán)境及步驟、調(diào)試記錄和程序清單(附注釋)。4. 成績(jī) 完成、6065完成、 6575完成、/5 75以上五、 參考資料i. Linux的“man”幫助ii. Linux內(nèi)核2.4版源代碼分析大全iii. Linux內(nèi)核源代碼分析iv. Linux編程白皮書(shū)v. 參考網(wǎng)站 、1 課程設(shè)計(jì)目的1. 掌握Linux操作系統(tǒng)的使用方法;2. 了解Linux系統(tǒng)內(nèi)核代碼結(jié)構(gòu);3. 掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。2 課程設(shè)計(jì)環(huán)境搭建2.1 整體環(huán)境Windows 10上,使用虛擬機(jī)Vmware Workstation軟件搭建的Linux平臺(tái): Ubuntu kylin 14.04(安裝包:ubuntukylin-14.04.2-desktop-amd64.iso) Linux使用內(nèi)核:linux- 更改root登陸在現(xiàn)階段Ubuntu的系統(tǒng)中,是不允許直接以root身份登錄系統(tǒng)的,但是在做課設(shè)的過(guò)程中,需要大量的使用root權(quán)限來(lái)進(jìn)行命令的操作。如果以普通用戶(hù)登錄ubuntu,會(huì)連編輯一個(gè)文件都非常周折。為此,我找到了一種修改系統(tǒng)文件,以達(dá)到直接使用root身份登錄的方法:開(kāi)始的時(shí)候,只能以普通用戶(hù)登錄,用Ctrl+Alt+T打開(kāi)終端:初始化/修改root密碼sudo passwd root設(shè)置登錄面板,使其實(shí)現(xiàn)root登錄進(jìn)入 /usr/share/lightdm/lightdm.conf.d/編輯: 50-unity-greeter.con添加如下代碼,保存退出user-session=ubuntugreeter-show-manual-login=trueall-guest=false然后保存退出,重啟系統(tǒng)。之后就可以輸入root用戶(hù)登錄。2.3 獲取內(nèi)核包 直接進(jìn)入網(wǎng)頁(yè)/pub/ 進(jìn)入文件夾/linux/kernel/v3.x 找到安裝包linux-3.9.4.tar.xz,并下載 解壓命令:tar xjvf linux-source-3.0.0.tar.bz2 C /usr/src 解壓后,在/usr/src目錄下得到內(nèi)核文件夾linux-source- 安裝GTK環(huán)境 安裝gcc/g+/gdb/make 等基本編程工具apt-get install build-essential 如果提示由于依賴(lài)項(xiàng)不能安裝,需要使用apt的強(qiáng)化版aptitude,這個(gè)工具可以自動(dòng)分析軟件包依賴(lài),系統(tǒng)一般不自帶,需要先安裝,具體過(guò)程是:apt-get install aptitudeaptitude install build-essentialaptitude這個(gè)工具很強(qiáng)大,對(duì)于解決軟件包安裝時(shí)的依賴(lài)問(wèn)題很有幫助。 安裝 libgtk2.0-dev libglib2.0-dev 等開(kāi)發(fā)相關(guān)的庫(kù)文件:apt-get install gnome-core-devel 安裝GTK核心組件: apt-get install libgtk2.0-dev3 實(shí)驗(yàn)一:熟悉和理解Linux編程環(huán)境3.1 編一個(gè)C程序,其內(nèi)容為實(shí)現(xiàn)文件拷貝的功能3.1.1 實(shí)驗(yàn)分析文件拷貝的C程序主要用到如下幾個(gè)函數(shù):open:打開(kāi)文件close:關(guān)閉文件read:讀操作write:寫(xiě)操作open函數(shù)有兩個(gè)形式.如下:int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode);其中pathname是我們要打開(kāi)的文件名(包含路徑名稱(chēng),缺省是認(rèn)為在 當(dāng)前路徑下面),flags可以去下面的一個(gè)值或者是幾個(gè)值的組合,組合使用時(shí)候用豎線“|”隔開(kāi)。flags:O_RDONLY:以只讀的方式打開(kāi)文件. O_WRONLY:以只寫(xiě)的方式打開(kāi)文件. O_RDWR:以讀寫(xiě)的方式打開(kāi)文件. O_APPEND:以追加的方式打開(kāi)文件. O_CREAT:創(chuàng)建一個(gè)文件. /創(chuàng)建一個(gè)不存在的文件。O_TRUNC:如果文件已經(jīng)存在,則刪除文件的內(nèi)容. mode:S_IRUSR (可讀)S_IWUSR (可寫(xiě))S_IXUSR(可執(zhí)行)S_IRWXU (可讀、寫(xiě)、執(zhí)行)S_IRGRP (組可以讀)S_IROTH (其他人可以讀)read、write函數(shù)形式如下:read(int fd, const void *buf, size_t length)write(int fd, const void *buf, size_t length)3.1.2 實(shí)驗(yàn)過(guò)程設(shè)置緩沖區(qū):#define BUF_SIZE 1024 /緩沖區(qū)大小進(jìn)行拷貝過(guò)程:/* 系統(tǒng)調(diào)用創(chuàng)建并打開(kāi)目標(biāo)文件 */ if (fin = open( argv1, O_RDONLY) = -1) printf(Error in oen source file!); return -1; /* 系統(tǒng)調(diào)用創(chuàng)建并打開(kāi)目標(biāo)文件 */ if (fout = open( argv2,O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR) = -1) printf(Error in open target file!); return -1; while(copy_count=read(fin,buf,BUF_SIZE) /* 拷貝文件 */ if (copy_count = -1 | write(fout,buf,copy_count) = -1) printf(Error in copy file!); return -1; 3.1.3 實(shí)驗(yàn)結(jié)果編譯copy.c生成可執(zhí)行文件copy,執(zhí)行copy前,源文件source.txt內(nèi)容如圖3-1。圖 31文件test.txt見(jiàn)圖3-2。圖 32執(zhí)行./copy source.txt test.txt命令后,test.txt內(nèi)容見(jiàn)圖3-3。由圖知,文件source.txt的內(nèi)容正確得完成了拷貝。圖 333.2 分窗口顯示三個(gè)并發(fā)進(jìn)程運(yùn)行3.2.1 實(shí)驗(yàn)分析通俗的講,程序是一個(gè)包含可以執(zhí)行代碼的文件 ,是一個(gè)靜態(tài)的文件。而進(jìn)程是一個(gè)開(kāi)始執(zhí)行但是還沒(méi)有結(jié)束的程序的實(shí)例。一個(gè)程序可能有許多進(jìn)程,而每一個(gè)進(jìn)程又可以有許多子進(jìn)程。依次循環(huán)下去,而產(chǎn)生子進(jìn)程。為了區(qū)分各個(gè)不同的進(jìn)程,系統(tǒng)給每一個(gè)進(jìn)程分配了一個(gè)ID(就象我們的身份證)以便識(shí)別。為了充分的利用資源,系統(tǒng)還對(duì)進(jìn)程區(qū)分了不同的狀態(tài),將進(jìn)程分為新建,運(yùn)行,阻塞,就緒和完成五個(gè)狀態(tài)。當(dāng)一個(gè)進(jìn)程調(diào)用了fork以后,系統(tǒng)會(huì)創(chuàng)建一個(gè)子進(jìn)程。這個(gè)子進(jìn)程和父進(jìn)程不同的地方只有他的進(jìn)程ID和父進(jìn)程ID,其他的都是一樣,就像父進(jìn)程克隆(clone)自己一樣。當(dāng)然創(chuàng)建兩個(gè)一模一樣的進(jìn)程是沒(méi)有意義的。為了區(qū)分父進(jìn)程和子進(jìn)程,我們必須跟蹤fork的返回值. 當(dāng)fork調(diào)用失敗的時(shí)候(內(nèi)存不足或者是用戶(hù)的最大進(jìn)程數(shù)已到)fork返回-1,否則fork的返回值有重要的作用.對(duì)于父進(jìn)程fork返回子進(jìn)程的ID,而對(duì)于fork子進(jìn)程返回0.我們可以根據(jù)這個(gè)返回值來(lái)區(qū)分父子進(jìn)程。在準(zhǔn)備好GTK 2.0的環(huán)境之后,GTK程序與編譯普通的C程序需要用到不同的命令。編譯命令為:gcc xx.c -o xxx pkg-config cflags -libs gtk+-2.0。其中pkgconfig讀取GTK附帶的.pc文件來(lái)決定編譯GTK程序需要的編譯選項(xiàng),pkgconfig -cflags gtk+-2.0列出include目錄,pkgconfig -libs gtk+-2.0列出編譯連接庫(kù)。3.2.2 實(shí)驗(yàn)過(guò)程這里需要用到課程實(shí)驗(yàn)時(shí)的fork( )程序以及GTK的圖形顯示。 基本fork()程序,調(diào)用顯示一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程的結(jié)構(gòu)如下: if(pid_1=fork()=0) printf(Child 1# is running.n);/第一個(gè)子進(jìn)程 Child 1#show(argc,argv,This is Child 1#);/調(diào)用函數(shù)顯示窗口 else if(pid_2=fork()=0) printf(Child 2# is running.n);/第二個(gè)子進(jìn)程 Child 2# show(argc,argv,This is Child 2#);/調(diào)用函數(shù)顯示窗口 else printf(Parent # is running.n);/父進(jìn)程 Parent # /由于父進(jìn)程需要顯示全部子進(jìn)程PID,所以這里直接用參數(shù)畫(huà)窗口 調(diào)用GTK顯示窗體函數(shù)模塊的結(jié)構(gòu):void show(int argc,char *argv ,char *title ) gtk_init (&argc, &argv); /初始化工具包并且獲取命令行參數(shù); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /創(chuàng)建新的窗口; /設(shè)定窗口的位置; gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);/監(jiān)聽(tīng)窗口的destroy事件;g_signal_connect (G_OBJECT (window), destroy,G_CALLBACK (destroy_progress), NULL); gtk_window_set_title (GTK_WINDOW (window), title);/用來(lái)設(shè)定更改窗口標(biāo)題; gtk_container_set_border_width (GTK_CONTAINER (window), 20);/設(shè)定寬度;/使用gtk_vbox_new函數(shù)建立縱向組裝盒; /為了顯示構(gòu)件,必須將構(gòu)件放入組裝盒中,并將組裝盒放在窗口內(nèi); vbox = gtk_vbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (vbox), 100);/設(shè)定寬度; gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); /使用gtk_box_pack_start函數(shù)將構(gòu)件放到組裝盒中; sprintf (id_char, %s ,My ID:%d, title,getpid ();/顯示PID號(hào) label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); gtk_widget_show (label); sprintf (id_char, 父進(jìn)程ID:%d, getppid ();/顯示PPID號(hào) 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);/關(guān)閉窗口按鈕 /信號(hào)登記函數(shù),監(jiān)聽(tīng)按鈕的clicked事件。/當(dāng)窗口clicked時(shí), gtk_widget_destroy 就會(huì)被調(diào)用。 /而 gtk_widget_destroy 函數(shù)又調(diào)用 gtk_main_quit() 結(jié)束程序運(yùn)行。 g_signal_connect_swapped (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); /函數(shù)顯示窗口中的組件 gtk_widget_show (button); gtk_widget_show (window); /準(zhǔn)備將窗口和所有的組件顯示在屏幕上,函數(shù)必須在GTK程序的最后調(diào)用. gtk_main ();3.2.3 實(shí)驗(yàn)結(jié)果圖 344 實(shí)驗(yàn)二:掌握系統(tǒng)調(diào)用實(shí)現(xiàn)過(guò)程4.1 實(shí)驗(yàn)要求(1) 內(nèi)核編譯、生成,用新內(nèi)核啟動(dòng);(2) 新增系統(tǒng)調(diào)用實(shí)現(xiàn):文件拷貝或P、V操作。4.2 實(shí)驗(yàn)分析在這一個(gè)部分,因?yàn)榫幾g內(nèi)核的原因,投入了比較多的時(shí)間??偨Y(jié)起來(lái),主要有這么幾個(gè)方面: linux內(nèi)核版本的不同,linux2.X和linux3.X直接添加系統(tǒng)調(diào)用和重新編譯內(nèi)核的方法有差異,甚至linux2.X之間,內(nèi)核文件也有變化。 相關(guān)資料的步驟和方法不盡相同,甚至還有互斥的步驟,這就使得這個(gè)推進(jìn)比較漫長(zhǎng)。我之前的Ubuntu版本是14.04,內(nèi)核版本是3.18.0后來(lái)編譯一遍之后,莫名原因行不通。只好換了一個(gè)和網(wǎng)上教程一樣的低版本的內(nèi)核3.9.4,經(jīng)過(guò)自己的實(shí)際工作,下面是在運(yùn)行成功之后,總結(jié)的一個(gè)過(guò)程。(環(huán)境和內(nèi)核配置見(jiàn)本報(bào)告第二部分)4.3 實(shí)驗(yàn)過(guò)程進(jìn)入內(nèi)核文件夾/usr/src/linux-3.9.41) 修改Makefile文件,修改系統(tǒng)版本后綴:如下圖4-1所示:這里加的是本人的姓名的首字母,以示區(qū)分。圖 412) 添加系統(tǒng)調(diào)用函數(shù),修改文件:/kernel/sys.c,在最后加入新的系統(tǒng)調(diào)用函數(shù),拷貝函數(shù)實(shí)現(xiàn)。如下所示:asmlinkage int sys_zcycopyfile(const char* s_file, const char* t_file) const int BUF_SIZE = 512; int fin,fout; char bufBUF_SIZE; int copy_count; mm_segment_t fs; /段操作的初始化 fs = get_fs(); set_fs(get_ds();/* 系統(tǒng)調(diào)用打開(kāi)源文件,若失敗,返回-1 */ if (fin = sys_open(s_file,O_RDONLY,S_IRUSR) = -1) return -1; printk(Error in oen source file!); /* 系統(tǒng)調(diào)用創(chuàng)建并打開(kāi)目標(biāo)文件,若失敗,返回-2 */ if (fout = sys_open(t_file,O_RDWR | O_CREAT | O_TRUNC,S_IRUSR | S_IWUSR) = -1) return -2; printk(Errod in open target file!); while(copy_count=sys_read(fin,buf,BUF_SIZE) /* 拷貝文件,若失敗,返回-3 */ if (copy_count = -1 | sys_write(fout,buf,copy_count) = -1) return -3; printk(Error in copy file!); set_fs(fs); /* 段操作結(jié)束 */ return 0; 3) 添加系統(tǒng)調(diào)用號(hào),修改文件:/arch/x86/syscalls/syscall_32.tbl,在最后加入自定義的系統(tǒng)調(diào)用號(hào)。如圖4-2圖 424) 添加聲明到頭文件,修改頭文件:/include/linux/syscalls.h,如圖4-3圖 43當(dāng)用戶(hù)程序需要系統(tǒng)提供服務(wù)的時(shí)候,比如351號(hào)調(diào)用sys_zjxcopyfile,就會(huì)通過(guò)系統(tǒng)調(diào)用產(chǎn)生一個(gè)int 0x80的軟中斷,就會(huì)進(jìn)入到系統(tǒng)調(diào)用的入口函數(shù),找到這個(gè)調(diào)用函數(shù)表查找入口函數(shù),也就是這里的sys_zjxcopyfile,進(jìn)而在sys.c中找到具體的函數(shù)實(shí)現(xiàn)asmlinkage int sys_zcycopyfile(const char* s_file, const char* t_file) ,從而實(shí)現(xiàn)系統(tǒng)調(diào)用。Tips:內(nèi)核編譯過(guò)程由于實(shí)驗(yàn)中未截圖,引用參考教程截圖,鏈接:/Linux/2013-06/85335p3.htm、5) 配置內(nèi)核:(先進(jìn)入解壓的內(nèi)核包文件夾)a) 清除殘留的.conf和.o文件:make mrproper圖 44 make mrproperb) 安裝ncurses環(huán)境: apt-get install libncurses5-devncurses是一個(gè)能提供基于文本終端窗口功能的動(dòng)態(tài)庫(kù), 提供字符終端處理庫(kù),包括面板和菜單。c) 對(duì)內(nèi)核選項(xiàng)進(jìn)行配置make menuconfig執(zhí)行命令之后,會(huì)彈出一個(gè)框,提示對(duì)內(nèi)核裁剪或配置。這次用不到變化內(nèi)核模塊,直接用鍵盤(pán)方向鍵選項(xiàng)就行了。圖 45 make menuconfigd) 確定依賴(lài)性make dep圖 46 確認(rèn)依賴(lài)性e) 刪除配置時(shí)留下的一些不用文件make clean這一步一般沒(méi)動(dòng)作,除非是失敗后再次編譯內(nèi)核時(shí)要用到。6) 編譯內(nèi)核:a) 編譯內(nèi)核文件bzImage:make bzImage j9這一步耗費(fèi)的時(shí)間比較長(zhǎng),所以加了一個(gè) -j9,這種方法使用多線程編程,實(shí)際使用時(shí)發(fā)現(xiàn)能很大的提高效率。(這個(gè)視CPU而定,要看CPU最多支持幾個(gè)線程)b) 編譯內(nèi)核模塊:make modules j9 圖 47 make bzImage圖 48 make modules7) 安裝modulesmake moudules_install8) 建立載入ramdisk的映像文件mkinitramfs -o /boot/initrd-linux3.9.4.img 3.9.4圖 49 載入ramdisk的映像文件9) 安裝內(nèi)核make install圖 410 make install10) 配置grub引導(dǎo)程序圖 411 配置grub11) 重啟之后,按esc進(jìn)入啟動(dòng)項(xiàng)引導(dǎo)界面,如圖4-12:圖 41212) 進(jìn)入新系統(tǒng)之后,輸入命令uname a / -r查看系統(tǒng)新版本:執(zhí)行情況如下圖4-13所示??芍呀?jīng)成功的進(jìn)入到修改后的新內(nèi)核3.9.4.zjx13) 編寫(xiě)測(cè)試程序zcopy.c,如所示:#include #include int main(int argc,char*argv) if(argc!=3) printf(You need to input the file you want to copy!); return 0; int i = syscall(351,argv1,argv2); /*351為系統(tǒng)調(diào)用號(hào)*/ printf(Now copying.n); if( i = 0 ) printf(Successful!n); else printf(Error!n); return 1;4.4 實(shí)驗(yàn)結(jié)果編譯運(yùn)行結(jié)果如下:圖 413 源文件source.txt圖 414 待粘貼文件target.txt執(zhí)行程序后:圖 415圖 416粘貼后的target.txt5 實(shí)驗(yàn)三:掌握增加設(shè)備驅(qū)動(dòng)的方法5.1 實(shí)驗(yàn)要求掌握增加設(shè)備驅(qū)動(dòng)程序的方法。通過(guò)模塊方法,增加一個(gè)新的設(shè)備驅(qū)動(dòng)程序,其功能可以簡(jiǎn)單。如:實(shí)現(xiàn)字符設(shè)備的驅(qū)動(dòng)5.2 實(shí)驗(yàn)分析Linux內(nèi)核中的設(shè)備驅(qū)動(dòng)程序是一組常駐內(nèi)存的具有特權(quán)的共享庫(kù),是低級(jí)硬件處理例程。對(duì)用戶(hù)程序而言,設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)節(jié),對(duì)各種不同設(shè)備提供了一致的接口,一般來(lái)說(shuō)是把設(shè)備映射為一個(gè)特殊的設(shè)備文件,用戶(hù)程序可以象對(duì)其它文件一樣對(duì)此設(shè)備文件進(jìn)行操作。Linux支持3種設(shè)備:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。設(shè)備由一個(gè)主設(shè)備號(hào)和一個(gè)次設(shè)備號(hào)標(biāo)識(shí)。主設(shè)備號(hào)唯一標(biāo)識(shí)了設(shè)備類(lèi)型,即設(shè)備驅(qū)動(dòng)程序類(lèi)型,它是塊設(shè)備表或字符設(shè)備表中設(shè)備表項(xiàng)的索引。次設(shè)備號(hào)僅由設(shè)備驅(qū)動(dòng)程序解釋,一般用于識(shí)別在若干可能的硬件設(shè)備中,I/O請(qǐng)求所涉及到的那個(gè)設(shè)備。 一個(gè)典型的驅(qū)動(dòng)程序,大體上可以分為這么幾個(gè)部分: 1) 注冊(cè)設(shè)備:在系統(tǒng)初啟,或者模塊加載時(shí)候,必須將設(shè)備登記到相應(yīng)的設(shè)備數(shù)組,并返回設(shè)備的主設(shè)備號(hào); 2) 定義功能函數(shù):對(duì)于每一個(gè)驅(qū)動(dòng)函數(shù)來(lái)說(shuō),都有一些和此設(shè)備密切相關(guān)的功能函數(shù)。以最常用的塊設(shè)備或者字符設(shè)備來(lái)說(shuō),都存在著諸如 open()、read()這一類(lèi)的操作。當(dāng)系統(tǒng)調(diào)用這些調(diào)用時(shí),將自動(dòng)的使用驅(qū)動(dòng)函數(shù)中特定的模塊。來(lái)實(shí)現(xiàn)具體的操作;3) 卸載設(shè)備:在不用這個(gè)設(shè)備時(shí),可以將它卸載,主要是從/proc 中取消這個(gè)設(shè)備的特殊文件。 5.3 實(shí)驗(yàn)過(guò)程1) 編寫(xiě)Makefile文件如下:ifneq ($(KERNELRELEASE),) #kbuild syntax.mymoudule-bojs := test.oobj-m := fzdriver.o else#PWD為當(dāng)前目錄、KVER為當(dāng)前內(nèi)核版本PWD :=$(shell pwd)KVER :=$(shell uname -r)KDIR :=/lib/modules/$(KVER)/buildall:#調(diào)用內(nèi)核模塊編譯$(MAKE) -C $(KDIR) M=$(PWD)clean:#rm -f *.cmd *.o *.mod *.korm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions#$(MAKE) -C $(KDIR) M=$(PWD) cleanEndif調(diào)用Makefile文件之后,其具體過(guò)程如下:a) KERNELRELEASE是在內(nèi)核源碼的頂層Makefile中定義的一個(gè)變量,在第一次讀取執(zhí)行此Makefile時(shí),KERNELRELEASE沒(méi)有被定義,所以make將讀取執(zhí)行else之后的內(nèi)容;b) 如果make的目標(biāo)是clean,直接執(zhí)行clean操作,然后結(jié)束。c) 當(dāng)make的目標(biāo)為all時(shí),-C $(KDIR)指明跳轉(zhuǎn)到內(nèi)核源碼目錄下讀取那里的Makefile;M=$(PWD) 表明然后返回到當(dāng)前目錄繼續(xù)讀入、執(zhí)行當(dāng)前的Makefile。d) 當(dāng)從內(nèi)核源碼目錄返回時(shí),KERNELRELEASE已被定義,內(nèi)核的build程序Kbuild也被啟動(dòng)去解析kbuild語(yǔ)法的語(yǔ)句,make將繼續(xù)讀取else之前的內(nèi)容。e) else之前的內(nèi)容為kbuild語(yǔ)法的語(yǔ)句,指明模塊源碼中各文件的依賴(lài)關(guān)系,以及要生成的目標(biāo)模塊名。2) 編寫(xiě)設(shè)備功能函數(shù):(fzdriver.c)#include #include #include #include #include #include #define MY_MAJOR 666/定義設(shè)備號(hào)碼char *s1;char *s2;/打開(kāi)設(shè)備int fzdriver_open(struct inode *inode, struct file *filp) printk(.fzdriver_openn); return 0;/讀數(shù)據(jù)ssize_t fzdriver_read(struct file *filp, char _user *buf, size_t count, loff_t *f_pos)sprintf(s2,%s,s1);if(count12)&(!copy_to_user(buf,s2,count) return 0;else if(!copy_to_user(buf,s2,strlen(s2) return 0;else return -1;/寫(xiě)數(shù)據(jù)ssize_t fzdriver_write(struct file *filp, char _user *buf, size_t count, loff_t *f_pos) if (count0) return -EINVAL; else if (s1=NULL) return -ENOMEM; else if (copy_from_user(s1, buf, count+1) return -EFAULT; else return count;/釋放設(shè)備int fzdriver_release(struct inode *inode, struct file *filp) printk(.fzdriver_releasen); return 0;struct file_operations fzdriver_fops = .owner = THIS_MODULE, .open = fzdriver_open, .read = fzdriver_read, .write = fzdriver_write, .release = fzdriver_release,;/設(shè)備初始化static int fzdriver_init(void) int rc; /分配內(nèi)存 s1 = (char *)kmalloc(32,GFP_KERNEL); s2 = (char *)kmalloc(64,GFP_KERNEL); printk(.Test fzdriver devn); rc = register_chrdev(MY_MAJOR, fzdriver, &fzdriver_fops); /注冊(cè)設(shè)備 if(rc 0) printk(.register %s dev errorn, fzdriver); /失敗返回錯(cuò)誤 return -1; printk(.register fzdriver dev OKn); /成功注冊(cè) return 0;static void fzdriver_exit(void) unregister_chrdev(MY_MAJOR, fzdriver); /注銷(xiāo)設(shè)備 printk(.Good Bye!n);MODULE_LICENSE(GPL);module_init(fzdriver_init);module_exit(fzdriver_exit);3) 設(shè)備加載,安裝過(guò)程如下:a) 進(jìn)入Makefile文件和zcydriver.c文件所在目錄,清除make產(chǎn)生的殘留文件。命令為:make clean b) 刪除先前可能加載過(guò)的模塊,命令為:rmmod /dev/zcydriverc) 卸載設(shè)備:rm /dev/zcydriverd) 編譯設(shè)備文件,產(chǎn)生模塊文件makee) 加載模塊insmod zcydriver.kof) 加載設(shè)備,分配設(shè)別號(hào)mknod /dev/zcydriver c 240 0g) 更改用戶(hù)對(duì)設(shè)備的操作權(quán)限為可讀、可寫(xiě)chmod 666 /dev/zcydriver4) 編寫(xiě)測(cè)試程序(test.c)#include #include #include #include #include #define DEVICE /dev/fzdriver int main(void)int fd;char out33;char in34;fd = open(/dev/fzdriver, O_RDWR);/打開(kāi)設(shè)備 if(fd = -1) printf(1.啟動(dòng)設(shè)備fzdriver失??!n); return -1; memset(out,0,sizeof(out); printf(1.啟動(dòng)設(shè)備成功!nn); read(fd,out,sizeof(out); printf(2.設(shè)備fzdriver中保存的信息是:n%snn,out); memset(out,0,sizeof(out); printf(3.請(qǐng)輸入你想寫(xiě)入到fzdriver的信息:n); fgets(in,34,stdin); write(fd,in,sizeof(in); /將輸入寫(xiě)入設(shè)備 read(fd,out,sizeof(out); /讀出設(shè)備的信息并打印 printf(n4.設(shè)備fzdriver中的信息被更改為:%sn,out); close(fd);/釋放設(shè)備圖 51 編譯過(guò)程5.4 實(shí)驗(yàn)結(jié)果運(yùn)行測(cè)試程序,檢驗(yàn)設(shè)備是否可讀寫(xiě):檢測(cè)程序見(jiàn)報(bào)告附錄的源代碼,測(cè)試過(guò)程如下圖5-2、5-3所示:圖 52圖 536 實(shí)驗(yàn)四:使用GTK/QT實(shí)現(xiàn)系統(tǒng)監(jiān)控器6.1 實(shí)驗(yàn)要求(1) 了解/proc文件的特點(diǎn)和使用方法;(2) 監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)中若干部件使用情況;(3) 用圖形界面實(shí)現(xiàn)系統(tǒng)監(jiān)控狀態(tài)。6.2 實(shí)驗(yàn)分析(1) /proc 文件特點(diǎn): Linux的proc文件系統(tǒng)是進(jìn)程文件系統(tǒng)和內(nèi)核文件系統(tǒng)的組成的復(fù)合體,是將內(nèi)核數(shù)據(jù)對(duì)象化為文件形式進(jìn)行存取的一種內(nèi)存文件系統(tǒng),是監(jiān)控內(nèi)核的一種用戶(hù)接口。它擁有一些特殊的文件(純文本),從中可以獲取系統(tǒng)狀態(tài)信息。 /proc/cpuinfo保存CPU信息,包括名稱(chēng)、型號(hào)、數(shù)目、主頻、Cache等; /proc/version保存操作系統(tǒng)信息,包括系統(tǒng)版本、內(nèi)核型號(hào)、GCC版本等; /proc/stat保存CPU活動(dòng)信息數(shù)據(jù),用來(lái)測(cè)算CPU使用率; /proc/meminfo保存內(nèi)存空間和交換空間實(shí)時(shí)大小,可用來(lái)計(jì)算內(nèi)存和交換分區(qū)使用率,MemTotal表示內(nèi)存空間總大小,MemFree表示內(nèi)存剩余空間大小,SwapTotal表示交換分區(qū)總大小,SwapFree表示交換分區(qū)剩余空間大小。據(jù)此可以算出內(nèi)存和交換分區(qū)的使用率。(2) myExplor結(jié)構(gòu)/* main */*菜單欄*/void Menu_bar(GtkWidget *vbox);void ShowAbout(void);void ShutDown(void);/*狀態(tài)欄*/gint State_bar(gpointer data);/* 1 */void CreatePageFour(GtkWidget *notebook);void DrawingCPU(void);gint refresh_cpu(gpointer data);static gboolean cpu_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data);static gboolean cpu_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data);float getCpuUseRatio(int n);void GetCpuInfo();void GetInfo(char *path, char *name, char info);GtkWidget *draw_cpu;GtkWidget *window;GtkWidget *labelofcpu; /cpu rateGtkWidget *infolabel; /cpu infomationGdkPixmap *cpu_graph;/* 全局變量 */static gint cpuPoints100;static gfloat cpu_rate = 0.0;float zuser = 0, ztotal = 0, zidle = 0;char cpuBuffer2000;/* 2 */typedef struct _proc_info_st char name256; char pid20; char state20; char vmsize20; char priority20; char ppid20;proc_info;/*進(jìn)程信息*/void CreatePageTwo(GtkWidget *notebook);/*進(jìn)程操作*/gint ShowProcInfo(gpointer data); /顯示進(jìn)程信息void ReadProc(proc_info *ft, const char* path); /讀取進(jìn)程void ReadLine(FILE *fp, char *buff, int bufflen, int line); /讀取線程void SearchProcByPID(gpointer data); /PID號(hào)查找進(jìn)程void KillProcess(gpointer data);void ProcessRun(gpointer data); /運(yùn)行進(jìn)程void SetEntryInfo(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data);static GtkWidget *entry;GtkWidget *clist;/* 3 */void CreatePageThree(GtkWidget *notebook);void DrawingMM();void GetMmInfo();int GetValueFromString(char *string);void DrawingSWAP();gint refresh_mm();gint refresh_swap();GtkWidget *draw_mm;GtkWidget *window;GtkWidget *labelofmm;GtkWidget *mminfolabel;GdkPixmap *mm_graph;static gint mmPoints100;static gint swapPoints100;static gfloat mm_rate = 0.0;static gfloat swap_rate = 0.0;gdo
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育科技的力量?jī)?yōu)化教學(xué)流程
- 挖掘教育大數(shù)據(jù)潛力無(wú)限的決策支持系統(tǒng)
- 超市收銀員培訓(xùn)手冊(cè)
- 全球創(chuàng)新藥研發(fā)成本控制與效益分析2025年研究報(bào)告
- Cationomycin-生命科學(xué)試劑-MCE
- 新疆維吾爾自治區(qū)七校聯(lián)考2024-2025學(xué)年九年級(jí)化學(xué)第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)模擬試題含解析
- 唐山師范學(xué)院《農(nóng)產(chǎn)品市場(chǎng)營(yíng)銷(xiāo)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025屆江蘇省邗江區(qū)化學(xué)九上期末綜合測(cè)試試題含解析
- 寧夏師范學(xué)院《數(shù)理統(tǒng)計(jì)與隨機(jī)過(guò)程》2023-2024學(xué)年第一學(xué)期期末試卷
- 公路貨運(yùn)行業(yè)數(shù)字化轉(zhuǎn)型與綠色運(yùn)輸模式創(chuàng)新報(bào)告
- 腹壁下動(dòng)脈損傷的血管重建新技術(shù)
- (正式版)HGT 6312-2024 化工園區(qū)競(jìng)爭(zhēng)力評(píng)價(jià)導(dǎo)則
- 施工成品保護(hù)方案及措施
- 醫(yī)保按病種分值付費(fèi)(DIP)院內(nèi)培訓(xùn)
- 檢修安全培訓(xùn)教材
- 2020長(zhǎng)沙市一中新高一入學(xué)分班考試試卷
- 洗浴中心的物業(yè)管理方案
- 人教版七年級(jí)(初一)數(shù)學(xué)上冊(cè)全冊(cè)標(biāo)準(zhǔn)課講義終稿(教師版)
- 鹽酸安羅替尼三線治療非小細(xì)胞肺癌(NSCLC)的療效和安全性的III期臨床試驗(yàn)
- 二手車(chē)買(mǎi)賣(mài)合同電子版下載
- YS/T 534.5-2007氫氧化鋁化學(xué)分析方法第5部分:氧化鈉含量的測(cè)定
評(píng)論
0/150
提交評(píng)論