---
# System prepended metadata

title: NachOS 4.0 安裝與執行

---


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


