




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、操作系統課程設計實驗報告姓 名: 劉 蕩 學 號: xxxxx 專 業:計算機科學與技術 班 級: xxxxxx 指導教師: xxxxx 完成日期: 2012年4月23日目 錄一、設計目的 .3 二、設計內容.3三、設計過程與調試記錄.3實驗1 熟悉Linux下C編程環境.3程序設計思路.3調試結果.4實驗小結.4實驗2 掌握添加系統調用的方法.5程序設計思路.5具體步驟.5調試結果.6實驗小結.7實驗3 掌握添加設備驅動程序的方法.7程序設計思路.7具體步驟.8調試結果.9實驗小結.11實驗4 理解和分析/proc文件.11實驗過程.11程序設計思路.11實驗小結.17四、驗收.17五、源代
2、碼說明.18六、實驗心得與體會.19一.設計目的(1)掌握Linux操作系統的使用方法;(2)了解Linux系統內核代碼結構;(3)掌握實例操作系統的實現方法。二.設計內容1.熟悉和理解Linux編程環境。編寫一個C程序,使用Linux下的圖形庫,分窗口顯示三個并發進程的運行結果。2.掌握添加系統調用的方法。(1)采用編譯內核的方法,添加一個新的系統調用,實現文件拷貝功能;(2)編寫一個應用程序,測試新加的系統調用。3.掌握添加設備驅動程序的方法。(1)采用模塊方法,添加一個新的設備驅動程序;(2)編寫一個應用程序,測試添加的驅動程序。4.理解和分析/proc文件。(1)了解/proc文件的特
3、點和使用方法;(2)監控系統狀態,顯示系統部件的使用情況;(3)用圖形界面顯示系統監控狀態。5.文件系統(選做)。設計、實現一個模擬的文件系統。三.設計過程與調試記錄實驗1、熟悉和理解Linux編程環境。編寫一個C程序,使用Linux下的圖形庫,分窗口顯示三個并發進程的運行結果。程序設計思路首先創建3個顯示窗口的函數(win1.c,win2.c,win3.c),分別編譯鏈接,得到3個可執行程序(win1.exe,win2.exe,win3.exe分別顯示一個小窗口)。然后,再創建一個主函數(main.c),在main.c中,先由main(函數產生父進程,父進程fork(兩次創建兩個子進程,即可
4、得到3個并發執行的進程(這部分上學期我們已經做了實驗)。最后,分別在每個進程中通過execv(調用win1.exe,win2.exe和win3.exe。另外,由于編譯鏈接次數比較多,可以編寫makefile文件,以簡化輸入過程。Makefile文件內容如下:win1:gcc -o win1.exe win1.c pkg-config -cflags -libs gtk+-2.0 win2:gcc -o win2.exe win2.c pkg-config -cflags -libs gtk+-2.0win3:gcc -o win3.exe win3.c pkg-config -cflags -
5、libs gtk+-2.0wmain: gcc -o wmain.exe wmain.cclear: rm ./*.exe 調試結果實驗小結因為上學期,我們已經做了進程并發和execv函數調用的實驗,在此基礎上,只需要再利用GTK編寫簡單的窗口即可,所以本次實驗很簡單。另外,要注意,用gcc編譯GTK程序,pkg-config -cflags -libs gtk+-2.0不能省!實驗2、掌握添加系統調用的方法。采用編譯內核的方法,添加一個新的系統調用,實現文件拷貝功能;編寫一個應用程序,測試新加的系統調用。程序設計思路關于文件拷貝,若是應用程序級的文件拷貝,我們首先需要利用C標準文件函數ope
6、n(來進行對COPY源文件和目的文件的打開操作(如果目的文件并不存在就新建之),同時返回文件的指針;然后利用文件指針讀取文件,判斷是否到達源文件的末尾,否則就逐個字符地從源文件讀取字符,并寫入目的文件;拷貝完成之后,再利用close(函數關閉源和目的文件。但本實驗要實現系統調用級的文件拷貝,就不能使用C標準函數和頭文件,需要將open(和close(分別換成要寫成系統調用形式的sys_open(和sys_close(。至此,實現系統調用級的文件拷貝的源代碼就完成了。關于測試程序,首先需要將包含新系統調用的同文件/usr/src/linux-3.2.13/arch/x86/include/asm
7、/unistd_32.h和sys/syscall.h包含進來,再利用函數syscall(調用號,源文件名,目的文件名測試。具體實現步驟下載最新版的內核源碼linux-3.2.13 ,并將其復制到/usr/src/下。由于還需要將新增加了系統調用添加到新內核中,必然要涉及到一系列系統文件的修改,以及對新內核進行編譯。具體操作步驟如下:步驟_1 添加源代碼。即需要添加新增系統調用的處理函數,該函數的名稱應該是新的系統調用名稱前面加上sys_標志,同時函數原型前需要加上asmlinkage。將mycopy.c中的內容添加到/usr/src/linux-2.4.20-8/kernel/sys.c文件末
8、尾。步驟_2 連接新的系統調用。添加新的系統調用后,下一個任務是使Linux內核的其余部分知道該程序的存在。為了從已有的內核程序中增加到新的函數的連接,需要修改兩個文件。1 修改文件/usr/src/linux-3.2.13/arch/x86/include/asm/unistd_32.h,該文件中包含了系統調用清單,用來給每個系統調用分配一個唯一的號碼。應該將新的系統調用名稱加到清單的最后,并給它分配號碼序列中下一個可用的系統調用號。我們的系統調用如下: #define _NR_process_vm_readv 347#define _NR_process_vm_writev 348#ifd
9、ef _KERNEL_#define NR_syscalls 349最后一行說明內核自身的系統調用號已經使用到了348,共有349個(從0開始)。我們將新添加的系統調用應該加到最后,并修改系統調用總數。修改如下:#define _NR_process_vm_readv 347#define _NR_process_vm_writev 348#define _NR_mycopy 349 /*這是我們自己添加的系統調用*/#ifdef _KERNEL_#define NR_syscalls 350 2 修改文件/usr/src/linux-3.2.13/arch/x86/kernel/syscal
10、l_table_32.S,該文件用來對sys_call_table數組進行初始化,該數組包含指向內核中每個系統調用的指針,所以也需要在該數組中增加了新的內核函數的指針。即在該文件末尾添加一行“.long sys_mycopy”。步驟_3 以root身份進入/usr/src/linux-3.2.13 目錄,重建Linux內核。用make mrproper命令用來清除舊的配置等文件,避免編譯內核時生成的文件不一致;用基于文本的菜單形式make menuconfig配置內核,只需進入后按下鍵一直到最下面,選中 save-回車即可;3 用make編譯內核(為加快編譯速度,也可用make -j4;4 用
11、make modules_install生成并安裝模塊;make install 安裝新內核;update-grub自動更新啟動項文件(或者手動修改grub.cfg)。灰步驟_4 重啟內核.重啟后,發現新增了“Linux Mint 11, 3.2.13”選項,(原來只有Linux Mint 11, 2.6.38-8-generic ),說明新內核重建成功。然后選擇進入新的內核。步驟_5 測試新的系統調用。用 gcc test_cp.c,然后運行。調試結果先使用uname r查看當前內核版本號,3.2.13是新核。然后編譯測試程序:查看1.c和2.c文件中的內容:兔實驗小結本次實驗,主要讓我們掌
12、握了如何在Linux下增加新的系統調用。其中遇到的最大的問題是,我用make命令編譯內核時,當編譯到新增系統調用時,卻總是報段錯誤,通過在網上查找資料得知,才知道系統調用時,需要現將用戶態下的文件內容拷貝到核態下,再由核態拷貝回用戶態下,這其中涉及到段的操作,于是在系統調用函數中加入了段操作的語句,即在打開文件之前添加mm_segment_t fs;fs = get_fs(;set_fs(get_ds(;對段操作初始化。在關閉文件之后添加set_fs(fs;修改后,重新編譯內核,終于編譯成功。實驗3、掌握添加設備驅動程序的方法。采用模塊方法,添加一個新的設備驅動程序;編寫一個應用程序,測試添加
13、的驅動程序。程序設計思路(1設備驅動程序是操作系統內核和機器硬件之間的接口。設備驅動程序為應用程序屏蔽了硬件的細節,這樣在應用程序看來,硬件設備只是一個設備文件, 應用程序可以象操作普通文件一樣對硬件設備進行操作. 用戶進程利用系統調用在對設備文件進行各種文件操作時(read,write,open,release等),系統調用通過設備文件的主設備號找到相應的設備驅動程序,然后讀取這個數據結構的相應的函數指針,接著把控制權交給該函數。(2一個典型的驅動程序,大體上可以分為這么幾個部分: 注冊設備:在系統初啟,或者加載時候,必須將設備登記到相應的設備數組,并返回設備的主驅動號。 定義功能函數:對于
14、每一個驅動函數來說,都有一些和此設備密切相關的功能函數。拿最常用的塊設備或者字符設備來說,都存在著諸如 open(、read(、write(、release(這一類的操作。當系統調用這些函數時,將自動地使用驅動函數中特定的函數來實現具體的操作。此實驗是編寫一個字符設備驅動,所以主要工作是編寫子函數,并填充 file_operations 的各個域 。例如: struct file_operations MyFops = .read=device_read,.write=device_write,.open=device_open,.release=device_release;然后再自定義并實
15、現函數device _read,device_write,device_open,device_release相應的函數體。 在device_open中,調用了五、寫出與下列字意思相反的字詞(5分新 在中,調用了module_put(THIS_MODULE,減少這個模塊使用者的數目,否則一旦打開這個模塊以后,永遠都不能釋放掉它; 容易device_read中,調用了六、寫出詞語中的數字。(4分)device_write中,調用了copy_from_user,將用戶空間中的數據拷貝到內核空間。卸載設備:在不用這個設備時,。 顏 色 牛 虎是以模塊的形式編寫的,這樣,就可以像內核模塊一樣在需要的時
16、候動態加載,不使用時卸載。使用insmod命令可以手工加載模塊,通過 來注冊設備,在cleanup_module(中要調用unregister_chrdev(來卸載設備。具體實現步驟步驟_1 編寫設備驅動源代碼。(注意,除了大 學 氣 天需要是static類型。) 步驟_2 (驅動源程序 )( )() ( )( )( )( ) _載內核中模塊。八、寫出帶有下列偏旁的字。(命令:sudo insmod ./mydev.ko分)辶-( ( ( 此時使用命令cat /proc/devices,會看到在字符設備中有250 MyDevice-設備注冊名。扌-( ( ( 氵-( ( ( 木-( ( ( 冫
17、-( ( ( 步驟_4 創建新的虛擬設備文件嗎 呢 呀 吧 步驟_5 1、我們學校要蓋新樓房編寫測試程序,運行時要加2、這是怎么回事( ?步驟_6 卸載操作4、我們的校園真美刪除新增的字符設備文件命令:5、爸爸,您能給我買一個文具盒( ?常常 非常 make -C $(KERNELDIR M=$(PWD modules( #7、公園里的花很多,開得( 美麗。十、將下列詞語連起來,組成一句話,并加上標點。(4#刪除模塊,和加載模塊一樣.ko不能省! 和 2、又聰明 小青蛙的又勇敢clear2: 小家伙真是個 十一、按課文內容填空,不會寫的字用拼音代替。(10分)1、一年之計在于春, 2編譯模塊文
18、件,編譯完后發現根目錄下生成了.ko文件:3、解落三秋葉, 。4、欲窮千里目, 。5 加載內核模塊:呼作白玉盤。 十二、讀短文,回答問題。(9創建新的虛擬設備文件,并使用ls命令,發現/dev目錄下,新增了MyDevice春娃娃對小花說句話,小花就咧(li)開了紅嘴巴。yn春娃娃的能耐(ni可真大,世界萬物都聽他的話!1、這首兒歌一共有 句話。2、春娃娃對 、 、 、 說話了。,總算真正對驅動程序有了一定的掌握。其實,編寫一個設備驅動程序的主要工作是編寫子函數,并填充4、你也來寫寫看。然后,再將新的設備驅動以模塊方式加載進來。分春娃娃對 實驗4、理解和分析十三、作文(9分)實驗過程認識proc
19、文件系統進程文件系統和內核文件系統組成的復合體;將內核數據對象化為文件形式進行存取的一種內存文件系統;監控內核的一種用戶接口,擁有一些特殊的純文本文件,從中可以獲取系統狀態信息。通過查找資料,proc文件系統中主要文件的內容,比如/proc/cpuinfo: CPU信息/proc/version:操作系統信息/proc/stat: CPU 的使用情況 /proc/meminfo: 內存狀態信息(包括內存使用率,交換區使用率)/proc/uptime第一個數表示系統運行時間,第二個數表示系統空閑的時間/proc/$pid/stat進程信息 我們要顯示系統信息,只需進行相應的文件操作。 首先打開相
20、應的文件,讀取所需要的信息,將其寫入一個緩沖區中,然后將緩沖區的內容加到 Gtk 的相應的控件上面去,最后將控件組合顯示即可 。 總體框架:主界面上,先利用gtk_window_new(GTK_WINDOW_TOPLEVEL創建主窗口,在主窗口內使用gtk_table_new(創建一個表格,在表格里使用創建一個筆記本頁,notebook的每一頁里創建一個表格,最后只需將需要顯示的系統信息顯示在notebook的每一頁的表格中即可。具體設計及相應運行結果資源信息頁面:先使用gtk_vbox_new (FALSE, 0添加縱向盒子,在盒子內使用4次gtk_frame_new(分別創建CPU使用率、
21、主存使用率、交換區使用率和系統啟動及運行時間的邊框構件。除了系統啟動及運行時間的邊框只是數字顯示之外,其它的邊框還分別利用gtk_progress_bar_new(創建了進度條來顯示結果,而且進度條結果通過定時器函數gtk_timeout_add(,可以每隔1秒自動刷新一次。內存信息頁面:包括2列,“項目名”和“大小”。先使用gtk_vbox_new (FALSE, 0添加縱向盒子,在盒子中使用gtk_scrolled_window_new(添加滾動窗口,在該窗口中使用gtk_tree_view_new_with_model (添加tree view控件,用來顯示內存信息樹 (當然,在此之前還
22、需要讀取文件/proc/meminfo,將每行信息使用gtk_list_store_append(和gtk_list_store_set(添加到內存信息樹的列表中。另外,還使用gtk_button_new (創建了一個手動刷新內存信息的按鈕。進程信息頁面:包括5列,進程名、PID 、狀態、 CPU占用率 和占用主存。設計框架同內存信息頁面的設計,與之不同的是,由于每個進程信息保存在/proc/$pid/stat文件中,所以不是簡單的讀取并顯示一個文件的內容,而是需要分別讀取并顯示各個進程所在的文件的內容。另外,進程信息頁面多了手動殺死進程的按鈕,每點擊一下該按鈕,則獲取該進程的pid,調用ki
23、ll(進程號, SIGTERM來殺死該進程。還統計并顯示了睡眠進程(狀態為“S”)和運行進程(狀態為“R”)的數目。磁盤信息頁面:包括4列, MAJOR、MINOR 、BLOCK和NAME”。需要讀取文件/proc/partitions,設計框架同內存信息頁面的設計。系統信息頁面:先使用gtk_vbox_new (FALSE, 0添加縱向盒子,在盒子內使用2次gtk_frame_new(分別創建CPU信息邊框和OS信息邊框,再在邊框中使用gtk_label_new(創建標簽,來顯示相關信息主機名。其中CPU信息包括CPU型號、CPU頻率和Cache大小 ,操作系統信息包括操作系統名、版本號、主
24、機號和Gcc 版本。另外,主界面上還同步顯示了系統時間、進程總數等,還使用gtk_menu_bar_new(創建了菜單欄,包括“文件”、“關機選項”和“幫助”,其中“文件”菜單又包括下拉子菜單“退出”,“關機選項”又包括下拉子菜單“關機”、“重啟”和“注銷”,點擊子菜單會進行相應的處理。“幫助”菜單又包括下拉子菜單“關于任務管理器”,點擊后,會彈出作者的相關信息。實驗小結本實驗雖然程序的思路很清晰,除了需要C語言文件處理函數之外,大部分都要用到Linux圖形庫GTK畫圖的函數,這應該算是真正第一次接觸GTK,所以實驗前花了不少時間去閱讀有關GTK編程方面的demo。經過自己慢慢的摸索, 掌握了
25、一定的GTK編程后,才開始著手編寫程序。在調試過程中,好幾次遇到的段錯誤,后來發現,幾乎都是由數組設置得過小,導致存儲越界引起的。四、驗收(在實驗4源代碼的基礎上添加了函數 notebook_call_init(和get_call_info(,以及一些變量)老師給我的驗收題目是:讀取系統調用文件,并顯示調用號是6的倍數的系統調用的調用名和調用號。設計思路首先,找到存放系統調用名和調用號信息的文件,/usr/include/asm-generic/unistd_32.h。打開該文件,發現每行的基本格式為“#define _NR_調用名 調用號”。所以可以在實驗4的基礎上,再添加一個筆記本頁面,同內存信息頁面的設計方式完全一樣,只是此處需要讀取并提取/usr/include/asm-generic/unistd_32.h的信息。分析到此處,就只需要再花幾分鐘編寫代碼就OK了,可為什么在規定的時間內未完成給老師
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年審計實務試題及答案
- 2023年中國能建部分所屬企業領導人員招聘(競聘)筆試參考題庫附帶答案詳解
- 白酒釀造過程中的工藝傳承與創新考核試卷
- 紙張油墨吸收性考核試卷
- 皮革護理的文化價值傳播與推廣考核試卷
- 2024年微生物檢驗技師考試指導及試題及答案
- 棉花倉儲員工職業素養培訓考核試卷
- 糧油市場渠道開發與維護策略考核試卷
- 相機拍攝模式創新與應用考核試卷
- 2024年項目管理軟技能的重要性試題及答案
- 混凝土樓蓋課程設計講解
- 3-1-立體表面上點的投影
- (正式版)QB∕T 2761-2024 室內空氣凈化產品凈化效果測定方法
- GB/T 44193-2024全國一體化政務服務平臺一網通辦基本要求
- NB-T+31045-2013風電場運行指標與評價導則
- 北京市海淀區2023-2024學年八年級下學期期末物理試卷
- 《無人機測繪技能訓練模塊》課件-模塊8:像片控制點測量
- JBT 14732-2024《中碳和中碳合金鋼滾珠絲杠熱處理技術要求》
- 固體氧化物燃料電池陰極的絲網印刷制備及其性能評價的研究
- 制定偵破方案教案設計
- 機動車檢測站內審報告(依據補充技術要求)
評論
0/150
提交評論