# 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 )