---
# System prepended metadata

title: AOS assignment2
tags: ['#kernelconfig']

---

# AOS assignment2
## Specfication same as assignment1
| Category | Virtual Machine |
|:---:|---|
| Type	| VirtualBox with Ubuntu 20.04.1|
| CPU Cores	| 2 CPU cores allocated|
| RAM	| 4GB RAM allocated|
| Storage	|40GB Size of the virtual disk|

| Category | Linux Kernel Environment |
|:---:|---|
|  Version |Linux 6.10.9 | 
|  Distribution | Ubuntu | 

| Category | Used Packages |
|:---:|---|
| Key Packages | build-essential, flex, bison, libncurses-dev, libelf-dev, elfutils, libssl-dev, bc|

## step1 修改system call table加入新的system call name
| 步驟 | 說明 |
|:------:|:------:|
| 1.1 | 進入system call table的路徑</br>**cd /usr/src/linux-6.10.9/arch/x86/entry/syscalls** |
| 1.2 | 修改它**sudo gedit syscall_64.tbl** <br/> ![image](https://hackmd.io/_uploads/r1lsZTkCR.png )|
| 1.3 | 加入一個system call而system call號碼為**463** <br/> ![image](https://hackmd.io/_uploads/r1ZzphMRA.png =600x400) |

**欄位分成以下**
|syscall號碼|分別在32 or 64 or common版本|syscall_name|syscall|
|:---:|:---:|:---:|:---:|
| 463 | common | print_studentid | sys_print_studentid |
## step2
| 步驟 | 說明 |
|:------:|:------:|
| 2.1 | define a system call，因不需要任何的輸入所以用**SYSCALL_DEFINE0(system_call_name)** |
| 2.2 | **KERN_EMERG**對應到的函示為**pr_emerg("message");** 訊息如下 <br/> ![image](https://hackmd.io/_uploads/S1tQGIeRA.png=600x400)|
## step3
| 步驟 | 說明 |
|:------:|:------:|
| 3.1 | 進入system call header file的路徑**cd /usr/src/linux-6.10.9/include/linux** |
| 3.2 | 修改它**sudo gedit syscalls.h**![image](https://hackmd.io/_uploads/rkZeca1CR.png) |
| 3.3 | 加入**asmlinkage long sys_print_studentid(void);** ![image](https://hackmd.io/_uploads/rkD2ITyRA.png =600x400) |
## step4
| 步驟 | 說明 |
|:------:|:------:|
| 4.1 |因為修改了kernel加入了新的system call，所以需要重新make new kernel **sudo make -j16 >/dev/null** <br/> ![image](https://hackmd.io/_uploads/By9ePaJAC.png) |
| 4.2 | **sudo make install**  <br/> ![image](https://hackmd.io/_uploads/ByKg_UZCR.png) |
| 4.3 | **reboot** <br/> ![image](https://hackmd.io/_uploads/HJ87dU-0A.png) | 
| 4.4 | 選擇了剛剛make install好的新的kernel <br/> ![image](https://hackmd.io/_uploads/Byf6w8ZRC.png) |
| 4.5 | 寫一個test program來測試system call **463** <br/> ![image](https://hackmd.io/_uploads/r1iZciWRA.png) |
| 4.6 |用**sudo gcc test.c -o test**來編譯test.c，編譯完後會產生test可執行檔。<br/> 執行test檔 **./test** <br/> 若我的system call 成功的話會在螢幕上收到**system call returned 1**的訊息。 <br/> ![image](https://hackmd.io/_uploads/rJ7eVoW0C.png) |
| 4.7 | 進入**diagnostic message**查看**kernel log，** <br/> 輸入 **dmesg --level=emerg** 查看**KERN_EMERG** level訊息，而上面確實有顯示我在SYSCALL_DEFINE0時寫的內容。<br/>**studentid : 61347109S** <br/> ![image](https://hackmd.io/_uploads/Bk6jziWAR.png) |
| 4.8 | 再來輸入**dmesg**會顯示所有的current level以上的kernel log訊息，而且找到**KERN_EMERG**訊息也有吻合。 <br/> ![image](https://hackmd.io/_uploads/rkTYQsWRR.png) <br/> ![image](https://hackmd.io/_uploads/H1MVXoZAC.png =500x300) |

##  Challenging part

根據作業要求，我需要加入一個簡單的系統呼叫到kernel中，且必須以
KERN_EMERG最高優先權的系統呼叫打印訊息在kernel log當中，
原本用**printk**有誤，但是我找到利用**pr_emerg**的函示也可以達到**printk(KERN_EMERG"")** 的效果，而後面就沒有太大難度了。

<div style="page-break-after: always;"></div>

## Reference
[Message logging with printk](https://www.kernel.org/doc/html/latest/core-api/printk-basics.html#c.pr_fmt)
[printk紀錄](https://www.kernel.org/doc/html/next/translations/zh_CN/core-api/printk-basics.html)
![image](https://hackmd.io/_uploads/HkV_oLWAA.png )

