前言:
內核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;
}