版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、華中科技大學(xué)嵌入式操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告 院 系: 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專(zhuān) 業(yè): 班 級(jí): 姓 名: 指導(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ì)過(guò)程及實(shí)現(xiàn)54.內(nèi)容二:掌握添加系統(tǒng)調(diào)用的方法4.1 內(nèi)容要求94.2 設(shè)計(jì)過(guò)程及實(shí)現(xiàn)95.內(nèi)容三:掌握添加設(shè)備驅(qū)動(dòng)程序的方法5.1 內(nèi)容要求 175.2 設(shè)計(jì)過(guò)程及實(shí)現(xiàn) 176.內(nèi)容四:理解和分析/proc文件6.1 內(nèi)容要求 226.2 設(shè)計(jì)過(guò)程及實(shí)現(xiàn) 221 課程設(shè)計(jì)目的(1)掌握Linux操作系統(tǒng)的使用方法;(2)了解Linu
2、x系統(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平臺(tái):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è)的過(guò)程中,需要大量的使用root權(quán)限來(lái)進(jìn)行命令的操作。如果以普通用戶(hù)登錄ubuntu,會(huì)連編輯一個(gè)文件都非常周折。為此,我找到了一種修改系統(tǒng)文件,以達(dá)到直接使用root身份登錄的方法:開(kāi)
3、始的時(shí)候,只能以普通用戶(hù)登錄,用Ctrl+Alt+T打開(kāi)終端:初始化/修改root密碼sudo passwd root用vi編輯器修改這個(gè)文件:sudo vi /etc/lightdm/lightdm.conf 在文件最后加入這么一行代碼:greeter-show-manual-login=true然后保存退出,sudo reboot 重啟系統(tǒng)。之后就可以輸入root用戶(hù)登錄。(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.t
4、ar.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圖形庫(kù)時(shí)需要安裝GTK環(huán)境:安裝gcc/g+/gdb/make 等基本編程工具apt-get install build-essential Tip:如果提示由于依賴(lài)項(xiàng)不能安裝,需要使用apt的強(qiáng)化版aptitude,這個(gè)工具可以自動(dòng)分析軟件包依賴(lài),系統(tǒng)一般不自帶,需要先安裝,具體過(guò)程是:apt-get install aptitudeaptitude install buil
5、d-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-dev這個(gè)安裝完成后,GTK環(huán)境就基本搭建成功,網(wǎng)上有些教程說(shuō)要安裝其他配置文件,經(jīng)我親測(cè),發(fā)現(xiàn)只要安裝libgtk2.0-dev這個(gè)包就能搞定。3 內(nèi)容一:熟悉和理解Linux編程環(huán)境3.1 內(nèi)容要求(1)編寫(xiě)一個(gè)C程序,實(shí)現(xiàn)文件拷貝功能(2)編寫(xiě)一個(gè)C程序,使用Linux下的圖
6、形庫(kù),分窗口顯示三個(gè)并發(fā)進(jìn)程運(yùn)行;3.2 設(shè)計(jì)過(guò)程及實(shí)現(xiàn)(1)文件拷貝: 文件的拷貝主要的思想就是利用文件指針操作,在兩個(gè)文件之間進(jìn)行按字符的fget和fput。從而完成整個(gè)文件的拷貝操作。在這個(gè)基本功能之外,需要增加程序的健壯性,具體有以下幾個(gè)方面:源文件是否存在且能讀取數(shù)據(jù);是否能創(chuàng)建目的文件,且能向里面寫(xiě)入數(shù)據(jù);程序需要的argc參數(shù)個(gè)數(shù)是否滿(mǎn)足要求; 基于以上幾點(diǎn)和內(nèi)容要求,主要的程序段如下:if(argc!=3)/判斷參數(shù)個(gè)數(shù)是否為3 ,否則返回printf(Error in argc!n);return 0;if( (fsource=fopen(argv1,rb)=NULL )pr
7、intf(Error in open source file!n);/判斷源文件是否能打開(kāi)和讀出return 0;if( (ftarget=fopen(argv2,wb)=NULL )printf(Error in open target file!n);/判斷目的文件時(shí)候能創(chuàng)建和寫(xiě)入return 0;while(c=fgetc(fsource)!=EOF)fputc(c,ftarget);/按字符讀取和寫(xiě)入數(shù)據(jù) 執(zhí)行結(jié)果如下:將source/source.txt文件拷貝到到target.txt,開(kāi)始時(shí)如下圖3-1所示:圖3-1 復(fù)制開(kāi)始前source/source.txt文件內(nèi)容利用myco
8、py程序復(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#show(argc,argv,This is Child 1#);/調(diào)用函數(shù)顯示窗口 else if(pid_2=fork()=0) printf(Child 2# is running
9、.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)建
10、新的窗口; /設(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), 2
11、0);/設(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 I
12、D:%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_wid
13、get_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 (
14、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 (); 編譯代碼forkgtk.c,運(yùn)行;編譯命令為:gcc -o forkgtk forkgtk.c pkg-config -cf
15、lags -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)編寫(xiě)一個(gè)應(yīng)用程序,測(cè)試新添加的系統(tǒng)調(diào)用。(3)系統(tǒng)調(diào)用的功能:文件拷貝。4.2 設(shè)計(jì)過(guò)程及實(shí)現(xiàn)在這一個(gè)部分,投入了比較多的時(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)。我之前的Ubu
16、ntu版本是13.04,后來(lái)發(fā)現(xiàn)因?yàn)槭?4位的,行不通,只好換了一個(gè)低版本的Ubuntu11.10,經(jīng)過(guò)自己的實(shí)際工作,下面是在運(yùn)行成功之后,總結(jié)的一個(gè)過(guò)程。(環(huán)境和內(nèi)核配置見(jiàn)本報(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_zcycopyfile(const char* s_file, con
17、st 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
18、 (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); /
19、* 段操作結(jié)束 */ return 0; (3)修改/usr/src/ linux-source-3.0.0/arch/x86/include/asm/文件夾下面頭文件:unistd_32.h,在文件的系統(tǒng)調(diào)用號(hào)部分添加一個(gè)新的系統(tǒng)調(diào)用,具體添加行如下:#define _NR_sys_zcycopyfile347同時(shí)把下面的總調(diào)用號(hào)加1,變成348。具體截圖如下圖4-2所示。圖4-2 添加系統(tǒng)調(diào)用號(hào)(4)修改/usr/src/ linux-source-3.0.0/x86/kernel/syscall_table_32.s,加入新的一行: .long sys_zcycopyfile/* 347
20、 */具體實(shí)現(xiàn)如下圖4-3所示:圖4-3 填寫(xiě)系統(tǒng)調(diào)用入口表 當(dāng)用戶(hù)程序需要系統(tǒng)提供服務(wù)的時(shí)候,比如347號(hào)調(diào)用sys_zcycopyfile,就會(huì)通過(guò)系統(tǒng)調(diào)用產(chǎn)生一個(gè)int 0x80的軟中斷,就會(huì)進(jìn)入到系統(tǒng)調(diào)用的入口函數(shù),找到這個(gè)調(diào)用函數(shù)表查找入口函數(shù),也就是這里的.long sys_zcycopyfile,進(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)用。(5)配置內(nèi)核:(先cd到下載的新的內(nèi)核包)凈化解壓后的源代碼make mrproper安
21、裝ncurses環(huán)境: apt-get install libncurses5-devncurses是一個(gè)能提供基于文本終端窗口功能的動(dòng)態(tài)庫(kù), 提供字符終端處理庫(kù),包括面板和菜單。對(duì)內(nèi)核選項(xiàng)進(jìn)行配置make menuconfig執(zhí)行命令之后,會(huì)彈出一個(gè)框,提示對(duì)內(nèi)核裁剪或配置。這次用不到變化內(nèi)核模塊,直接用鍵盤(pán)方向鍵選項(xiàng)就行了。建立模塊間的依賴(lài)信息make dep這一步正常情況會(huì)提示用戶(hù)多此一舉刪除配置時(shí)留下的一些不用的文件make clean這一步一般沒(méi)動(dòng)作,除非是失敗后再次編譯內(nèi)核時(shí)要用到。(6)編譯內(nèi)核:編譯內(nèi)核文件bzImage:make bzImage j9這一步耗費(fèi)的時(shí)間比較長(zhǎng),所
22、以加了一個(gè) -j9,這種方法使用多線(xiàn)程編程,實(shí)際使用時(shí)發(fā)現(xiàn)能很大的提高效率。(這個(gè)視CPU而定,要看CPU最多支持幾個(gè)線(xiàn)程)編譯內(nèi)核模塊:make modules j9 (7)安裝內(nèi)核經(jīng)過(guò)最麻煩的編譯內(nèi)核,接下來(lái)的安裝內(nèi)核就顯得容易多了,輸入命令sudo make modules_install 安裝內(nèi)核模塊sudo make install 安裝內(nèi)核同樣,如果嫌時(shí)間太慢的話(huà),同樣可以在最后加上 j9 (8)環(huán)境修改:接下來(lái)主要是將編譯安裝生成的操作系統(tǒng)讓系統(tǒng)引導(dǎo)程序“知道”,具體過(guò)程如下圖4-4所示:圖4-4 環(huán)境修改具體如下:復(fù)制內(nèi)核到boot目錄:cp arch/i386/boot/bz
23、Image /boot/vmlinuz-3.0.69.zcy 可利用Tab快速補(bǔ)全路徑和文件,這樣方便又不容易出錯(cuò)。建立要載入ramdisk的映像文件mkinitramfs 3.0.69.zcy -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í)間,以便讓用戶(hù)有足夠的時(shí)間選擇要進(jìn)入的操作系統(tǒng)。
24、(10)重啟,進(jìn)入新系統(tǒng):?jiǎn)?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)于在添加新的系統(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)編寫(xiě)測(cè)試程序zcopy.c,如下圖4-8所示:圖4-8 測(cè)試程序,檢測(cè)新的第347號(hào)系統(tǒng)調(diào)用(13)編譯運(yùn)行,生成執(zhí)行文件。然后看執(zhí)行程序是否可以實(shí)現(xiàn)文件的拷貝,執(zhí)
25、行結(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)采用模塊方法,添加一個(gè)新的設(shè)備驅(qū)動(dòng)程序。(2)要求添加字符設(shè)備的驅(qū)動(dòng)。(3)編寫(xiě)一個(gè)應(yīng)用程序,測(cè)試添加的驅(qū)動(dòng)程序5.2 設(shè)計(jì)過(guò)程及實(shí)現(xiàn) (1)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è)備
26、:字符設(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è)部分: 注冊(cè)設(shè)備:在系統(tǒng)初啟,或者模塊加載時(shí)候,必須將設(shè)備登記到相應(yīng)的設(shè)備數(shù)組,并返回設(shè)備的主設(shè)備號(hào); 定義功能函數(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ū)
27、動(dòng)函數(shù)中特定的模塊。來(lái)實(shí)現(xiàn)具體的操作;卸載設(shè)備:在不用這個(gè)設(shè)備時(shí),可以將它卸載,主要是從/proc 中取消這個(gè)設(shè)備的特殊文件。 (2)編寫(xiě)Makefile文件如下:ifneq ($(KERNELRELEASE),) 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)核模塊編譯
28、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ò)程如下:KERNELRELEASE是在內(nèi)核源碼的頂層Makefile中定義的一個(gè)變量,在第一次讀取執(zhí)行此Makefile時(shí),KERNELRELEASE沒(méi)有被定義,所以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)
29、核源碼目錄下讀取那里的Makefile;M=$(PWD) 表明然后返回到當(dāng)前目錄繼續(xù)讀入、執(zhí)行當(dāng)前的Makefile。當(dāng)從內(nèi)核源碼目錄返回時(shí),KERNELRELEASE已被定義,內(nèi)核的build程序Kbuild也被啟動(dòng)去解析kbuild語(yǔ)法的語(yǔ)句,make將繼續(xù)讀取else之前的內(nèi)容。else之前的內(nèi)容為kbuild語(yǔ)法的語(yǔ)句,指明模塊源碼中各文件的依賴(lài)關(guān)系,以及要生成的目標(biāo)模塊名。(3)編寫(xiě)設(shè)備功能函數(shù):(zcydriver.c)函數(shù)框架如下所示:#define MY_MAJOR 240/定義設(shè)備號(hào)int zcydriver_open(struct inode *inode, struct
30、file *filp)/打開(kāi)設(shè)備ssize_t zcydriver_read(struct file *filp, char _user *buf, size_t count, loff_t *f_pos )/讀數(shù)據(jù)sprintf(s2,%s,s1);if(count12) 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
31、 count, loff_t *f_pos)/寫(xiě)數(shù)據(jù) if (count 0)return -EINVAL; if (s1 = NULL)return -ENOMEM; if (copy_from_user(s1, buf, count+1)return -EFAULT; return count;int zcydriver_release(struct inode *inode, struct file *filp)/釋放設(shè)備struct file_operations zcydriver_fops = / .owner = THIS_MODULE, .open = zcydriver_op
32、en, .read = zcydriver_read, .write = zcydriver_write, .release = zcydriver_release,;static int zcydriver_init(void)/設(shè)備初始化 rc = register_chrdev(MY_MAJOR, zcydriver, &zcydriver_fops);/注冊(cè)if(rc 0) printk(.register %s dev errorn, zcydriver); /失敗返回錯(cuò)誤 return -1; printk(.register zcydriver dev OKn);/成功注冊(cè)設(shè)備
33、return 0;static void zcydriver_exit(void) unregister_chrdev(MY_MAJOR, zcydriver);/注銷(xiāo)設(shè)備 printk(.Good Bye!n);MODULE_LICENSE(GPL);module_init(zcydriver_init);module_exit(zcydriver_exit);(4)設(shè)備加載,安裝過(guò)程如下:進(jìn)入Makefile文件和zcydriver.c文件所在目錄,清除make產(chǎn)生的殘留文件。命令為:make clean 刪除先前可能加載過(guò)的模塊,命令為:rmmod /dev/zcydriver卸載設(shè)備:
34、rm /dev/zcydriver編譯設(shè)備文件,產(chǎn)生模塊文件make加載模塊insmod zcydriver.ko加載設(shè)備,分配設(shè)別號(hào)mknod /dev/zcydriver c 240 0更改用戶(hù)對(duì)設(shè)備的操作權(quán)限為可讀、可寫(xiě)chmod 666 /dev/zcydriver(5)運(yùn)行測(cè)試程序,檢驗(yàn)設(shè)備是否可讀寫(xiě):檢測(cè)程序見(jiàn)報(bào)告附錄的源代碼,測(cè)試過(guò)程如下圖5-1所示:圖5-1 設(shè)備測(cè)試結(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ì)過(guò)程及實(shí)現(xiàn)(1)/p
35、roc 文件特點(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)存空間總大小,M
36、emFree表示內(nèi)存剩余空間大小,SwapTotal表示交換分區(qū)總大小,SwapFree表示交換分區(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è)運(yùn)行效果如下圖6-2所示:圖6-2 系統(tǒng)信息頁(yè)效果 核心代碼結(jié)構(gòu)如下: vbox = gtk_vbox_new(FALSE,0);/新建容器 frame = gtk_frame_new (bufferf1);/新建標(biāo)簽頁(yè) label = gtk_label_new (bufferf1);/新建文本框,其余兩個(gè)類(lèi)似 gtk_container_add
37、 (GTK_CONTAINER (frame), label);/之后填入相應(yīng)的值gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 進(jìn)程信息頁(yè):運(yùn)行效果如下圖6-3所示:圖6-3 系統(tǒng)信息頁(yè)效果 核心代碼結(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_wi
38、ndow, 300, 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); /滾屏 vbox=gtk_vbox_new(
39、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)程); g_signal_connect (G_OB
40、JECT (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_swapped (G_OBJECT (button2), clicked,G_CALLBACK (refresh), clist); /按鈕回調(diào),刷新屏幕 gtk_box_pack_start(GTK_BOX(vbox), butt
41、on2, FALSE, FALSE, 10); gtk_widget_show_all(hbox);gtk_notebook_append_page (GTK_NOTEBOOK (notebook), hbox, label); 模塊信息頁(yè):運(yùn)行效果如下圖6-4所示:圖6-4 模塊信息頁(yè)效果 核心代碼結(jié)構(gòu)如下: sprintf(bufferl, 模塊信息); vbox = gtk_vbox_new(FALSE,0); scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_size_request (scro
42、lled_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_OBJECT(clist2),select_row,GTK_SIGNAL_FUNC(select_row_callback2),NULL);gtk_scrolled_w
43、indow_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(刷新);/刷新按鈕g_signal_connect_swapped (G_OBJECT (button3), clicked,G_CALLBACK (refresh2), clist2);gtk_
44、widget_show_all(vbox);label = gtk_label_new (bufferl);gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); 內(nèi)存信息頁(yè):運(yùn)行效果如下圖6-5所示:圖6-5 內(nèi)存信息頁(yè)效果核心代碼結(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); gtk_widget_show(capability); l
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 冠字號(hào)碼檢索制度
- 黑龍江幼兒師范高等專(zhuān)科學(xué)?!度穗H傳播與溝通》2023-2024學(xué)年第二學(xué)期期末試卷
- 銅仁幼兒師范高等專(zhuān)科學(xué)?!段幕a(chǎn)業(yè)項(xiàng)目策劃》2023-2024學(xué)年第二學(xué)期期末試卷
- 農(nóng)村文體廣場(chǎng)管護(hù)制度
- 桂林電子科技大學(xué)《現(xiàn)場(chǎng)總線(xiàn)技術(shù)及應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 泰州職業(yè)技術(shù)學(xué)院《物理化學(xué)A(二)》2023-2024學(xué)年第二學(xué)期期末試卷
- 嵩山少林武術(shù)職業(yè)學(xué)院《應(yīng)用礦物學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川護(hù)理職業(yè)學(xué)院《獸醫(yī)寄生蟲(chóng)病學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 汕頭大學(xué)《英語(yǔ)學(xué)科教學(xué)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 岳陽(yáng)職業(yè)技術(shù)學(xué)院《初級(jí)朝鮮語(yǔ)聽(tīng)力二》2023-2024學(xué)年第二學(xué)期期末試卷
- 父母贈(zèng)與協(xié)議書(shū)
- 供應(yīng)鏈危機(jī)應(yīng)對(duì)預(yù)案
- 3萬(wàn)噸特高壓及以下鋼芯鋁絞線(xiàn)鋁包鋼芯絞線(xiàn)項(xiàng)目可行性研究報(bào)告寫(xiě)作模板-拿地備案
- 砌筑工技能競(jìng)賽理論考試題庫(kù)(含答案)
- 法學(xué)概論(第七版) 課件全套 谷春德 第1-7章 我國(guó)社會(huì)主義法的基本理論 - 國(guó)際法
- 音響質(zhì)量保證措施
- 安全生產(chǎn)標(biāo)準(zhǔn)化績(jī)效考核評(píng)定報(bào)告
- 工裝夾具驗(yàn)收單
- 循環(huán)水冷卻系統(tǒng)安全操作及保養(yǎng)規(guī)程
- GB/T 20946-2007起重用短環(huán)鏈驗(yàn)收總則
- GB/T 1040.3-2006塑料拉伸性能的測(cè)定第3部分:薄膜和薄片的試驗(yàn)條件
評(píng)論
0/150
提交評(píng)論