# NachOS 4.0 安裝與執行 ## 一、環境需求 建議環境: * Ubuntu 24.04 * 已可正常使用 Terminal * 有 `sudo` 權限 --- ## 二、安裝必要套件 先開 Terminal,安裝需要的工具與 32-bit 編譯環境: ```bash sudo apt update sudo apt install g++ csh make wget vim g++-multilib gcc-multilib libc6-dev-i386 -y ```` * `g++`、`make`:負責編譯 NachOS * `wget`:下載檔案 * `vim`:修改 Makefile * `g++-multilib`、`gcc-multilib`、`libc6-dev-i386`:讓舊版 NachOS 可以用 32-bit 模式編譯 --- ## 三、建立資料夾 先建立一個乾淨的資料夾來放 NachOS ```bash mkdir -p ~/oslab cd ~/oslab ``` > [!warning] 作業用自己的學號區分,要改成 `oslab_學號` 的資料夾名稱 --- ## 四、下載 NachOS 與 cross compiler ```cp wget -O nachos-4.0.tar.gz \ https://raw.githubusercontent.com/Yuin0329/NachOS-Setup/8deec2b725c1bcf115cc81fc5694bf478afdb154/nachos-4.0.tar.gz wget -O mips-x86.linux-xgcc.tar.gz \ https://raw.githubusercontent.com/Yuin0329/NachOS-Setup/8deec2b725c1bcf115cc81fc5694bf478afdb154/mips-x86.linux-xgcc.tar.gz ``` 下載完後,先確認檔案格式是否正常: ```cp file nachos-4.0.tar.gz file mips-x86.linux-xgcc.tar.gz ``` 正常情況下會看到類似: ```cp gzip compressed data ``` 如果不是這個結果,代表下載到的可能不是正確的壓縮檔 --- ## 五、解壓縮檔案 先解壓縮 NachOS: ```cp tar -xzvf nachos-4.0.tar.gz ``` 再把 cross compiler 解壓縮到根目錄 `/`: ```cp sudo tar -xzvf mips-x86.linux-xgcc.tar.gz -C / ``` 確認 cross compiler 是否存在: ```cp ls /mips-x86.linux-xgcc ``` 如果有看到像 `gcc`、`cpp0`、`cc1`、`as`、`ld` 等檔案,就表示解壓縮成功。 --- ## 六、修改 `code/test/Makefile` 進入 `test` 目錄: ```bash cd ~/oslab/nachos-4.0/code/test vim Makefile ``` 把以下三行改成: ```makefile GCCDIR = /mips-x86.linux-xgcc/ CPP = /mips-x86.linux-xgcc/cpp0 CFLAGS = -G 0 -c $(INCDIR) -B/mips-x86.linux-xgcc/ ``` ### vim 基本操作 * 按 `i` 進入編輯模式 * 修改內容 * 按 `Esc` * 輸入 `:wq` * 按 Enter 存檔離開 --- ## 七、修改 `code/Makefile.common` 進入 `code` 目錄: ```bash cd ~/oslab/nachos-4.0/code vim Makefile.common ``` 把以下幾行改成: ```makefile CFLAGS = -m32 -g -Wall $(INCPATH) $(DEFINES) $(HOST) -DCHANGED LDFLAGS = -m32 CPP=/lib/cpp CC = g++ -m32 -Wno-deprecated LD = g++ -m32 -Wno-deprecated AS = as --32 ``` > [!Note] 這一步的目的是讓 NachOS 主程式在現在的 Ubuntu 上以 **32-bit 模式** 編譯,避免舊版程式在 64-bit 環境中出現相容性問題。 --- ## 八、修改 `code/bin/Makefile` 接著進入: ```bash cd ~/oslab/nachos-4.0/code/bin vim Makefile ``` 把下面三行改成: ```makefile CC=gcc -m32 CFLAGS=-m32 -I../lib -I../threads $(HOST) LD=gcc -m32 ``` > [!Note] 這邊是為了讓 `coff2noff` 也用 32-bit 模式編譯,不然之後可能會出現格式或相容性問題。 --- ## 九、清除舊的編譯結果(Optional / Troubleshooting) > [!Note] 一般情況下,後面的 `make clean` 就可以清除大部分舊的編譯結果。 不過如果你前面曾經用錯誤設定編譯過 NachOS,或是 `make clean` 後仍然出現奇怪的編譯問題,可以用下面的方式手動清除舊檔案: ```bash cd ~/oslab/nachos-4.0/code find . -name "*.o" -delete find . -name "nachos" -delete find . -name "coff2noff" -delete find . -name "swtch.s" -delete find . -name "makedep" -delete find . -name "eddep" -delete ``` 也可以清掉 `test` 底下之前編出來的測試檔: ```bash cd test rm -f *.o *.coff *.noff halt test1 test2 add createFile fileIO* ``` > 這一步主要是用來排除舊檔案造成的問題。 --- ## 十、開始編譯 NachOS 回到 `code` 目錄後執行: ```bash cd ~/oslab/nachos-4.0/code make ``` > [!Note] 註:`make clean` 會先清除前一次 compilation 產生的檔案,避免舊的 object files 影響新的執行結果。 > [!Note] 如果沒有出現 error,且能順利跑完,代表 NachOS 主體與測試程式都編譯完成。 --- ## 十一、執行測試程式 進入 `userprog`: ```bash cd ~/oslab/nachos-4.0/code/userprog ``` 執行 `test1`: ```bash ./nachos -e ../test/test1 ``` 其中 `-e` 表示讓 NachOS 執行指定的 user program。 --- ## 十二、成功時的預期結果 如果設定正確,畫面應該會看到類似: ```text Total threads number is 1 Thread ../test/test1 is executing. Print integer:9 Print integer:8 Print integer:7 Print integer:6 return value:0 No threads ready or runnable, and no pending interrupts. Assuming the program completed. Machine halting! ``` ![image](https://hackmd.io/_uploads/ry--9Xcyfe.png) 看到這裡就表示: * NachOS 主程式已成功編譯 * `test1` 已成功轉成 NachOS 可執行格式 * user program 已能在 NachOS 上正常執行 * 只要最後 `./nachos -e ../test/test1` 能成功跑出結果,NachOS 環境就算安裝完成 --- ## 附錄:常見檢查方式 如果中途有遇到問題,可以先檢查以下幾項。 ### 1. cross compiler 是否存在 ```bash ls /mips-x86.linux-xgcc ``` 如果有看到像 `gcc`、`cpp0`、`cc1`、`as`、`ld` 等檔案,代表 cross compiler 有正確解壓縮。 --- ### 2. `test/Makefile` 是否修改正確 ```bash cd ~/oslab/nachos-4.0/code/test grep -n 'GCCDIR\|CPP\|CFLAGS' Makefile ``` 可以確認 `GCCDIR`、`CPP`、`CFLAGS` 是否已經改成 `/mips-x86.linux-xgcc/` 相關設定。 --- ### 3. `Makefile.common` 是否有加上 `-m32` ```bash cd ~/oslab/nachos-4.0/code grep -n 'CFLAGS\|LDFLAGS\|CC =\|LD =\|AS =' Makefile.common ``` 重點是確認 `CFLAGS`、`LDFLAGS`、`CC`、`LD` 是否都有使用 32-bit 編譯設定。 --- ### 4. `coff2noff` 是否為 32-bit ```bash file ~/oslab/nachos-4.0/code/bin/coff2noff ``` 正常應該看到類似: ```text ELF 32-bit ``` * 如果不是 32-bit,代表 `code/bin/Makefile` 的設定可能沒有改成功,或是需要重新 `make clean` 後再 `make`。