linux內核4.2.x實現自定義系統調用

前言:

內核2.xx | 3.xx | 4.xx在添加系統調用時,需要的步驟大體相同。但是由於內核版本的變動,有些步驟的做法發生改變。網上的教程多是關於2.xx | 3.xx版本的。有些地方在4.xx版本上不相符。以下內容均以4.2.1版本爲例子,基於Ubuntu虛擬機,64位PC。


首先,給出幾個關鍵的路徑:

/usr/src/linux-4.2.1/arch/x86/include/asma/sysclls.h                自定義的系統調用函數聲明

/usr/src/linux-4.2.1/kernel/sys.c                                                     自定義的系統調用函數實現

/usr/src/linux-4.2.1/arch/x86/entry/syscalls/syscall_32.tbl       系統調用表


接下來,介紹以下添加系統調用的步驟:

1、在sysclls.h文件內定義函數聲明:

asmlinkage long sys_hello(long t);            返回值、參數和正常定義函數一樣,函數名一定要以sys_開頭

asmlinkage不要缺少函數定義前加宏asmlinkage ,表示這些函數通過堆棧而不是通過寄存器傳遞參數。


2、在sys.c內實現上面聲明的函數:

asmlinkage long sys_hello(long t)

{

                   return t;                        實現自己需要的功能

}

3、在syscall_32.tbl 內爲上面的函數分配一個調用編號:

359 i386 hello sys_hello                     單獨佔一行


然後,介紹編譯的步驟:

1、執行sudo apt-get install libncurses5-dev , 這一步是爲了make menuconfig的正確執行。如果這步遇見其它問題,不在本文討論之列。

2、執行make menuconfig,不做任何修改,保存退出即可。

3、執行make modules,這步非常耗時間。

4、執行make modules_install.

5、執行make install

6、重啓。


最後,編寫測試程序:

#include <stdio.h>

int main()

{

           long t = syscall(359,888); // 359爲syscall_32.tbl 內的調用編號 888爲參數

           printf("t = %ld\n",t);

           return 0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章