添加一个hello wrold系统调用到内核
分析socket()函數的時候看到了系統調用,以往也見過好多次系統調用,不是特別明白如何從用戶空間跳到內核空間,google了一篇參考文章動添加一個系統調用試試。
在做實驗之前先了解下什么是系統調用以及系統調用運行的原理,
什么是系統調用?
Linux內核中設置了一組用于實現各種系統功能的子程序,稱為系統調用。用戶可以通過系統調用命令在自己的應用程序中調用它們。從某種角度來看,系統調用和普通的函數調用非常相似。區別僅僅在于,系統調用由操作系統核心提供,運行于核心態;而普通的函數調用由函數庫或用戶自己提供,運行于用戶態。二者在使用方式上也有相似之處,在下面將會提到。
隨Linux核心還提供了一些C語言函數庫,這些庫對系統調用進行了一些包裝和擴展,因為這些庫函數與系統調用的關系非常緊密,所以習慣上把這些函數也稱為系統調用。
系統調用是怎么工作的?
一般的,進程是不能訪問內核的。它不能訪問內核所占內存空間也不能調用內核函數。CPU硬件決定了這些(這就是為什么它被稱作"保護模式")。系統調用是這些規則的一個例外。其原理是進程先用適當的值填充寄存器,然后調用一個特殊的指令,這個指令會跳到一個事先定義的內核中的一個位置(當然,這個位置是用戶進程可讀但是不可寫的)。在Intel CPU中,這個由中斷0x80實現。硬件知道一旦你跳到這個位置,你就不是在限制模式下運行的用戶,而是作為操作系統的內核--所以你就可以為所欲為。
進程可以跳轉到的內核位置叫做sysem_call。這個過程檢查系統調用號,這個號碼告訴內核進程請求哪種服務。然后,它查看系統調用表(sys_call_table)找到所調用的內核函數入口地址。接著,就調用函數,等返回后,做一些系統檢查,最后返回到進程(或到其他進程,如果這個進程時間用盡)。
手動添加系統調用步驟如下,這里假定你已經有了一個Linux內核版本,如果沒有的話,請手動去linux官網下載并解壓。
內核源代碼下載網址:https://mirrors.edge.kernel.org/pub/linux/kernel/
我測試的內核版本是3.4.39
1. 定義系統調用實現文件
cd linux-3.4.39/ mkdir hello && cd hello touch hello.c touch Makefilehello.c文件內容: #include <linux/kernel.h>asmlinkage long sys_hello(void) {printk("Hello world\n");return 0; }Makefile文件內容: obj-y := hello.o2. 添加到系統編譯目錄,修改根目錄下的Makefile,找到如下一行:
vi Makefile # 找到這一行 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ # 修改成下面這樣 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ hello/3. 添加系統調用到系統調用表中:
有兩個系統調用表: arch/x86/stscalls/syscall_32.tbl arch/x86/stscalls/syscall_64.tbl根據你的系統配置來修改相應的文件 添加如下一行: 312 64 hello sys_hello 312是系統調用號,注意不要和系統已經定義的沖突4. 添加到頭文件中:
修改include\linux\syscalls.h文件,添加下面一行到末尾: asmlinkage long sys_hello(void);5. 重新編譯內核并安裝:
make sudo make modules_install install6. 重啟系統
7. 編寫測試程序syscall_hello.c:
#include <stdio.h> #include <linux/kernel.h> #include <sys/syscall.h> #include <unistd.h> int main() {long int amma = syscall(312); //系統調用號printf(“System call sys_hello returned %ld\n”, amma);return 0; }8. 編譯執行:
dmesg可以看到最后一行打印,添加成功。
20190530
?
參考文檔:
1.?Adding a Hello World System Call to Linux kernel?3.16.0
2.?系統調用跟我學(1)
3.?操作系統作業:給linux系統增加一個系統調用
總結
以上是生活随笔為你收集整理的添加一个hello wrold系统调用到内核的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tcp/ip 协议栈Linux内核源码分
- 下一篇: tcp/ip 协议栈Linux内核源码分