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

Linux內核中添加新的系統調用

我這裡用到的Linux內核版本是linux2.6.33.3

其實添加系統調用是一件很簡單的事情,因為你只是定義一些處理函數,添加符號表,其他的調度都是由內核來幫忙做的。

1.下載內核 http://www.kernel.org/pub/Linux/kernel

2.配置
tar -xzvf Linux-2.6.33.3.tar.gz -C /usr/src
cd /usr/src
ln -s Linux-2.6.33.3 Linux
cd Linux

make mrproper # Make sure you have no stale .o files

make menuconfig #生成一個.config文件
具體,根據自己的系統配置進行設置。

3.開始艱難的編譯過程

make
make module_install
make install

update-grub2 or update-grub

4.我喜歡先編譯一便內核,確保原始的代碼能夠順利編譯運行成功,然後再進行修改。不然,在一個不能跑的內核上添加系統調用,很費腦筋。

5.主要需要修改的文件及其位置
/usr/src/linux/arch/x86/kernel/syscall_table_32.S
/usr/src/linux/arch/x86/include/asm/unistd_32.h
/usr/src/linux/arch/x86/kernel/sys_i386_32.c

6.實例
1)把sys_mySyscall添加到系統調用表
vim /usr/src/linux/arch/x86/kernel/syscall_table_32.S
................
................
.long sys_recvmmsg
.long sys_mySyscall

2)添加系統調用號到unistd.h
vim /usr/src/linux/arch/x86/include/asm/unistd_32.h
...............
...............
#define __NR_recvmmsg       337
#define __NR_mySyscall   338

記住,不要忘記將下面的
#ifdef __KERNEL__
#define NR_syscalls 338
的值加一。

3)添加系統調用函數體
vim /usr/src/linux/arch/x86/kernel/sys_i386_32.c

extern struct timespec xtime;

asmlinkage long sys_mySyscall( struct timeval * tv, struct timespec * ts)
{
struct timeval ktv;
do_gettimeofday(&ktv);
copy_to_user(tv, &ktv, sizeof(ktv));

copy_to_user(ts, &xtime, sizeof(xtime));

return jiffies;
}

4)重新編譯內核,啟動新內核
方法同上
5)在用戶空間編寫測試程序
#include <stdio.h>
#include <errno.h>
#include <syscall.h>
#include <sys/time.h>
#include <linux/unistd.h>
#define __NR_mySyscall 338

int main()
{
struct timeval v_time;
struct timespec s_time;
long jiffies;

jiffies = syscall(__NR_mySyscall, &v_time, &s_time);

printf("timeval tv_sec = %ld, tv_usec = %ld\n", v_time.tv_sec, v_time.tv_usec);

printf("timespec tv_sec = %ld, tv_nsec = %ld\n", s_time.tv_sec, s_time.tv_nsec);

printf("jiffies = %ld\n", jiffies);
return 0;
}

Copyright © Linux教程網 All Rights Reserved