歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

向Linux內核添加系統調用

環境:Ubuntu 11.04

工具:vim

內核源碼:linux-2.6.38.8

Linux向內核添加系統調用其實並不難,簡單地來說就是修改內核源碼中的一些文件,編譯並安裝內核,然後寫個用戶程序調用它驗證驗證就OK了~~

步驟一:修改3個內核源碼文件

第一個文件:/usr/src/linux-2.6.38.8/kernel/sys.c

修改:在最後面添加

asmlinkage int sys_foo(int x)

{

        printk("the nunber is : %d !\n", x);

        return x;

}

這個函數就是要添加進內核的系統調用了,功能很簡單,僅僅實現的是將傳進來的參數打印出來並且返回,注意了,這裡用的是printk,不是printf,printk可以說是內核版的printf吧,呵呵~~所以輸出的信息不在終端上,而是在系統日志上,使用“dmesg”命令就可查看

第二個文件:/usr/src/linux-2.6.38.8/arch/x86/kernel/syscall_table_32.S

修改:在最後面添加

.long sys_XXX

所以我這裡就添加.long sys_foo了

第三個文件:/usr/src/linux-2.6.38.8/arch/x86/include/asm/unistd_32.h

這個文件包含了系統調用號,所以要為我們自己添加的系統調用取一個號(num)放在裡面,格式為:“#define __NR_XXX num”,這個號可不是亂取的,必須是緊接著該列表最後一項取值,比如我的:

修改前:

#define __NR_fanotify_init      338

#define __NR_fanotify_mark      339

#define __NR_prlimit64          340

#ifdef __KERNEL__

#define NR_syscalls 341

#define __ARCH_WANT_IPC_PARSE_VERSION

#define __ARCH_WANT_OLD_READDIR

#define __ARCH_WANT_OLD_STAT

修改後:

#define __NR_fanotify_init      338

#define __NR_fanotify_mark      339

#define __NR_prlimit64          340

#define __NR_foo 341

#ifdef __KERNEL__

#define NR_syscalls 342

#define __ARCH_WANT_IPC_PARSE_VERSION

#define __ARCH_WANT_OLD_READDIR

#define __ARCH_WANT_OLD_STAT

注意了,那個號是在#define NR_syscalls 342之前,#define __NR_prlimit64 340之後的

步驟二:編譯並安裝內核

詳細步驟請看: http://www.linuxidc.com/Linux/2012-07/65310.htm

步驟三:寫一個用戶程序調用該系統調用

#include <linux/unistd.h>

#include <stdio.h>

int main(){

        printf("The number is %d\n",syscall(341,100));

return 0;

}

其中syscall的第一個參數“341”就是foo的系統調用號,第二個參數“100”是傳進去的參數。接下來編譯並運行之。

步驟四:驗證的時刻到了

第一個驗證:

www.linuxidc.com @ubuntu:~/Desktop$ ./foo

The number is 100

第二個驗證:

www.linuxidc.com @ubuntu:~/Desktop$ dmesg

[ 1963.829598] the nunber is : 100 !

Copyright © Linux教程網 All Rights Reserved