[本來想要把另一個已經廢棄已久的 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
NachOS 4.0 (C++ version) @UC Berkeley
NachOS 4.1 @Universität Karlsruhe
NachOS 5.0j @UC Berkeley
NachOS (Java version) @Rice University
安裝前的環境需求:
- cygwin-在MS Windows的環境下也可以跑Linux-Like Shell的模擬器。
- MIPS cross-compiler-用來把UserProgram編譯成在MIPS下跑的執行檔。NachOS是吃MIPS的coff格式的檔案。
- 把jdk/bin的目錄加入環境變數PATH。
NachOS 5.0j 安裝步驟:
- 把nachos-java-2005spring.tar.gz放在/opt底下。
用tar zxvf nachos-java-2005spring.tar.gz把他解開。 - 把/nachos/Makefile用notepad打開來編輯。
javac -source 1.3 -nowarn -classpath . -d . -sourcepath ../.. -g $< (加上這粗體字的參數) test: cd ../test ; make(從gmake改成make) - 編輯/nachos/test/Makefile...
GCCDIR = /xxx/
在xxx處放上cross-compiler的所在目錄。
CC=$(GCCDIR)mips-gcc
其他的類推... - cd /proj1
make
make test
../bin/nachos - 接下來應該會看到一連串正常執行結果。
我遇到的問題:
- 為什麼跑proj3會出現unknown system call?
因為NachOS只有實做一個的system call,其餘的system call要自己實做出來。nachos.userprog.UserProcess裡有handleSyscall(...)這個函式,要自己處理各式各樣的system call。 - 每次執行都要打../bin/nachos嗎?
可以去編輯/etc/profile。去下找export PATH=...這一行。
export PATH="/usr/local/bin:/usr/bin:/bin:/opt/nachos/bin:$PATH"
增加/nachos/bin的目錄進去,以後在任何目錄都可以執行nachos這個執行檔了。 - MIPS指令看不懂怎麼辦?
MIPS Instruction Set Reference - 如何增加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中實做...) - C++版本的真的不能用嗎?
資工的工作站和cygwin都試過了,都會有Compile Error,還有清大OS的課程網頁也有說明。所以應該是說,可以用,但是要debug。 - 要怎麼看到MIPS的Assembly Code?
gcc加上-S參數就可以。 - 用哪個Timer比較準?
InterruptHandler大約每Stats.TimerTicks會invoke一次,不過不是很準,最好還是用getTime()來獲得系統時間。
No comments:
Post a Comment