天天看點

宏核心linux,linux宏核心

《作業系統》課程設計報告課程設計題目:作業系統課程設計 設計時間:2016/1/10一、 課程設計目的與要求需要完成的内容:(1) 安裝虛拟機:Vmware、Vmware palyer (free)(推薦)、Virtualbox(推薦)、VMLite、Xen、Virtuozzo、KVM(2) 安裝和使用Linux(推薦SUSE)(注意包含核心源碼和核心開發工具等)(3) Linux核心源代碼配置和重編(4) 找到VFS和一個具體檔案系統的源代碼(ext3或ext4)(5) 讀懂VFS和具體檔案系統如何關聯(如何展現virtual file switch)(6) 找到具體檔案系統的read或write函數,使用printk(使用方法和printf一樣)向背景列印檔案讀寫資訊。(read或write函數選一個即可)(7) 使用dmesg –c檢視背景的輸出。可以附加的功能(8) 複制ext3或ext4的源代碼(注意與目前使用的檔案系統有差別),修改Makefile檔案,使用子產品編譯方式(9) 修改ext3或ext4的源代碼,實作新的檔案系統。(至少需要修改檔案系統的名稱,最好能對檔案寫操作向系統背景列印出資訊。)(10) 動态加載和解除安裝新的檔案系統。二、 課程設計内容(1) 安裝虛拟機(2) 安裝和使用Linux(3) Linux核心源代碼配置和重編(4) 提取并動态加載和解除安裝新的檔案系統三、 課程設計裝置與環境裝置資訊:PC

虛拟機:VM11

四、 設計正文(包括分析與設計思路、各子產品流程圖、帶注釋的主要算法源碼、核心編譯過程以及動态子產品加載過程等,如有改進或者拓展,請重點用一小節進行說明)(1) 安裝虛拟機(2) 安裝和使用Linux(推薦SUSE)(注意包含核心源碼和核心開發工具等)安裝OpenSUSE,并下載下傳相近版本的核心源碼

初始核心版本

下載下傳的源代碼包

(3) Linux核心源代碼配置和重編利用vmtools(虛拟機提供的可以在主控端和虛拟機之間自由複制檔案的工具)将核心源碼包複制進虛拟機,解壓到/home/a123/linux-3.12.51

*因為配置設定的磁盤空間比較小,是以沒有按照慣例把核心源碼放在/usr/src目錄下(如果放在這裡,會出現空間不足的情況)附:磁盤配置設定情況/swap(交換分區) 2.4G/(根目錄) 11G/home(使用者目錄) 13G

解壓好的核心源碼檔案在編譯前需要稍作修改(6),并且缺乏一個config檔案告訴編譯器編譯哪些功能。Config檔案可以用make menuconfig指令生成,但是需要自己選擇相應的功能,太過複雜,這裡有一個簡便的方法因為下載下傳的核心源碼是相近的版本,是以可以使用現有版本的config檔案,該檔案在/boot目錄下使用cp /boot/config-3.11.6-4-desktop .config指令将此檔案複制過來

注意:應當在核心所在的檔案目錄下使用此指令複制成功

執行 make menuconfig指令,進入選擇界面,直接儲存退出即可雖然新版本的Linux可以直接執行make一步完成所有的編譯工作,但此次課程設計仍然采用以前的編譯的方式

執行 make bzImage指令——編譯壓縮的核心編譯完成

執行 make modules指令——編譯子產品

執行 make modules_install指令——安裝子產品

注:

在make menuconfig時我在General setup中把版本号改過

執行 make install指令——安裝新核心

Reboot重新開機

說明核心修改安裝完畢,成功(4) 找到VFS和一個具體檔案系統的源代碼(ext3或ext4)VFS:虛拟檔案系統,顧名思義。它為應用程式員提供一層抽象,屏蔽底層各種檔案系統的差異。Linux的檔案系統采用面向對象的方式設計,這使得Linux的檔案系統非常容易擴充,我們可以非常容易将一個新的檔案系統添加到Linux中。在此主要對象之一super_block位于中

代碼量巨大,此為部分代碼Ext4在fs檔案夾下的ext4檔案夾内

此處打開file.c用vim打開file.c部分代碼如下

(5) 讀懂VFS和具體檔案系統如何關聯(如何展現virtual file switch)在(4)中已經提到,VFS是C語言寫的一個面向對象的設計,比如我們要調用alloc_inode方法:sb->s_op->alloc_inode(sb)。這裡與面向對象語言的差别是,面向對象語言裡執行個體方法可以通路到this,這樣就可以通路到自身的所有成員,但是在C裡卻做不到,是以需要将自身作為參數傳入到函數中、圖一表示了對檔案寫操作的調用過程

(6) 找到具體檔案系統的read或write函數,使用printk(使用方法和printf一樣)向背景列印檔案讀寫資訊。(read或write函數選一個即可)因為Linux系統對檔案的操作是通過函數調用來實作的,是以在此我修改的是vfs這一層,找到fs,目錄下的read_write.c并打開找到do_sync_read函數,在其傳回前加入printk語句

(7) 使用dmesg –c檢視背景的輸出。

(8) 複制ext3或ext4的源代碼(注意與目前使用的檔案系統有差別),修改Makefile檔案,使用子產品編譯方式

(9) 修改ext3或ext4的源代碼,實作新的檔案系統。(至少需要修改檔案系統的名稱,最好能對檔案寫操作向系統背景列印出資訊。)

使其在加載和解除安裝的時候能夠printk到buffer緩沖中(10) 動态加載和解除安裝新的檔案系統。使用insmod語句加載使用lsmod語句加載

加載成功接下來使用dmesg 檢視緩沖區内容

成功接下來使用rmmod語句解除安裝子產品

成功五、 課程設計結果及分析課程設計結果:成功分析:Linux檔案系統使用了面向對象的設計方法,保證了其對使用者的透明,VFS層實作了系統與檔案系統的無關性,增加了系統對不同檔案系統的相容性。六、 總結與進一步改進設想總結:1.編譯核心的時候,可以使用make XXX –j8這樣可以開啟多線程編譯(我的虛拟機配置設定的是8核心),加快編譯速度2.printk語句我寫的是printk(”””DoingRead”);本意是利用printk的優先級,将其輸出到使用者态的控制台,結果文法錯誤,并沒有輸出到控制台改進設想:修改的檔案前加上語句,實作對控制台的輸出

define KERN_EMERG 0(因為缺少這個宏,導緻系統并沒有了解我的0是什麼意思)

七、 答辯(或彙報)記錄(包括問題和答案,每個人不少于3個)

顯示核心版本

使用dmesg –c指令

加載新子產品

八、 參考文獻

鳥哥的Linux私房菜

百度百科:printk概述http://baike.baidu.com/link?url=Kv5e2xb9thGENkIvSQmjpkYb8kbKoNvEhmt2oICTmDAn0wj2YADVf8dsrzBtz2fRt0uwa_3joQ-o40wKwwL68a

Linux虛拟檔案系統(VFS)http://www.cnblogs.com/yuyijq/archive/2013/02/24/2923855.html

LinuxEXT4檔案系統分析http://wenku.baidu.com/link?url=Wi-vyrROUIJqRk4eSsuwOwRe0Sf-ydXamWNR0H2HCrN9CPHJg80lXpu0Gi_ZGT-X5yKnknl86ooHdckHhJxybmyBR2szWsPDOV0IPJ6fJXO