天天看點

Linux系統調用的實作方法

作業系統核心分析 實驗二 Linux系統調用

準備工作

接之前的實驗一:

  1. 為了便于複現實驗結果,不出錯,本文會盡可能使用終端指令。
  2. 之前已編譯了

    linux

    核心和

    busybox

    ,并制作了一個根檔案系統鏡像。是以目前桌面存在着

    linux

    busybox

    rootfs

    三個檔案夾和一個

    rootfs.img

    檔案。 ( 若路徑與我不同的,涉及路徑的指令,請自行修改 )
  3. 本文使用

    vim

    文本編輯器,如若沒有安裝,請用下面指令安裝。
sudo apt install vim
           

一、 實作一個新的“Hello World”系統調用。

1. 在系統調用表中添加新的系統調用編号

  1. vim

    編輯

    syscall_64.tbl

# 打開終端,輸入下部指令。
vim ~/Desktop/linux/arch/x86/entry/syscalls/syscall_64.tbl
           
  1. 進入

    vim

    編輯界面後,先輸入

    /435

    ,定位到系統調用表檔案中 已有的系統調用編号末尾。 另可輸入

    :set number

    ,設定行号。
  2. 輸入

    i

    ,進入編輯模式
  3. 再将光标移動到

    435

    的下面一行,輸入下面的代碼
436     common  my_syscall              __x64_sys_my_syscall
           
  1. ESC

    退出 編輯模式 ,進入 指令模式 ,輸入

    :wq

    儲存。
    Linux系統調用的實作方法

2. 在實作系統調用程式檔案中添加函數定義

  1. vim

    編輯

    sys_x86_64.c

# 打開終端,輸入下部指令。
vim ~/Desktop/linux/arch/x86/kernel/sys_x86_64.c
           
  1. 進入

    vim

    編輯界面後,先輸入

    G

    (注意是大寫),編輯界面會跳轉到檔案底部。 另可輸入

    :set number

    ,設定行号。
  2. 再輸入

    i

    ,進入編輯模式。
  3. 在檔案底部添加代碼
SYSCALL_DEFINE0(my_syscall)
{
        printk(KERN_INFO "Hello World!\n");

        return 0;
}
           
  1. ESC

    退出 編輯模式 ,進入 指令模式 ,輸入

    :wq

    儲存。
    Linux系統調用的實作方法

3. 重新編譯核心,驗證系統調用。

cd ~/Desktop/linux                              #修改目前目錄

make                                            #通過makefile,編譯核心
           

4. 在桌面建立使用者程式,調用 “Hello world” 系統調用。

  1. 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;
}


           
  1. 靜态編譯mysyscall.c
gcc ~/Desktop/mysyscall.c -static -o ~/Desktop/mysyscall
           
  1. 編譯成功後,桌面會出現一個名為

    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!

則表示成功。

Linux系統調用的實作方法

繼續閱讀