Linux添加系统调用

本文基于Linux 2.4.26内核,GCC 3.2.2添加系统调用mycall(int num)

增加系统调用只修改/usr/src/linux-2.4.29/include/asm-i386/unistd.h和arch/i386/kernel/entry.S,系统调用函数一般在kernel/sys.c中,这里把增加的系统调用代码也加入这个文件中。

 

1.修改kernel/sys.c文件,加入自己的系统调用代码,同参考文献(见文后地址)中,

asmlinkage int sys_mycalll(int num)

{

printk("This is added by yan/n");

return num;

}

往内核输出一句话,然后返回参数值。asmlinkage表示通过堆栈递参数。

 

2.然后把sys_mycall(int )的入口地址添加到sys_call_table表中。该表依次存储所有系统调用的入口地址。

修改前为:

.long SYMBOL_NAME(sys_ni_syscall)    /* sys_set_tid_address这是第258个系统调用* /

.rept NR_syscalls-(.-sys_call_table)/4

   .long SYMBOL_NAME(sys_ni_syscall)

修改后:

.long SYMBOL_NAME(sys_ni_syscall)       /* sys_set_tid_address *        /

.long SYMBOL_NAME(sys_mycall)           /*这是增加的第259个系统调用*/

.rept NR_syscalls-(.-sys_call_table)/4-1   /*这里重复次数减少1*/

       .long SYMBOL_NAME(sys_ni_syscall)

 

3.把增加的sys_call_table表项所对应的向量,在include/asm-i386/unistd.h中进行必要申明,以供用户进程和其他系统进程查询或调用:

#define __NR_exit_group         252

#define __NR_mycall          259   /*这是增加的第259个系统调用*/

 

然后编译内核make bzImage,并用生成的新内核启动系统。

覆盖原有的内核 cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.26

cp System.map /boot/System.map-2.4.26

 

4.测试程序(test.c)如下:

  1. #include <stdio.h>   
  2. #include <asm/unistd.h>   
  3. int errno;  
  4. _syscall1(int,mycall,int,num);//_syscall1表示该系统调用有1个参数,同样_syscall2表示2个调用参数   
  5.   
  6. int main()  
  7. {  
  8.   
  9.         int i,j;  
  10.   
  11.         printf("Please input a number/n");  
  12.   
  13.         scanf("%d",i);  
  14.   
  15.         j=mycall(i);  
  16.   
  17.         printf("The value returned from the kernel is %d/n",j);  
  18.   
  19. }  
  

然后执行命令

dmesg | tail

看到输出的内容

This is added by yan

posted on 2013-04-15 11:20  疯子123  阅读(175)  评论(0编辑  收藏  举报

导航