• 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

  • 相关阅读:
    jqgrid 重新加载,表头错乱问题
    TortoiseSVN 安装时出现 please install the universal crt
    随意下载:afinal jar
    Android com.daimajia.slider.library.SliderLayout 去掉底部半透明标题背景
    MUI ios下用video标签默认全屏播放
    ARouter学习随笔
    [总]Android高级进阶之路
    Android冷启动优化
    Dagger2源码浅析
    Fragment与Activity的生命周期对比
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332887.html
Copyright © 2020-2023  润新知