版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、. . . . 目錄課程設(shè)計(jì)任務(wù)書3課設(shè)容與過程5一、掌握Linux系統(tǒng)5二、掌握系統(tǒng)調(diào)用的實(shí)現(xiàn)過程7三、掌握增加設(shè)備驅(qū)動(dòng)的方法10四、掌握和了解/proc11課設(shè)心得17課程設(shè)計(jì)任務(wù)書19一、掌握Linux系統(tǒng)源程序19二、系統(tǒng)調(diào)用的實(shí)現(xiàn)過程源程序22三、增加設(shè)備驅(qū)動(dòng)的源程序24四、任務(wù)管理器源程序27課程設(shè)計(jì)任務(wù)書一、 課設(shè)目的1. 掌握Linux操作系統(tǒng)的使用方法;2. 了解Linux系統(tǒng)核代碼結(jié)構(gòu)3. 掌握實(shí)例操作系統(tǒng)的實(shí)現(xiàn)方法。二、 課設(shè)容1. 掌握Linux操作系統(tǒng)的使用方法,包括鍵盤命令、系統(tǒng)調(diào)用;掌握在Linux下的編程環(huán)境。(一) 編一個(gè)C程序,其容為實(shí)現(xiàn)文件拷貝的功能;(二
2、) 編一個(gè)C程序,其容為分窗口同時(shí)顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行結(jié)果。要求用到Linux下的圖形庫。2. 掌握系統(tǒng)調(diào)用的實(shí)現(xiàn)過程,通過編譯核方法,增加一個(gè)新的系統(tǒng)調(diào)用。另編寫一個(gè)應(yīng)用程序,調(diào)用新增加的系統(tǒng)調(diào)用(實(shí)現(xiàn)的功能為文件拷貝)。3. 掌握增加設(shè)備驅(qū)動(dòng)程序的方法。通過模塊方法,增加一個(gè)新的設(shè)備驅(qū)動(dòng)程序,其功能可以簡單(實(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)(選做)多用戶的多級(jí)目錄的文件系統(tǒng)設(shè)計(jì)
3、。多用戶、多級(jí)目錄、login (用戶登錄)、系統(tǒng)初始化(建文件卷、提供登錄模塊)、文件的創(chuàng)建、文件的打開、文件的讀、文件的寫、文件關(guān)閉、刪除文件、創(chuàng)建目錄(建立子目錄)、改變當(dāng)前目錄、列出文件目錄、退出。三、 課設(shè)說明Linux系統(tǒng)版:Fedora 5.0 6.0ubuntu 10.04 11.10核版本linux-2.6.x ,盡量使用2.6.32以前的核版本。四、 考核要求1) 必須獨(dú)立完成課程設(shè)計(jì)容,不分小組,不能有一樣的拷貝;2) 上機(jī)考試:學(xué)生根據(jù)老師提出的要求,演示所完成的系統(tǒng);并回答老師的問題;第4周周四:上午1班 、下午2班 周五上午:3班、 下午4班3) 評(píng)分方法:完成1、
4、2題,得50-55分;完成1、2、3題,得55-65分;完成1、2、3、4(5)題,得70-90分;報(bào)告:10分。4) 上交:課程設(shè)計(jì)報(bào)告(打印/電子檔),容包括調(diào)試記錄和程序清單(附注釋)。第六周前以班為單位交應(yīng)用系辦公室羅老師處。五、 參考資料i. Linux的“man”幫助ii. Linux核2.4版源代碼分析大全iii. Linux核源代碼分析iv. Linux編程白皮書v. 參考:.google.課設(shè)容與過程一、 掌握Linux操作系統(tǒng)的使用方法,包括鍵盤命令、系統(tǒng)調(diào)用;掌握在Linux下的編程環(huán)境。(一) 編一個(gè)C程序,其容為實(shí)現(xiàn)文件拷貝的功能.a) 任務(wù)分析在Linux下面,如果
5、要編譯一個(gè)C語言源程序,我們要使用GNU的gcc編譯器。gcc編譯器有許多選項(xiàng),一般來說我們只要知道其中的幾個(gè)就夠了. -o選項(xiàng)我們已經(jīng)知道了,表示我們要求輸出的可執(zhí)行文件名. -c選項(xiàng)表示我們只要求編譯器輸出目標(biāo)代碼,而不必要輸出可執(zhí)行文件. -g選項(xiàng)表示我們要求編譯器在編譯的時(shí)候提供我們以后對(duì)程序 進(jìn)行調(diào)試的信息. 知道了這三個(gè)選項(xiàng),我們就可以編譯我們自己所寫的簡單的源程序了,如果想要知道更多的選項(xiàng),可以查看gcc的幫助文檔(可以用man gcc來查看),那里有著許多對(duì)其它選項(xiàng)的詳細(xì)說明。文件拷貝的C程序主要用到如下幾個(gè)函數(shù):open:打開文件close:關(guān)閉文件read:讀操作write
6、:寫操作open函數(shù)有兩個(gè)形式.如下:int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode);其中pathname是我們要打開的文件名(包含路徑名稱,缺省是認(rèn)為在 當(dāng)前路徑下面).flags可以去下面的一個(gè)值或者是幾個(gè)值的組合. 組合使用時(shí)候用豎線“|”隔開。O_RDONLY:以只讀的方式打開文件. O_WRONLY:以只寫的方式打開文件. O_RDWR:以讀寫的方式打開文件. O_APPEND:以追加的方式打開文件. O_CREAT:創(chuàng)建一個(gè)文件. /創(chuàng)建一個(gè)
7、不存在的文件。O_EXEC:如果使用了O_CREAT而且文件已經(jīng)存在,就會(huì)發(fā)生一個(gè)錯(cuò)誤. O_NOBLOCK:以非阻塞的方式打開一個(gè)文件. O_TRUNC:如果文件已經(jīng)存在,則刪除文件的容. 前面三個(gè)標(biāo)志只能使用任意的一個(gè).如果使用了O_CREATE標(biāo)志,那么我們要使用open的第二種形式.還要指定mode標(biāo)志,用來表示文件的訪問權(quán)限.b) 程序源代碼見實(shí)現(xiàn)文件拷貝的源程序c) 程序運(yùn)行結(jié)果源程序通過編譯后會(huì)生成可執(zhí)行文件mycopy,執(zhí)行mycopy之前,/usr目錄下的文件a.txt容見圖 1,文件b.txt容見圖 2。圖 1 執(zhí)行mycopy前a.txt的容圖 2執(zhí)行mycopy前b.t
8、xt的容執(zhí)行mycopy后,目錄/usr下文件b.txt容見圖 3,由圖可知,文件a.txt的容正確無誤的拷貝到了文件b.txt中,故程序運(yùn)行結(jié)果完全正確。圖 3執(zhí)行mycopy后b.txt的容(二) 編一個(gè)C程序,其容為分窗口同時(shí)顯示三個(gè)并發(fā)進(jìn)程的運(yùn)行結(jié)果。要求用到Linux下的圖形庫。a) 任務(wù)分析通俗的講,程序是一個(gè)包含可以執(zhí)行代碼的文件 ,是一個(gè)靜態(tài)的文件。而進(jìn)程是一個(gè)開始執(zhí)行但是還沒有結(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í)別. 為了充分的利用資源,
9、系統(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)程是沒有意義的。為了區(qū)分父進(jìn)程和子進(jìn)程,我們必須跟蹤fork的返回值. 當(dāng)fork調(diào)用失敗的時(shí)候(存不足或者是用戶的最大進(jìn)程數(shù)已到)fork返回-1,否則fork的返回值有重要的作用.對(duì)于父進(jìn)程fork返回子進(jìn)程的ID,而對(duì)于fork子進(jìn)程返回0.我們可以根據(jù)這個(gè)返回值來區(qū)分父子進(jìn)程。編譯GTK程序與編譯普通的C程序需要用到不同的命
10、令。比如程序名為threeproc,則編譯命令為:gcc pkg-config cflags -libs gtk+-2.0threeproc.c o threeproc。其中pkgconfig讀取GTK附帶的.pc文件來決定編譯GTK程序需要的編譯選項(xiàng),pkgconfig -cflags gtk+-2.0列出include目錄,pkgconfig -libs gtk+-2.0列出編譯連接庫。命令中的單引號(hào)是鍵盤上“1”鍵前面的那個(gè),而不是回車鍵左邊的那個(gè),否則會(huì)出錯(cuò)。-libs、-cflags中都是兩個(gè)橫線。b) 程序源代碼見顯示三個(gè)并發(fā)進(jìn)程的源程序c) 程序運(yùn)行結(jié)果我寫的程序有三個(gè)并發(fā)進(jìn)程,
11、并且分別利用三個(gè)窗口進(jìn)行顯示,顯示框中各有一個(gè)進(jìn)度條,但是其各自的刷新頻率不一樣,直觀感受就是三個(gè)進(jìn)度條不一致。窗口上面顯示了各個(gè)進(jìn)程的ID,可以看到三個(gè)進(jìn)程的ID是不一樣的。顯示框中還有一個(gè)退出按鈕,結(jié)果見圖 4。圖 4 三個(gè)并發(fā)進(jìn)程的顯示二、 掌握系統(tǒng)調(diào)用的實(shí)現(xiàn)過程,通過編譯核方法,增加一個(gè)新的系統(tǒng)調(diào)用。另編寫一個(gè)應(yīng)用程序,調(diào)用新增加的系統(tǒng)調(diào)用。a) 任務(wù)分析系統(tǒng)調(diào)用是應(yīng)用程序和操作系統(tǒng)核之間的功能接口,通過系統(tǒng)調(diào)用進(jìn)程可由用戶模式轉(zhuǎn)入核模式,在核模式下完成相應(yīng)的服務(wù)之后再返回到用戶模式。系統(tǒng)調(diào)用的主要目的是使得用戶可以使用操作系統(tǒng)提供的有關(guān)設(shè)備管理、輸入/輸出系統(tǒng)、文件系統(tǒng)和進(jìn)程控制、通
12、信以與存儲(chǔ)管理等方面的功能,而不必了解系統(tǒng)程序的部結(jié)構(gòu)和有關(guān)硬件細(xì)節(jié),從而起到減輕用戶負(fù)擔(dān)和保護(hù)系統(tǒng)以與提高資源利用率的作用。本次課設(shè),我通過編譯核的方式,增加了一個(gè)系統(tǒng)調(diào)用,其功能為文件拷貝。b) 程序源代碼見添加的系統(tǒng)調(diào)用源代碼和測(cè)試程序c) 實(shí)驗(yàn)過程與步驟1、 wget source ./.source code,下載linux源碼,我下載的版本是linux-0.2、 sudo s,切換到root用戶3、 tar -xjvf linux-0.解壓核到/usr/src/4、 打開/usr/src/linux-source-
13、0/kernel/sys.c,在最后添加自己的系統(tǒng)調(diào)用程序sys_mycopy.注意把代碼放在EXPORT_SYMBOL_GPL(orderly_poweroff);之前。5、 打開/usr/src/linux-source-2.6.35/arch/x86/kernel/syscall_table_32.s,然后在最后一行.long sys_XXXX的下一行添加.long sys_mycopy,并且后面的為系統(tǒng)調(diào)用號(hào)。我的是338.6、 打開/usr/src/linux-0/include/asm-generic/unistd.h,在#undef _NR_syscalls的前面
14、加上#define _NR_mycopy 244_SYSCALL(_NR_mycopy, sys_mycopy)同時(shí)將#undef _NR_syscalls后面的數(shù)字加1.7、 編譯核首先進(jìn)入解壓目錄:cd /usr/src/linux-source-2.6.35。運(yùn)行命令make cleanmake menuconfigmake bzImagecp arch/x86/boot/bzImage /boomake modulesmake modules_installmake installcd /boot mkinitramfs -o initrd.img-0
15、0修改grub.cfg 增加一個(gè)啟動(dòng)項(xiàng),代碼如下:menuentry 'Ubuntu, with Linux 0' -class ubuntu -class gnu-linux -class gnu -class os recordfailinsmod part_msdosinsmod ext2set root='(hd0,msdos1)'search -no-floppy -fs-uuid -set 64f525ed-3b34-4403-bb04-96bf47d14da1linux/boot/vmlinuz-0 root=UUI
16、D=64f525ed-3b34-4403-bb04-96bf47d14da1 ro quiet splashinitrd/boot/initrd.img-0set timeout=20重啟計(jì)算機(jī),選擇新的核進(jìn)入。d) 程序運(yùn)行結(jié)果開機(jī)顯示新編譯的核,見圖 5.圖 5開機(jī)顯示新編譯的核linux 0進(jìn)入新的核后,查看/usr目錄下的文件a.txt見圖 6。圖 6文件a.txt的容拷貝前b.txt的容見圖 7。圖 7拷貝前文件b.txt的容運(yùn)行測(cè)試程序test_mycopy,將文件a.txt的容拷貝到文件b.txt,結(jié)果見圖 8。圖 8拷貝后b.txt的容三、 掌握
17、增加設(shè)備驅(qū)動(dòng)程序的方法。通過模塊方法,增加一個(gè)新的設(shè)備驅(qū)動(dòng)程序。a) 任務(wù)分析系統(tǒng)調(diào)用是操作系統(tǒng)核和應(yīng)用程序之間的接口,而設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)核和機(jī)器硬件之間的接口。設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來,硬件設(shè)備只是一個(gè)設(shè)備文件, 應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序是核的一部分,它完成以下的功能:(1) 對(duì)設(shè)備初始化和釋放.(2) 把數(shù)據(jù)從核傳送到硬件和從硬件讀取數(shù)據(jù).(3) 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù),檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。Linux支持三中不同類型的設(shè)備:字符設(shè)備(character devices)、塊
18、設(shè)備(block devices)和網(wǎng)絡(luò)設(shè)備(network interfaces)。字符設(shè)備和塊設(shè)備的主要區(qū)別是:在對(duì)字符設(shè)備發(fā)出讀/寫請(qǐng)求時(shí),實(shí)際的硬件I/O一般就緊接著發(fā)生了,塊設(shè)備則不然,它利用一塊系統(tǒng)存作緩沖區(qū),當(dāng)用戶進(jìn)程對(duì)設(shè)備請(qǐng)求能滿足用戶的要求,就返回請(qǐng)求的數(shù)據(jù),如果不能,就調(diào)用請(qǐng)求函數(shù)來進(jìn)行實(shí)際的I/O操作.塊設(shè)備是主要針對(duì)磁盤等慢速設(shè)備設(shè)計(jì)的,以免耗費(fèi)過多的CPU時(shí)間來等待。用戶進(jìn)程是通過設(shè)備文件來與實(shí)際的硬件打交道,每個(gè)設(shè)備文件都都有其文件屬性(c/b),表示是字符設(shè)備還是塊設(shè)備。另外每個(gè)文件都有兩個(gè)設(shè)備號(hào),第一個(gè)是主設(shè)備號(hào),標(biāo)識(shí)驅(qū)動(dòng)程序,第二個(gè)是從設(shè)備號(hào),標(biāo)識(shí)使用同一個(gè)設(shè)
19、備驅(qū)動(dòng)程序的不同的硬件設(shè)備,比如有兩個(gè)軟盤,就可以用從設(shè)備號(hào)來區(qū)分他們.設(shè)備文件的的主設(shè)備號(hào)必須與設(shè)備驅(qū)動(dòng)程序在登記時(shí)申請(qǐng)的主設(shè)備號(hào)一致,否則用戶進(jìn)程將無法訪問到驅(qū)動(dòng)程序。用戶進(jìn)程利用系統(tǒng)調(diào)用對(duì)設(shè)備進(jìn)行諸如read/write操作,系統(tǒng)調(diào)用通過設(shè)備文件的主設(shè)備號(hào)找到相應(yīng)的設(shè)備驅(qū)動(dòng)程序,然后讀取這個(gè)數(shù)據(jù)結(jié)構(gòu)相應(yīng)的函數(shù)指針,接著把控制權(quán)交給該函數(shù)。最后,在用戶進(jìn)程調(diào)用驅(qū)動(dòng)程序時(shí),系統(tǒng)進(jìn)入核心態(tài),這時(shí)不再是搶先式調(diào)度.也就是說,系統(tǒng)必須在你的驅(qū)動(dòng)程序的子函數(shù)返回后才能進(jìn)行其他的工作。如果你的驅(qū)動(dòng)程序陷入死循環(huán),你只有重新啟動(dòng)機(jī)器了。我增加了一個(gè)字符設(shè)備驅(qū)動(dòng),可以將輸入的字符串倒序輸出。b) 程序源代
20、碼見添加新的設(shè)備驅(qū)動(dòng)程序c) 實(shí)驗(yàn)過程與步驟將驅(qū)動(dòng)源程序和Makefile文件放到 /桌面/mydriver 目錄下,并切換到此目錄編譯,運(yùn)行命令make,見圖 9。圖 9 編譯如果成功,可以得到.ko文件接著掛載模塊,運(yùn)行命令 insmod rollover.ko,見圖 10圖 10 掛載模塊創(chuàng)建新的虛擬設(shè)備文件,運(yùn)行命令 mknod /dev/rollover c 100 0 (分配的設(shè)備號(hào)為100),見圖 11圖 11創(chuàng)建新的虛擬設(shè)備文件編寫測(cè)試程序并測(cè)試。d) 程序運(yùn)行結(jié)果編譯測(cè)試程序后,運(yùn)行,會(huì)提示輸入字符串,輸入之后按下回車鍵,可以看到字符串倒序輸出,見圖 12圖 12測(cè)試結(jié)果由圖
21、 12可知,字符串倒序輸出,故設(shè)備可以正常使用。四、 了解和掌握/proc文件系統(tǒng)的特點(diǎn)和使用方法(選做)a) 任務(wù)分析用戶和應(yīng)用程序可以通過/proc得到系統(tǒng)的信息,并可以改變核的某些參數(shù)。由于系統(tǒng)的信息是動(dòng)態(tài)改變的,所以用戶或應(yīng)用程序讀取proc文件時(shí),proc文件系統(tǒng)是動(dòng)態(tài)從系統(tǒng)核讀出所需信息并提交的。我們要顯示系統(tǒng)信息,只需進(jìn)行相應(yīng)的文件操作。首先打開相應(yīng)的文件,讀取所需要的信息,將其寫入一個(gè)緩沖區(qū)中,然后將緩沖區(qū)的容加到Gtk的相應(yīng)的控件上面去,最后將控件組合顯示即可。b) 程序源代碼任務(wù)管理器源程序c) 程序運(yùn)行結(jié)果任務(wù)管理器中顯示的進(jìn)程信息,見圖 13圖 13進(jìn)程信息點(diǎn)擊結(jié)束進(jìn)程
22、,會(huì)彈出對(duì)話框,確認(rèn)是否結(jié)束當(dāng)前進(jìn)程,見圖 14圖 14結(jié)束進(jìn)程對(duì)話框任務(wù)管理器中顯示的系統(tǒng)信息 見圖 15圖 15系統(tǒng)信息任務(wù)管理器顯示的存資源信息,見圖 16圖 16存資源任務(wù)管理器中顯示的模塊信息,見圖 17圖 17模塊信息點(diǎn)擊卸載模塊,會(huì)彈出對(duì)話框,確認(rèn)是否卸載選擇的模塊,見圖 18圖 18卸載模塊對(duì)話框任務(wù)管理器中顯示的幫助說明,見圖 19圖 19幫助說明點(diǎn)擊退出程序,會(huì)彈出對(duì)話框,詢問是否退出程序,見圖 20圖 20退出程序?qū)υ捒螯c(diǎn)擊關(guān)閉計(jì)算機(jī),會(huì)彈出對(duì)話框,詢問是否關(guān)閉計(jì)算機(jī),見圖 21圖 21關(guān)閉計(jì)算機(jī)對(duì)話框點(diǎn)擊重啟計(jì)算機(jī),會(huì)彈出對(duì)話框,詢問是否重啟計(jì)算機(jī),見圖 22圖 22重
23、啟計(jì)算機(jī)對(duì)話框課設(shè)心得本次課設(shè)歷時(shí)兩個(gè)星期,由于上學(xué)期有過操作系統(tǒng)的實(shí)驗(yàn)基礎(chǔ),對(duì)Linux已經(jīng)比較熟悉,所以這次課設(shè)開始時(shí)就比較順利的完成了任務(wù)一中的第一小題。做到用圖形界面顯示三個(gè)進(jìn)程時(shí),我遇到了一點(diǎn)困難,因?yàn)閺膩頉]有接觸gtk程序,一開始完全摸不著頭腦。不過我相信自己可以自學(xué)好gtk,然后在百度文庫下了一個(gè)gtk教程,自學(xué)了兩天,覺得自己基本掌握了gtk的編程方法,可以編寫一些簡單的gtk程序了。但是編寫完程序后,我猜發(fā)現(xiàn),原來想要熟悉gtk并不是那么容易,一個(gè)簡單的顯示進(jìn)程信息的程序我調(diào)試了半天,后來終于調(diào)試成功了,并且顯示出了理想中的界面。這過程中我自己探索了很久,也請(qǐng)教了別人,可謂獲
24、益頗多。然后,做任務(wù)二的時(shí)候,我先在網(wǎng)上查詢了一下,找到一個(gè)博客,網(wǎng)址是.cnblogs./kenjones/archive/2011/03/09/1978611.html 。里面詳細(xì)介紹了添加系統(tǒng)調(diào)用的過程。起初我按照博主的步驟一一完成,經(jīng)過接近三個(gè)小時(shí)的漫長編譯過程后,新的核可以進(jìn)去,但是一運(yùn)行測(cè)試程序,調(diào)用添加的系統(tǒng)調(diào)用,系統(tǒng)就會(huì)死機(jī),我琢磨了半天也沒弄清楚到底怎么回事。后來跟同學(xué)們討論,發(fā)現(xiàn)原來是系統(tǒng)版本的問題。我用的系統(tǒng)版本是Linux-0,由于版本比較新,添加系統(tǒng)調(diào)用的方法有了一點(diǎn)改變,后來我按照網(wǎng)上的方法重新添加了系統(tǒng)調(diào)用,然后經(jīng)過make bzImage(大約半
25、個(gè)小時(shí))后,重新進(jìn)入新的核,發(fā)現(xiàn)測(cè)試程序可以正常運(yùn)行了,說明新的系統(tǒng)調(diào)用已經(jīng)調(diào)用成功。這次實(shí)驗(yàn)過程可謂艱苦漫長,因?yàn)榫幾g核需要三個(gè)小時(shí)左右,剛開始又由于版本問題,我編譯了兩次核,這個(gè)過程真是艱苦卓絕。不過還好后來沒有出現(xiàn)大的問題,測(cè)試的過程比較順利。這次實(shí)驗(yàn)讓我印象深刻,因?yàn)檫^程比較漫長,確實(shí)需要很大的耐心。遇到自己不能解決的問題,可以嘗試在網(wǎng)上尋找答案,或者和同學(xué)們一起討論,這樣可以讓自己事半功倍。但是這絕不是坐享其果,在尋求幫助之前自己絕對(duì)要努力思考。任務(wù)三是添加新的字符設(shè)備,在了解了什么事設(shè)備以與Linux下設(shè)備的工作方式后,我按照老師給的PPT上的詳解,同時(shí)也在網(wǎng)上找了如何添加設(shè)備驅(qū)動(dòng)
26、,然后按照步驟開始添加。不過我的添加方式并不是老師給的那種方法,而是自己在網(wǎng)上找的,因?yàn)殚_始按照老師的方法總有一點(diǎn)問題,后來按照網(wǎng)上的方法卻成功了。這也告訴我們,遇到問題無法解決時(shí),可以嘗試一下多種方法,因?yàn)榻鉀Q方法絕對(duì)不止一種,不能在一棵樹上吊死。另外,這次的資源也是從網(wǎng)上找到的,互聯(lián)網(wǎng)真是一個(gè)很奇妙的東西,各種思想都能相互交流,這也讓我覺得,互聯(lián)網(wǎng)絕不僅僅是用來娛樂的,它更多的是承載知識(shí),以后一定要好好利用互聯(lián)網(wǎng),這樣可以很大程度上提高學(xué)習(xí)效率。剛開始做任務(wù)四時(shí),覺得好難好難,因?yàn)橐稽c(diǎn)頭緒也沒有,而自己腦海中的任務(wù)管理器更是有著一層神秘的面紗??戳死蠋煹闹笇?dǎo)書,才明白了任務(wù)管理器的原理,但
27、是如何著手卻仍是沒有一個(gè)很清晰的認(rèn)識(shí)。后來,我又嘗試在網(wǎng)上尋找詳細(xì)的資料,卻發(fā)現(xiàn)了一個(gè)其他人做的任務(wù)管理器,我覺得可以借鑒一下別人的思想。仔細(xì)看了別人做的任務(wù)管理器,我腦海中的自己的任務(wù)管理器也愈發(fā)清晰起來。然后我借用了別人的框架,然后自己在上面添加了更多的功能,也優(yōu)化了一下界面。其實(shí),我找到的任務(wù)管理器十分的粗糙,有進(jìn)程信息卻沒有結(jié)束進(jìn)程的功能,有模塊信息卻沒有卸載模塊的功能,并且按照其CPU的使用率算法得到的結(jié)果和實(shí)際的結(jié)果有比較大的出入。后來,我把這些不足與缺陷都填補(bǔ)了。雖然,這次任務(wù)剛開始我借鑒了別人的成果,但是我并沒有完全抄襲他人的成果。并且,我覺得適當(dāng)?shù)慕梃b,可以開拓我們的視野,增
28、長我們的見識(shí)。當(dāng)然,原創(chuàng)的肯定是最好的,但是當(dāng)你無法完全依靠自己的能力完成時(shí),參考別人的意見或者成果,說不定可以讓你產(chǎn)生靈感。并且,這是個(gè)思想自由的年代,需要人們的思想自由的溝通,集思廣益才能讓我們各自更上一層樓。由于任務(wù)四做完就已經(jīng)臨近檢查時(shí)間了,并且老師的要任務(wù)四和任務(wù)五中選一個(gè),我就沒有再考慮任務(wù)五了。這次課設(shè)剛開始比較順利,但是越往后就越是艱難,這種由淺入深的方式很適合我。并且,做完課設(shè)后,我對(duì)Linux的了解不知不覺由一種膚淺的認(rèn)識(shí),到了一定程度的嫻熟。特別是一些關(guān)于系統(tǒng)核的東西,以前覺得很是神秘,但是做完課設(shè)后,我對(duì)他們也有了一定的了解。我本來不是一個(gè)很喜歡向別人請(qǐng)教的人,遇到問題
29、都喜歡自己解決,但是經(jīng)過這次課設(shè),我發(fā)現(xiàn)有時(shí)候與其自己一個(gè)人苦苦思索,不如大家一起來解決問題,思想上的交流是可以達(dá)到一加一大于二的效果的。很感這次課設(shè),它帶給我的不僅僅是知識(shí),更是獲得知識(shí)的方法。實(shí)驗(yàn)源程序一、 掌握Linux操作系統(tǒng)的使用方法,包括鍵盤命令、系統(tǒng)調(diào)用;掌握在Linux下的編程環(huán)境A. 實(shí)現(xiàn)文件拷貝的源程序#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include &
30、lt;errno.h>#include <string.h>#define BUFFER_SIZE 100 /緩沖區(qū)大小int main(int argc,char *argv)int from_fd,to_fd;int bytes_read,bytes_write;char bufferBUFFER_SIZE+1; /設(shè)定一個(gè)緩沖區(qū)char *ptr;if(argc!=3) /三個(gè)參數(shù)printf("Input error!n");return(-1);/* 打開源文件 */if(from_fd=open(argv1,O_RDONLY)=-1)print
31、f("Open %s Error!n",argv1);return(-1);/* 打開或創(chuàng)建目的文件 */if(to_fd=open(argv2,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR)=-1)printf("Open %s Error!n",argv2);return(-1);while(bytes_read=read(from_fd,buffer,BUFFER_SIZE) /* 一個(gè)致命的錯(cuò)誤發(fā)生了 */if(bytes_read=-1) break;else if(bytes_read>0)ptr=b
32、uffer;while(bytes_write=write(to_fd,ptr,bytes_read)/* 一個(gè)致命錯(cuò)誤發(fā)生了 */if(bytes_write=-1)&&(errno!=EINTR)break;/* 寫完了所有讀的字節(jié) */else if(bytes_write=bytes_read) break;/* 只寫了一部分,繼續(xù)寫 */else if(bytes_write>0)ptr+=bytes_write;bytes_read-=bytes_write;/* 寫的時(shí)候發(fā)生的致命錯(cuò)誤 */if(bytes_write=-1)break;close(from
33、_fd);close(to_fd);return 1;B. 顯示三個(gè)并發(fā)進(jìn)程的源程序#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <gtk/gtk.h>int timer;gboolean update_p_bar(gpointer pbar) gdouble new_val = 0.0; new_val = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(pbar) + 0.005; if(new_val >
34、1.0)gtk_timeout_remove(timer); return FALSE; gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar), new_val); return TRUE;void process(int argc, char *argv,int mark)gtk_init(&argc, &argv);GtkWidget *window, *vbox, *pid_label, *pbar;GtkWidget *button;GdkColor color;gdk_color_parse("red&qu
35、ot;, &color);/* 創(chuàng)建窗口 */window = gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_window_set_title(GTK_WINDOW(window), "并發(fā)進(jìn)程結(jié)果顯示");/設(shè)置標(biāo)題gtk_window_set_default_size(GTK_WINDOW(window), 400, 200);/設(shè)置大小g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);/* 創(chuàng)建垂直組
36、裝盒 */vbox = gtk_vbox_new(FALSE, 5);gtk_container_add(GTK_CONTAINER(window), vbox); /* 創(chuàng)建標(biāo)簽 */char s_pid40;sprintf(s_pid, "進(jìn)程%d 此進(jìn)程ID為:%d ", mark,getpid();pid_label = gtk_label_new(s_pid); gtk_container_add(GTK_CONTAINER(vbox), pid_label); /* 創(chuàng)建進(jìn)度條 */pbar = gtk_progress_bar_new();gtk_contai
37、ner_add(GTK_CONTAINER(vbox), pbar);int interval = atoi(argv0);timer = gtk_timeout_add(interval, update_p_bar, pbar);/*創(chuàng)建退出按鈕*/button = gtk_button_new_with_label ("Exit");gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &color);gtk_container_add(GTK_CONTAINER(vbox), button);g_signal_conne
38、ct_swapped (G_OBJECT (button), "clicked",G_CALLBACK (gtk_main_quit),window);gtk_widget_show_all(window);gtk_main ();int main(int argc, char *argv)pid_t pid_1, pid_2;char *argvv1;int mark;pid_1 = fork();if(pid_1 = -1)/創(chuàng)建失敗printf("Create progress error!"); else if(pid_1 = 0)/子進(jìn)程pid
39、_2 = fork();if(pid_2 = -1)/創(chuàng)建失敗printf("Create progress error!"); else if(pid_2 = 0)/子進(jìn)程mark=3;argvv0 = "400"process(1, argvv,mark);else/父進(jìn)程mark=2;argvv0 = "200"process(1, argvv,mark);else/父進(jìn)程mark=1;argvv0 = "800"process(1, argvv,mark);return 0;二、 增加一個(gè)新的系統(tǒng)調(diào)用A.
40、添加的系統(tǒng)調(diào)用源代碼SYSCALL_DEFINE2(mycopy,char *,from_file, char *,to_file)int from_fd, to_fd;int bytes_read,bytes_write;char buffer2; /緩沖區(qū)mm_segment_t old_fs;old_fs = get_fs();set_fs(KERNEL_DS);if(from_fd=sys_open(from_file,O_RDONLY,0)=-1) /打開源文件return 0;if(to_fd=sys_open(to_file,O_WRONLY|O_CREAT|O_TRUNC,S_
41、IRUSR|S_IWUSR)=-1) /打開目標(biāo)文件return 0; while(bytes_read=sys_read(from_fd,buffer,1) /循環(huán)讀一個(gè)字節(jié)直到文件尾if(bytes_read=-1) return 0; /一個(gè)致命的錯(cuò)誤發(fā)生了 if(bytes_read>0) bytes_write=sys_write(to_fd,buffer,bytes_read); /寫一個(gè)字節(jié)if(bytes_write=-1)return 0; / 一個(gè)致命錯(cuò)誤發(fā)生了 set_fs(old_fs);sys_close(from_fd); /關(guān)閉文件sys_close(to_
42、fd); /關(guān)閉文件return 1;B. 測(cè)試程序#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <string.h>int main(int argc,char *argv)int from_fd,to_fd;if(argc!=3) /三個(gè)參數(shù) printf("Input error!n
43、"); return(-1); else if(syscall(338,argv1,argv2)printf("Successful!n"); /系統(tǒng)調(diào)用號(hào)為338else printf("Failed!n"); return 1;三、 添加新的設(shè)備驅(qū)動(dòng)程序A. 驅(qū)動(dòng)源程序#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/fs.h>#include <asm/uac
44、cess.h>#include <linux/cdev.h>#define MAJOR_NUM 100 MODULE_LICENSE("GPL");MODULE_AUTHOR("HQM");char buffer1024; static ssize_t char_read(struct file *, char*, size_t, loff_t *);static ssize_t char_write(struct file *, const char*, size_t, loff_t *);struct file_operations
45、 char_fops=read:char_read, write:char_write,;static int char_init(void) /注冊(cè)字符設(shè)備if(register_chrdev(MAJOR_NUM, "rollover", &char_fops)printk("rollover register failuren");return 1;elseprintk("rollover register successn");return 0;static void char_exit(void) /注銷字符設(shè)備unr
46、egister_chrdev(MAJOR_NUM, "rollover");static ssize_t char_read(struct file *filp, char *buf, size_t len, loff_t *off) /字符設(shè)備的讀操作printk("nread in:%sn", buf);if(copy_to_user(buf, buffer, len) /將文件容讀到緩沖區(qū)bufreturn 0;return true;static ssize_t char_write(struct file *filp, const char*b
47、uf, size_t len, loff_t *off) /字符設(shè)備的寫操作int i = 0;char templen; /緩存區(qū)temp大小if(copy_from_user(temp, buf, len) /將容拷貝到緩沖區(qū)tempreturn 0;while(i < len-1) /將temp容倒序?qū)懭隻ufferbufferlen-i-2=tempi;i+;printk("nwrite out:%c", bufferlen-i);return true;module_init(char_init);module_exit(char_exit);B. 文件Ma
48、kefile容ifneq ($(KERNELRELEASE),) #kbuild syntax.#模塊的文件組成#mymodule-objs :=rollover.o #生成的模塊文件名 obj-m := rollover.o elsePWD :=$(shell pwd)KVER :=$(shell uname -r)KDIR :=/lib/modules/$(KVER)/buildall:$(MAKE) -C $(KDIR) M=$(PWD)clean:#rm -f *.cmd *.o *.mod *.korm -rf .*.cmd *.o *.mod.c *.ko .tmp_version
49、s#$(MAKE) -C $(KDIR) M=$(PWD) cleanEndifC. 測(cè)試程序#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <fcntl.h>void main(void)int fd;int count=0;char buf1024; /緩沖區(qū)大小fd = open("/dev/rollover", O_RDWR, S_IRUSR | S_IWUSR); /打開字符設(shè)備文件if (fd != -1 )printf(&
50、quot;please input letters:"); /用戶輸入字符串scanf("%s", buf);while(bufcount+) /count為字符串長度;if(write(fd,buf, count) /向字符設(shè)備文件寫入字符串if(read(fd,buf, count) /從字符設(shè)備文件讀出字符串printf("The letters is: %sn", buf);elseprintf("Read Error!n");elseprintf("Write Error!n");close(f
51、d); /關(guān)閉字符設(shè)備文件else /打開字符設(shè)備錯(cuò)誤的情況printf("Device open failuren");四、 任務(wù)管理器源程序A. 任務(wù)管理器源程序#include <gtk-2.0/gtk/gtk.h>#include <gtk-2.0/gdk/gdk.h>#include <dirent.h>#include <string.h>#include <sys/types.h>#include <sys/file.h>#include <signal.h>#include
52、<unistd.h>#include <stdio.h>#include <time.h>#include <dirent.h>#include <stdlib.h>#include <math.h>#define GTK_ENABLE_BROKEN/在文本構(gòu)件中使用int read_proc();/讀取proc文件容int timeout_refresh();/時(shí)間刷新函數(shù)char *strcut(char *main_str, char *sub_str);/取字符串char *findstr(char *mainst
53、r,int n); /查找字符串void on_button_H_clicked (GtkWidget *button,gpointer userdata); /關(guān)機(jī)的對(duì)話框void on_button_G_clicked (GtkWidget *button,gpointer userdata); /重啟的對(duì)話框void on_button_E_clicked (GtkWidget *button,gpointer userdata); /退出的對(duì)話框void on_button_P_clicked (GtkWidget *button,gpointer userdata); /結(jié)束進(jìn)程的對(duì)
54、話框void on_button_M_clicked (GtkWidget *button,gpointer userdata); /卸載模塊的對(duì)話框void kill_proc(void);void uninst_mod(void);static char pro_buf256532;/進(jìn)程信息static char *pro_pid; /進(jìn)程pidstatic char *mod_name;/模塊名static char sys_buf210196;/系統(tǒng)信息static char mm_buf10196;/存信息static char module_buf256332;/模塊信息static char cpu_buf2561032; /cpu信息static int pro_row;static int mod_row;static int temp_pro;/當(dāng)前進(jìn)程數(shù)static int pre_pro;static int run_pro=1; /運(yùn)行進(jìn)程數(shù)static int temp_module;/當(dāng)前模塊數(shù)static int pre_module;static int temp_cpu; /CPU個(gè)數(shù)static double pre_c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 海報(bào)設(shè)計(jì)合同模板
- 家庭雇傭保姆合同樣式參考
- 2024獨(dú)家原創(chuàng)企業(yè)績效合同簽定儀式領(lǐng)導(dǎo)講話稿
- 2024租賃辦公室合同范本
- 個(gè)人教育助學(xué)貸款
- 購房借款協(xié)議2024年
- 籃球訓(xùn)練合作協(xié)議范本
- 房產(chǎn)代理合同租賃
- 個(gè)人消費(fèi)借款合同范本
- 提升機(jī)租賃合同樣本格式
- 靜療相關(guān)血管解剖知識(shí)課件
- 物業(yè)公司消防知識(shí)培訓(xùn)方案
- 漠河舞廳賞析
- 餐飲行業(yè)報(bào)告:中餐出海
- 2024年江蘇鐘吾大數(shù)據(jù)發(fā)展集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 青少年數(shù)獨(dú)智力運(yùn)動(dòng)會(huì)U12組數(shù)獨(dú)賽前集訓(xùn)題
- 醫(yī)院健康教育培訓(xùn)課件
- GH/T 1419-2023野生食用菌保育促繁技術(shù)規(guī)程灰肉紅菇
- 高一英語語法知識(shí)點(diǎn)北師大
- 鼻咽癌的放射治療課件
- 明孝端皇后九龍九鳳冠
評(píng)論
0/150
提交評(píng)論