我这里用到的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;
	}

