Monday, April 11, 2011

NachOS安裝心得

[本來想要把另一個已經廢棄已久的 Blog 關掉,發現有兩篇文章被大量閱讀。看起來應該是對某些人還是有些幫助,我決定將他們轉錄到這邊來。感謝讀者的支持。]

Date: 2005/06/15

作業系統期末作業是以NachOS這個教學用的平台,體驗作業系統的運作。不過,安裝的過程卻一點也不順遂,所以我把一些安裝心得整理在這邊;方邊我自己參考,也幫助其他同樣遭遇到安裝問題的人。

目前我有找到四個NachOS版本,一個是最原始的,用C++實做的版本;另一個也是用C++實做的版本;最後兩個是跟隨其後,以Java來實做的版本。四種版本的架構都很類似,而我就是在安裝C++版本遇到挫折之後,轉而決定要來累積一些心得的。
NachOS 4.0 (C++ version) @UC Berkeley
NachOS 4.1 @Universität Karlsruhe
NachOS 5.0j @UC Berkeley
NachOS (Java version) @Rice University

安裝前的環境需求:
  1. cygwin-在MS Windows的環境下也可以跑Linux-Like Shell的模擬器。
  2. MIPS cross-compiler-用來把UserProgram編譯成在MIPS下跑的執行檔。NachOS是吃MIPS的coff格式的檔案。
  3. 把jdk/bin的目錄加入環境變數PATH。
NachOS 5.0j 安裝步驟:
  1. 把nachos-java-2005spring.tar.gz放在/opt底下。
    用tar zxvf nachos-java-2005spring.tar.gz把他解開。
  2. 把/nachos/Makefile用notepad打開來編輯。
    javac -source 1.3 -nowarn -classpath . -d . -sourcepath ../.. -g $< (加上這粗體字的參數) test: cd ../test ; make(從gmake改成make)
  3. 編輯/nachos/test/Makefile...
    GCCDIR = /xxx/
    在xxx處放上cross-compiler的所在目錄。
    CC=$(GCCDIR)mips-gcc
    其他的類推...
  4. cd /proj1
    make
    make test
    ../bin/nachos
  5. 接下來應該會看到一連串正常執行結果。
我遇到的問題:
  1. 為什麼跑proj3會出現unknown system call?
    因為NachOS只有實做一個的system call,其餘的system call要自己實做出來。nachos.userprog.UserProcess裡有handleSyscall(...)這個函式,要自己處理各式各樣的system call。
  2. 每次執行都要打../bin/nachos嗎?
    可以去編輯/etc/profile。去下找export PATH=...這一行。
    export PATH="/usr/local/bin:/usr/bin:/bin:/opt/nachos/bin:$PATH"

    增加/nachos/bin的目錄進去,以後在任何目錄都可以執行nachos這個執行檔了。
  3. MIPS指令看不懂怎麼辦?
    MIPS Instruction Set Reference
  4. 如何增加system call?
    首先找出/nachos/test/syscall.h,增加需要的syscall的宣告。
    /**
    * System call codes, passed in $r0 to tell the kernel which system call to do.
    */
    #define syscallHalt 0
    #define syscallExit 1
    #define syscallExec 2
    ...

    這邊加入syscall的id到時候會傳給NachOS的UserProcess處理。
    當然底下也要增加函式原型的宣告。
    /* Fork a thread to run a procedure ("func") in the *same* address space
    * as the current thread.
    */
    void threadFork(void (*func)());

    然後去編輯/nachos/test/start.s
    SYSCALLSTUB(threadFork, syscallThreadFork)

    在下面會找到類似上行的程式碼,就學著他的形式把剛才新增的syscall做一個對應。
    然後你就可以在Test Program中呼叫新的syscall了。
    (不過還是要在UserProcess中實做...)
  5. C++版本的真的不能用嗎?
    資工的工作站和cygwin都試過了,都會有Compile Error,還有清大OS的課程網頁也有說明。所以應該是說,可以用,但是要debug。
  6. 要怎麼看到MIPS的Assembly Code?
    gcc加上-S參數就可以。
  7. 用哪個Timer比較準?
    InterruptHandler大約每Stats.TimerTicks會invoke一次,不過不是很準,最好還是用getTime()來獲得系統時間。

No comments: