作業系統核心分析 實驗二 Linux系統調用
準備工作
接之前的實驗一:
- 為了便于複現實驗結果,不出錯,本文會盡可能使用終端指令。
- 之前已編譯了
核心和linux
,并制作了一個根檔案系統鏡像。是以目前桌面存在着busybox
、linux
、busybox
三個檔案夾和一個rootfs
檔案。 ( 若路徑與我不同的,涉及路徑的指令,請自行修改 )rootfs.img
- 本文使用
文本編輯器,如若沒有安裝,請用下面指令安裝。vim
sudo apt install vim
一、 實作一個新的“Hello World”系統調用。
1. 在系統調用表中添加新的系統調用編号
- 用
編輯vim
syscall_64.tbl
# 打開終端,輸入下部指令。
vim ~/Desktop/linux/arch/x86/entry/syscalls/syscall_64.tbl
- 進入
編輯界面後,先輸入vim
,定位到系統調用表檔案中 已有的系統調用編号末尾。 另可輸入/435
,設定行号。:set number
- 輸入
,進入編輯模式i
- 再将光标移動到
的下面一行,輸入下面的代碼435
436 common my_syscall __x64_sys_my_syscall
- 按
退出 編輯模式 ,進入 指令模式 ,輸入ESC
儲存。:wq
2. 在實作系統調用程式檔案中添加函數定義
- 用
編輯vim
sys_x86_64.c
# 打開終端,輸入下部指令。
vim ~/Desktop/linux/arch/x86/kernel/sys_x86_64.c
- 進入
編輯界面後,先輸入vim
(注意是大寫),編輯界面會跳轉到檔案底部。 另可輸入G
,設定行号。:set number
- 再輸入
,進入編輯模式。i
- 在檔案底部添加代碼
SYSCALL_DEFINE0(my_syscall)
{
printk(KERN_INFO "Hello World!\n");
return 0;
}
- 按
退出 編輯模式 ,進入 指令模式 ,輸入ESC
儲存。:wq
3. 重新編譯核心,驗證系統調用。
cd ~/Desktop/linux #修改目前目錄
make #通過makefile,編譯核心
4. 在桌面建立使用者程式,調用 “Hello world” 系統調用。
- 用
編輯vim
mysyscall.c
# 打開終端,輸入下部指令。
vim ~/Desktop/mysyscall.c
//進入vim編輯界面之後,輸入以下代碼
#include <unistd.h>
#define __NR_my_syscall 436
int main(int argc, char const *argv[])
{
long result = syscall(__NR_my_syscall);
return 0;
}
- 靜态編譯mysyscall.c
gcc ~/Desktop/mysyscall.c -static -o ~/Desktop/mysyscall
- 編譯成功後,桌面會出現一個名為
可執行檔案。mysyscall
5. 将可執行檔案mysyscall放入rootfs.img根檔案系統
cd ~/Desktop
#挂載rootfs.img到rootfs
sudo mount -o loop rootfs.img rootfs
#複制 mysyscall 到rootfs檔案夾
sudo cp ~/Desktop/mysyscall ~/Desktop/rootfs/
#解除安裝rootfs.img
sudo umount rootfs
6. 啟動qemu虛拟機,運作mysyscall
sudo qemu-system-x86_64 -kernel ~/Desktop/linux/arch/x86_64/boot/bzImage -hda ~/Desktop/rootfs.img -append "console=ttyS0 root=/dev/sda" -nographic
7. 結果
在出現井号指令提示符之後,輸入
./mysyscall
,若出現
Hello World!
則表示成功。