實驗目的 1.Be familiar with Subversion (SVN) and GDB (the GNU Debugger) 2.Setup your account to work on OS161 3.Understand the source code structure of OS161 4.Know how to build the OS161 kernel from source 5.Learn how to modify the OS161 kernel by adding debugging statements and system calls
實驗內容 1.Install OS/161, Sys/161 and the toolchain 2.Learn how to modify it, build it, run it, and debug it 3.Customize the Kernel Boot Output 4.Add a Kernel Menu Command
實驗環境
Environment:Ubuntu 14.04
Compiler:
GCC MIPS Cross-Compiler
GDB for Use with OS/161
bmake for use with OS/161
實驗報告 1.細節說明 此次實驗資料來自於哈佛大學CS350 作業系統課程,OS161是Harvard開發的專門用於學習和練習的簡易作業系統,OS161分為兩部分,kernel和user兩層 在安裝資料夾裡,kernel資料夾裡面的是OS的核心檔案,不在kernel裡面的就是公共檔案。在安裝目錄下make會編譯所有的公共資訊,包括測試程式等等,基本都是使用者層的東西。而在kernel/ASSTX/compile裡面make則會重新編譯整個OS161,不過相對的,如果要在kernel裡新增檔案,則需要在kernel/conf裡面的修改設定,然後才能正確的編譯。 (We use a simulator in CS350 because it allows everyone to have a private machine on which to test their operating system. In addition, debugging and testing the operating system on the simulator is easier than it would be on real hardware. The System/161 machine simulator has been found to be an excellent platform for rapid development of operating system code, while still retaining a high degree of realism. Apart from floating point support and certain issues relating to RAM cache management, it provides an accurate emulation of a MIPS R3000 processor.)
2.實驗思路 Sys161 kernel中所涉及到的原始檔分別是kprintf.c, main.c ,menu.c ,和lib.h, 檔案都位於os161-1.99/kern/startup 的目錄下。 1) 分析main檔案發現,在主函式中的輸出部分,有個kprintf函式用於輸出顯示資訊在標準輸出中,將其中的“Put-your-group-name…”改為自己的使用者名稱即可。 2) 第二個實驗要求設定一個新的函式dth,使得DOS介面中可以輸出給定執行緒的除錯資訊。這個函式dth是顯示在sub_menu的選擇介面中。分析menu.c檔案可以發現,可以參考已有的cmd函式系列,自己寫一個關於dth的函式,並在cmdtable中建立對應的選擇介面。 3) 根據ASST0中的說明,我們需要這個dth函式能夠the output of debugging messages of type DB_THREADS,這個debug資訊來自於一個kernel中的全域性變數 dbflags, 該變數定義了哪種debug資訊可以在核心執行的情況下輸出(defines which types of debugging messages should be displayed when the kernel runs)。該變數的預設值為0 查詢發現在lib.h檔案中定義DB_THREADS為0x0010,自此我們可以知道,在dth函式中將dbflags賦DB_THREADS的值,即可達到要求。
3.實驗結果 1)在menu中新增dth命令選項
2)menu中自定義的cmd_dth函式
3)最終結果輸出
4.遇到的問題及解決方案 本次實驗最大的問題不在於新增命令函式,而在於安裝和配置環境。 1) 安裝Step5中GDB安裝報錯Error2 經大家相互交流發現,是因為原先的電腦中沒有安裝libncurses-devel library,按照指導上面的操作還是失敗,所以直接google一下後下載好了需要的檔案。
2) 安裝Step7中對應的bin檔案沒有相應的檔案,且執行ln命令時bmake未定義報錯。
經過一番查詢嘗試發現,指導書上的sh語句總共有兩行,而兩行間沒有說明,容易使人誤會為兩條命令,也導致了echo語句一直無法執行。全部的正確執行語句如下:
sh –cs 'for i in mips-*; do ln -s $HOME/sys161/tools/bin/$i $HOME/sys161/bin/cs350-echo $i | cut -d- -f4-
; done'
3) 關閉終端之後再執行語句報錯:sys161語句未定義 討論之後發現,按照指導書上的命令,在Step3配置環境變數和PATH的時候,我們只是將該命令路徑新增在了當前終端介面之中,並沒有改變整個ubuntu的環境,所以當關閉終端之後,由於系統訪問不到命令對應的路徑,無法執行該指令。 查詢發現有三種改路徑的方式 直接在/etc/environment目錄下新增路徑。但在此次實驗中,該目錄許可權是隻讀,所以無法新增路徑。(當然,直接改掉environment可能會使得電腦重啟之後無法登陸,一旦出錯就會引發很多麻煩的問題) 在終端中直接輸入export PATH=$HOME/sys161/tools/bin:$PATH,這也是指導書上要求我們去做的,這種方式變數可以立即生效,但是隻適合臨時變數的設定。 在etc/profile 中加入PATH設定(這樣對所有的使用者都有效)或者在終端gedit ~/.profile (or .bashrc),將PATH新增在此檔案末尾。(只對當前使用者有效) 問題解決如下圖所示