華中科技大學(xué)計(jì)算機(jī)學(xué)院操作系統(tǒng)課程設(shè)計(jì)報(bào)告[1]_第1頁
華中科技大學(xué)計(jì)算機(jī)學(xué)院操作系統(tǒng)課程設(shè)計(jì)報(bào)告[1]_第2頁
華中科技大學(xué)計(jì)算機(jī)學(xué)院操作系統(tǒng)課程設(shè)計(jì)報(bào)告[1]_第3頁
華中科技大學(xué)計(jì)算機(jī)學(xué)院操作系統(tǒng)課程設(shè)計(jì)報(bào)告[1]_第4頁
華中科技大學(xué)計(jì)算機(jī)學(xué)院操作系統(tǒng)課程設(shè)計(jì)報(bào)告[1]_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、.華中科技大學(xué)嵌入式操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告 院 系: 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專 業(yè): 班 級: 姓 名: 指導(dǎo)老師: 報(bào)告時(shí)間: 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院目 錄1.課程設(shè)計(jì)目的32.課程設(shè)計(jì)環(huán)境搭建33.內(nèi)容一:熟悉和理解Linux編程環(huán)境3.1 內(nèi)容要求53.2 設(shè)計(jì)過程及實(shí)現(xiàn)54.內(nèi)容二:掌握添加系統(tǒng)調(diào)用的方法4.1 內(nèi)容要求94.2 設(shè)計(jì)過程及實(shí)現(xiàn)95.內(nèi)容三:掌握添加設(shè)備驅(qū)動(dòng)程序的方法5.1 內(nèi)容要求 175.2 設(shè)計(jì)過程及實(shí)現(xiàn) 176.內(nèi)容四:理解和分析/proc文件6.1 內(nèi)容要求 226.2 設(shè)計(jì)過程及實(shí)現(xiàn) 221 課程設(shè)計(jì)目的(1)掌握Linux操作系統(tǒng)的使用方法;(2)了解Lin

2、ux系統(tǒng)內(nèi)核代碼結(jié)構(gòu);(3)掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。2 課程設(shè)計(jì)環(huán)境搭建(1)windows 7上,利用虛擬機(jī)軟件VMware軟件搭建的linux平臺:Ubuntu 11.10 (安裝包:ubuntu-11.10-desktop-i386)內(nèi)核:linux-headers-3.0.0-12-generic (2)更改root登錄:在現(xiàn)階段Ubuntu的系統(tǒng)中,是不允許直接以root身份登錄系統(tǒng)的,但是在做課設(shè)的過程中,需要大量的使用root權(quán)限來進(jìn)行命令的操作。如果以普通用戶登錄ubuntu,會連編輯一個(gè)文件都非常周折。為此,我找到了一種修改系統(tǒng)文件,以達(dá)到直接使用root身份登錄的方法:

3、開始的時(shí)候,只能以普通用戶登錄,用Ctrl+Alt+T打開終端:初始化/修改root密碼sudo passwd root用vi編輯器修改這個(gè)文件:sudo vi /etc/lightdm/lightdm.conf 在文件最后加入這么一行代碼:greeter-show-manual-login=true然后保存退出,sudo reboot 重啟系統(tǒng)。之后就可以輸入root用戶登錄。(3)在添加系統(tǒng)調(diào)用中用到的其他內(nèi)核包:下載和當(dāng)前實(shí)驗(yàn)環(huán)境最為接近的系統(tǒng)版本(這點(diǎn)很重要)使用apt-get install linux-source-3.0.0 命令,下載結(jié)果是linux-source-3.0.0.

4、tar.bz2 解壓命令:tar xjvf linux-source-3.0.0.tar.bz2 C /usr/src解壓后,在/usr/src目錄下得到內(nèi)核文件夾linux-source-3.0.0(4)在調(diào)用linux圖形庫時(shí)需要安裝GTK環(huán)境:安裝gcc/g+/gdb/make 等基本編程工具apt-get install build-essential Tip:如果提示由于依賴項(xiàng)不能安裝,需要使用apt的強(qiáng)化版aptitude,這個(gè)工具可以自動(dòng)分析軟件包依賴,系統(tǒng)一般不自帶,需要先安裝,具體過程是:apt-get install aptitudeaptitude install bui

5、ld-essentialaptitude這個(gè)工具很強(qiáng)大,對于解決軟件包安裝時(shí)的依賴問題很有幫助。安裝 libgtk2.0-dev libglib2.0-dev 等開發(fā)相關(guān)的庫文件:apt-get install gnome-core-devel 安裝GTK核心組件: apt-get install libgtk2.0-dev這個(gè)安裝完成后,GTK環(huán)境就基本搭建成功,網(wǎng)上有些教程說要安裝其他配置文件,經(jīng)我親測,發(fā)現(xiàn)只要安裝libgtk2.0-dev這個(gè)包就能搞定。3 內(nèi)容一:熟悉和理解Linux編程環(huán)境3.1 內(nèi)容要求(1)編寫一個(gè)C程序,實(shí)現(xiàn)文件拷貝功能(2)編寫一個(gè)C程序,使用Linux下的

6、圖形庫,分窗口顯示三個(gè)并發(fā)進(jìn)程運(yùn)行;3.2 設(shè)計(jì)過程及實(shí)現(xiàn)(1)文件拷貝: 文件的拷貝主要的思想就是利用文件指針操作,在兩個(gè)文件之間進(jìn)行按字符的fget和fput。從而完成整個(gè)文件的拷貝操作。在這個(gè)基本功能之外,需要增加程序的健壯性,具體有以下幾個(gè)方面:·源文件是否存在且能讀取數(shù)據(jù);·是否能創(chuàng)建目的文件,且能向里面寫入數(shù)據(jù);·程序需要的argc參數(shù)個(gè)數(shù)是否滿足要求; 基于以上幾點(diǎn)和內(nèi)容要求,主要的程序段如下:if(argc!=3)/判斷參數(shù)個(gè)數(shù)是否為3 ,否則返回printf("Error in argc!n");return 0;if( (f

7、source=fopen(argv1,"rb")=NULL )printf("Error in open source file!n");/判斷源文件是否能打開和讀出return 0;if( (ftarget=fopen(argv2,"wb")=NULL )printf("Error in open target file!n");/判斷目的文件時(shí)候能創(chuàng)建和寫入return 0;while(c=fgetc(fsource)!=EOF)fputc(c,ftarget);/按字符讀取和寫入數(shù)據(jù) 執(zhí)行結(jié)果如下:將sour

8、ce/source.txt文件拷貝到到target.txt,開始時(shí)如下圖3-1所示:圖3-1 復(fù)制開始前source/source.txt文件內(nèi)容利用mycopy程序復(fù)制,查看target.txt文件復(fù)制結(jié)果如下圖3-2所示:圖3-2 復(fù)制后target.txt文件的具體內(nèi)容(2)實(shí)現(xiàn)三個(gè)進(jìn)程之間的并發(fā)程序:這里需要用到課程實(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#sh

9、ow(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ù)畫窗口 調(diào)用GTK顯示窗體函數(shù)模塊的結(jié)構(gòu)

10、: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)聽窗口的destroy事件;g_signal_connect (G_OBJECT (window), "destroy",

11、 G_CALLBACK (destroy_progress), NULL); gtk_window_set_title (GTK_WINDOW (window), title);/用來設(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_CONTA

12、INER (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號 label = gtk_label_new (id_char); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); gtk_

13、widget_show (label); sprintf (id_char, "父進(jìn)程ID:%d", getppid ();/顯示PPID號 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)閉窗口按鈕 /信號登記函數(shù),監(jiān)聽按鈕的clicked事件。/當(dāng)窗口clicked時(shí),

14、 gtk_widget_destroy 就會被調(diào)用。 /而 gtk_widget_destroy 函數(shù)又調(diào)用 gtk_main_quit() 結(jié)束程序運(yùn)行。 g_signal_connect_s (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_widg

15、et_grab_default (button); /函數(shù)顯示窗口中的組件 gtk_widget_show (button); gtk_widget_show (window); /準(zhǔn)備將窗口和所有的組件顯示在屏幕上,函數(shù)必須在GTK程序的最后調(diào)用. gtk_main (); 編譯代碼forkgtk.c,運(yùn)行;編譯命令為:gcc -o forkgtk forkgtk.c pkg-config -cflags -libs gtk+-2.0程序運(yùn)行結(jié)果如下圖3-3所示:圖3-3 三個(gè)并行顯示窗口4.內(nèi)容二:掌握添加系統(tǒng)調(diào)用的方法4.1 內(nèi)容要求(1)采用編譯內(nèi)核的方法,添加一個(gè)新的系統(tǒng)調(diào)用。(2)

16、編寫一個(gè)應(yīng)用程序,測試新添加的系統(tǒng)調(diào)用。(3)系統(tǒng)調(diào)用的功能:文件拷貝。4.2 設(shè)計(jì)過程及實(shí)現(xiàn)在這一個(gè)部分,投入了比較多的時(shí)間??偨Y(jié)起來,主要有這么幾個(gè)方面:·linux內(nèi)核版本的不同,linux2.X和linux3.X直接添加系統(tǒng)調(diào)用和重新編譯內(nèi)核的方法有差異,甚至linux2.X之間,內(nèi)核文件也有變化。·再加上相關(guān)資料的步驟和方法不盡相同,甚至還有互斥的步驟,這就使得這個(gè)推進(jìn)比較漫長。我之前的Ubuntu版本是13.04,后來發(fā)現(xiàn)因?yàn)槭?4位的,行不通,只好換了一個(gè)低版本的Ubuntu11.10,經(jīng)過自己的實(shí)際工作,下面是在運(yùn)行成功之后,總結(jié)的一個(gè)過程。(環(huán)境和內(nèi)核配置

17、見本報(bào)告第二部分)(1)修改Makefile文件,修改系統(tǒng)版本后綴:如下圖4-1所示:這里加的是本人的姓名的首字母,以示區(qū)分。圖4-1 修改Makefile文件版本(2)修改/usr/src/ linux-source-3.0.0/kernel/目錄下的sys.c文件,在最后加入新的系統(tǒng)調(diào)用,拷貝函數(shù)實(shí)現(xiàn)。如下所示:asmlinkage int sys_zcycopy char* s_file, const char* t_file) const int BUF_SIZE = 512; int fin,fout; char bufBUF_SIZE; int copy_count; mm_seg

18、ment_t fs; /段操作的初始化 fs = get_fs(); set_fs(get_ds();/* 系統(tǒng)調(diào)用打開源文件,若失敗,返回-1 */ if (fin = sys_open(s_) = -1) return -1; printk("Error in oen source file!"); /* 系統(tǒng)調(diào)用創(chuàng)建并打開目標(biāo)文件,若失敗,返回-2 */ if (fout = sys_open(t_ | O_CREAT | O_TRUNC,S_IRUSR | S_IWUSR) = -1) return -2; printk("Errod in open ta

19、rget 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)修改/usr/src/ linux-source-3.0.0/arch/x86/include/asm/文件夾下面頭文件:unistd_3

20、2.h,在文件的系統(tǒng)調(diào)用號部分添加一個(gè)新的系統(tǒng)調(diào)用,具體添加行如下:#define _NR_sys_zcycopy同時(shí)把下面的總調(diào)用號加1,變成348。具體截圖如下圖4-2所示。圖4-2 添加系統(tǒng)調(diào)用號(4)修改/usr/src/ linux-source-3.0.0/x86/kernel/syscall_table_32.s,加入新的一行: .long sys_zcycopyfile/* 347 */具體實(shí)現(xiàn)如下圖4-3所示:圖4-3 填寫系統(tǒng)調(diào)用入口表 當(dāng)用戶程序需要系統(tǒng)提供服務(wù)的時(shí)候,比如347號調(diào)用sys_zcycopyfile,就會通過系統(tǒng)調(diào)用產(chǎn)生一個(gè)int 0x80的軟中斷,就會進(jìn)

21、入到系統(tǒng)調(diào)用的入口函數(shù),找到這個(gè)調(diào)用函數(shù)表查找入口函數(shù),也就是這里的.long sys_zcycopyfile,進(jìn)而在sys.c中找到具體的函數(shù)實(shí)現(xiàn)asmlinkage int sys_zcycopy char* s_file, const char* t_file) ,從而實(shí)現(xiàn)系統(tǒng)調(diào)用。(5)配置內(nèi)核:(先cd到下載的新的內(nèi)核包)凈化解壓后的源代碼make mrproper安裝ncurses環(huán)境: apt-get install libncurses5-devncurses是一個(gè)能提供基于文本終端窗口功能的動(dòng)態(tài)庫, 提供字符終端處理庫,包括面板和菜單。對內(nèi)核選項(xiàng)進(jìn)行配置make menuco

22、nfig執(zhí)行命令之后,會彈出一個(gè)框,提示對內(nèi)核裁剪或配置。這次用不到變化內(nèi)核模塊,直接用鍵盤方向鍵選<EXIT>項(xiàng)就行了。建立模塊間的依賴信息make dep這一步正常情況會提示用戶多此一舉刪除配置時(shí)留下的一些不用的文件make clean這一步一般沒動(dòng)作,除非是失敗后再次編譯內(nèi)核時(shí)要用到。(6)編譯內(nèi)核:編譯內(nèi)核文件bzImage:make bzImage j9這一步耗費(fèi)的時(shí)間比較長,所以加了一個(gè) -j9,這種方法使用多線程編程,實(shí)際使用時(shí)發(fā)現(xiàn)能很大的提高效率。(這個(gè)視CPU而定,要看CPU最多支持幾個(gè)線程)編譯內(nèi)核模塊:make modules j9 (7)安裝內(nèi)核經(jīng)過最麻煩的

23、編譯內(nèi)核,接下來的安裝內(nèi)核就顯得容易多了,輸入命令sudo make modules_install 安裝內(nèi)核模塊sudo make install 安裝內(nèi)核同樣,如果嫌時(shí)間太慢的話,同樣可以在最后加上 j9 (8)環(huán)境修改:接下來主要是將編譯安裝生成的操作系統(tǒng)讓系統(tǒng)引導(dǎo)程序“知道”,具體過程如下圖4-4所示:圖4-4 環(huán)境修改具體如下:復(fù)制內(nèi)核到boot目錄:cp arch/i386/boot/bzImage /boot/vmlinuz-3.0.69.zcy 可利用Tab快速補(bǔ)全路徑和文件,這樣方便又不容易出錯(cuò)。建立要載入ramdisk的映像文件mkinitramfs 3.0.69.zcy

24、-o /boot/initrd.img-3.0.69-zcy更新啟動(dòng)項(xiàng)文件grub2.conf,直接輸入命令update-grub2就行。(9)最后需要修改/boot/grub/ 目錄下 grub.cfg文件;進(jìn)入文件之后,按 Ctrl+F 查找 timeout ,將所有的timeout數(shù)值改為100;這個(gè)數(shù)值的單位是秒,這么做的目的是修改啟動(dòng)項(xiàng)的暫停時(shí)間,以便讓用戶有足夠的時(shí)間選擇要進(jìn)入的操作系統(tǒng)。(10)重啟,進(jìn)入新系統(tǒng):啟動(dòng)項(xiàng)如下圖4-5所示:圖4-5 系統(tǒng)啟動(dòng)項(xiàng)原版本內(nèi)核比新內(nèi)核小,入口在Previous Linux version 目錄下,如下圖4-6所示:以上做的工作相當(dāng)于在添加新

25、的系統(tǒng)調(diào)用的同時(shí)還更新了系統(tǒng)。圖4-6 舊的系統(tǒng)入口顯示(11)進(jìn)入新系統(tǒng)之后,輸入命令uname a / -r查看系統(tǒng)新版本:執(zhí)行情況如下圖4-7所示。可知已經(jīng)成功的進(jìn)入到修改后的新內(nèi)核3.0.69.zcy圖4-7 顯示新內(nèi)核信息(12)編寫測試程序zcopy.c,如下圖4-8所示:圖4-8 測試程序,檢測新的第347號系統(tǒng)調(diào)用(13)編譯運(yùn)行,生成執(zhí)行文件。然后看執(zhí)行程序是否可以實(shí)現(xiàn)文件的拷貝,執(zhí)行結(jié)果如下圖4-9和圖4-10所示,可看到已經(jīng)成功的實(shí)現(xiàn)了預(yù)計(jì)的功能。圖4-9 執(zhí)行程序圖4-10 程序執(zhí)行顯示結(jié)果5.內(nèi)容三:掌握添加設(shè)備驅(qū)動(dòng)程序的方法5.1 內(nèi)容要求(1)采用模塊方法,添加一

26、個(gè)新的設(shè)備驅(qū)動(dòng)程序。(2)要求添加字符設(shè)備的驅(qū)動(dòng)。(3)編寫一個(gè)應(yīng)用程序,測試添加的驅(qū)動(dòng)程序5.2 設(shè)計(jì)過程及實(shí)現(xiàn) (1)Linux內(nèi)核中的設(shè)備驅(qū)動(dòng)程序是一組常駐內(nèi)存的具有特權(quán)的共享庫,是低級硬件處理例程。對用戶程序而言,設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)節(jié),對各種不同設(shè)備提供了一致的接口,一般來說是把設(shè)備映射為一個(gè)特殊的設(shè)備文件,用戶程序可以象對其它文件一樣對此設(shè)備文件進(jìn)行操作。 Linux支持3種設(shè)備:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。設(shè)備由一個(gè)主設(shè)備號和一個(gè)次設(shè)備號標(biāo)識。主設(shè)備號唯一標(biāo)識了設(shè)備類型,即設(shè)備驅(qū)動(dòng)程序類型,它是塊設(shè)備表或字符設(shè)備表中設(shè)備表項(xiàng)的索引。次設(shè)備號僅由設(shè)備驅(qū)動(dòng)程序解釋,一般用于

27、識別在若干可能的硬件設(shè)備中,I/O請求所涉及到的那個(gè)設(shè)備。 一個(gè)典型的驅(qū)動(dòng)程序,大體上可以分為這么幾個(gè)部分: 注冊設(shè)備:在系統(tǒng)初啟,或者模塊加載時(shí)候,必須將設(shè)備登記到相應(yīng)的設(shè)備數(shù)組,并返回設(shè)備的主設(shè)備號; 定義功能函數(shù):對于每一個(gè)驅(qū)動(dòng)函數(shù)來說,都有一些和此設(shè)備密切相關(guān)的功能函數(shù)。以最常用的塊設(shè)備或者字符設(shè)備來說,都存在著諸如 open()、read()這一類的操作。當(dāng)系統(tǒng)調(diào)用這些調(diào)用時(shí),將自動(dòng)的使用驅(qū)動(dòng)函數(shù)中特定的模塊。來實(shí)現(xiàn)具體的操作;卸載設(shè)備:在不用這個(gè)設(shè)備時(shí),可以將它卸載,主要是從/proc 中取消這個(gè)設(shè)備的特殊文件。 (2)編寫Makefile文件如下:ifneq ($(KERNELR

28、ELEASE),) obj-m := zcydriver.o /obj-m表示編譯連接后將生成zcydriver.o模塊elsePWD :=$(shell pwd)/PWD為當(dāng)前目錄KVER :=$(shell uname -r)/KVER為當(dāng)前系統(tǒng)內(nèi)核版本KDIR :=/lib/modules/$(KVER)/buildall:$(MAKE) -C $(KDIR) M=$(PWD)/調(diào)用內(nèi)核模塊編譯clean:#rm -f *.cmd *.o *.mod *.korm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions#$(MAKE) -C $(KDIR) M

29、=$(PWD) cleanendif調(diào)用Makefile文件之后,其具體過程如下:KERNELRELEASE是在內(nèi)核源碼的頂層Makefile中定義的一個(gè)變量,在第一次讀取執(zhí)行此Makefile時(shí),KERNELRELEASE沒有被定義,所以make將讀取執(zhí)行else之后的內(nèi)容;如果make的目標(biāo)是clean,直接執(zhí)行clean操作,然后結(jié)束。當(dāng)make的目標(biāo)為all時(shí),-C $(KDIR)指明跳轉(zhuǎn)到內(nèi)核源碼目錄下讀取那里的Make$(PWD) 表明然后返回到當(dāng)前目錄繼續(xù)讀入、執(zhí)行當(dāng)前的Makefile。當(dāng)從內(nèi)核源碼目錄返回時(shí),KERNELRELEASE已被定義,內(nèi)核的build程序Kbuild

30、也被啟動(dòng)去解析kbuild語法的語句,make將繼續(xù)讀取else之前的內(nèi)容。else之前的內(nèi)容為kbuild語法的語句,指明模塊源碼中各文件的依賴關(guān)系,以及要生成的目標(biāo)模塊名。(3)編寫設(shè)備功能函數(shù):(zcydriver.c)函數(shù)框架如下所示:#define MY_MAJOR 240/定義設(shè)備號int zcydriver_open(struct inode *inode, struct file *filp)/打開設(shè)備ssize_t zcydriver_read(struct file *filp, char _user *buf, size_t count, loff_t *f_pos )/

31、讀數(shù)據(jù)sprintf(s2,"%s",s1);if(count<12) if(!copy_to_user(buf,s2,count)return 0;elseif(!copy_to_user(buf,s2,strlen(s2)return 0;return -1;ssize_t zcydriver_write(struct file *filp, char _user *buf, size_t count, loff_t *f_pos)/寫數(shù)據(jù) if (count < 0)return -EINVAL; if (s1 = NULL)return -ENOMEM;

32、 if (copy_from_user(s1, buf, count+1)return -EFAULT; return count;int zcydriver_release(struct inode *inode, struct file *filp)/釋放設(shè)備struct zcydriver_fops = / .owner = THIS_MODULE, .open = zcydriver_open, .read = zcydriver_read, .write = zcydriver_write, .release = zcydriver_release,;static int zcydr

33、iver_init(void)/設(shè)備初始化 rc = register_chrdev(MY_MAJOR, "zcydriver", &zcydriver_fops);/注冊if(rc < 0) printk(".register %s dev errorn", "zcydriver"); /失敗返回錯(cuò)誤 return -1; printk(".register zcydriver dev OKn");/成功注冊設(shè)備 return 0;static void zcydriver_exit(void) u

34、nregister_chrdev(MY_MAJOR, "zcydriver");/注銷設(shè)備 printk(".Good Bye!n");MODULE_LICENSE("GPL");module_init(zcydriver_init);module_exit(zcydriver_exit);(4)設(shè)備加載,安裝過程如下:進(jìn)入Makefile文件和zcydriver.c文件所在目錄,清除make產(chǎn)生的殘留文件。命令為:make clean 刪除先前可能加載過的模塊,命令為:rmmod /dev/zcydriver卸載設(shè)備:rm /dev

35、/zcydriver編譯設(shè)備文件,產(chǎn)生模塊文件make加載模塊insmod zcydriver.ko加載設(shè)備,分配設(shè)別號mknod /dev/zcydriver c 240 0更改用戶對設(shè)備的操作權(quán)限為可讀、可寫chmod 666 /dev/zcydriver(5)運(yùn)行測試程序,檢驗(yàn)設(shè)備是否可讀寫:檢測程序見報(bào)告附錄的源代碼,測試過程如下圖5-1所示:圖5-1 設(shè)備測試結(jié)果6.內(nèi)容四:理解和分析/proc文件6.1 內(nèi)容要求(1)了解/proc文件的特點(diǎn)和使用方法。(2)監(jiān)控系統(tǒng)狀態(tài),顯示系統(tǒng)中若干部件的使用情況。(3)用圖形界面顯示系統(tǒng)監(jiān)控狀態(tài)。6.2 設(shè)計(jì)過程及實(shí)現(xiàn)(1)/proc 文件特

36、點(diǎn): Linux的proc文件系統(tǒng)是進(jìn)程文件系統(tǒng)和內(nèi)核文件系統(tǒng)的組成的復(fù)合體,是將內(nèi)核數(shù)據(jù)對象化為文件形式進(jìn)行存取的一種內(nèi)存文件系統(tǒng),是監(jiān)控內(nèi)核的一種用戶接口。它擁有一些特殊的文件(純文本),從中可以獲取系統(tǒng)狀態(tài)信息。 /proc/cpuinfo保存CPU信息,包括名稱、型號、數(shù)目、主頻、Cache等; /proc/version保存操作系統(tǒng)信息,包括系統(tǒng)版本、內(nèi)核型號、GCC版本等; /proc/stat保存CPU活動(dòng)信息數(shù)據(jù),用來測算CPU使用率; /proc/meminfo保存內(nèi)存空間和交換空間實(shí)時(shí)大小,可用來計(jì)算內(nèi)存和交換分區(qū)使用率,MemTotal表示內(nèi)存空間總大小,MemFree表

37、示內(nèi)存剩余空間大小,S表示交換分區(qū)總大小,S表示交換分區(qū)剩余空間大小。據(jù)此可以算出內(nèi)存和交換分區(qū)的使用率。(2)設(shè)計(jì)實(shí)現(xiàn)系統(tǒng)監(jiān)控器ManagerCat 結(jié)構(gòu)如下圖6-1所示:圖6-1 監(jiān)控器結(jié)構(gòu) 系統(tǒng)信息頁運(yùn)行效果如下圖6-2所示:圖6-2 系統(tǒng)信息頁效果 核心代碼結(jié)構(gòu)如下: vbox = gtk_vbox_new(FALSE,0);/新建容器 frame = gtk_frame_new (bufferf1);/新建標(biāo)簽頁 label = gtk_label_new (bufferf1);/新建文本框,其余兩個(gè)類似 gtk_container_add (GTK_CONTAINER (frame

38、), label);/之后填入相應(yīng)的值gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 進(jìn)程信息頁:運(yùn)行效果如下圖6-3所示:圖6-3 系統(tǒng)信息頁效果 核心代碼結(jié)構(gòu)如下: sprintf(bufferl, "進(jìn)程信息"); hbox=gtk_hbox_new(FALSE, 5); scrolled_window = gtk_scrolled_window_new (NULL, NULL);/滾屏 gtk_widget_set_size_request (scrolled_window, 300,

39、 300); clist=gtk_clist_new(5);/5 lists get_proc_info(clist,&p,&q,&r,&s);/得到進(jìn)程信息 gtk_signal_connect(GTK_OBJECT(clist),"select_row",GTK_SIGNAL_FUNC(select_row_callback),NULL);/回調(diào)函數(shù),響應(yīng)行選擇 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window),clist); /滾屏

40、vbox=gtk_vbox_new(FALSE, 5); frame = gtk_frame_new (bufferl); gtk_widget_set_size_request (frame, 100, 215); label = gtk_label_new (bufferf1); gtk_container_add (GTK_CONTAINER (frame), label); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 10); button1 = gtk_button_new_with_label("結(jié)束進(jìn)程&

41、quot;); g_signal_connect (G_OBJECT (button1), "clicked",G_CALLBACK (kill_proc), "結(jié)束進(jìn)程");/殺死進(jìn)程回調(diào)函數(shù) gtk_box_pack_start(GTK_BOX(vbox), button1, FALSE, FALSE, 10); button2 = gtk_button_new_with_label("刷新"); g_signal_connect_s (G_OBJECT (button2), "clicked",G_CALLB

42、ACK (refresh), clist); /按鈕回調(diào),刷新屏幕 gtk_box_pack_start(GTK_BOX(vbox), button2, FALSE, FALSE, 10); gtk_widget_show_all(hbox);gtk_notebook_append_page (GTK_NOTEBOOK (notebook), hbox, label); 模塊信息頁:運(yùn)行效果如下圖6-4所示:圖6-4 模塊信息頁效果 核心代碼結(jié)構(gòu)如下: sprintf(bufferl, "模塊信息"); vbox = gtk_vbox_new(FALSE,0); scrol

43、led_window = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_size_request (scrolled_window, 500, 250); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); clist2=gtk_clist_new(3);/滾屏和列 get_module_info(clist2); gtk_signal_connect(GTK_

44、OBJECT(clist2),"select_row",GTK_SIGNAL_FUNC(select_row_callback2),NULL);gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window),clist2); gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 5);hbox=gtk_hbox_new(FALSE, 0);button3 = gtk_button_new_with_label(&q

45、uot;刷新");/刷新按鈕g_signal_connect_s (G_OBJECT (button3), "clicked",G_CALLBACK (refresh2), clist2);gtk_widget_show_all(vbox);label = gtk_label_new (bufferl);gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 內(nèi)存信息頁:運(yùn)行效果如下圖6-5所示:圖6-5 內(nèi)存信息頁效果核心代碼結(jié)構(gòu)如下: capability = gtk_vbox_new(FALSE,0); /內(nèi)存資源 gtk_container_set_border_width(GTK_CONTAINER(capability),5); gtk_widget_set_size_request(capability,200,320)

溫馨提示

  • 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

提交評論