# 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!
```

看到這裡就表示:
* 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`。