文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>在Linux中添加新的系统调用的 步骤

在Linux中添加新的系统调用的 步骤

时间:2010-12-12  来源:kevin_neu

1. 修改kernel/sys.c,增加服务例程代码。
首先编写添加到内核中的源程序,即要添加的服务,所用的函数名称应该是新的系统调用名称前面加上sys_标志。例如新加的系统调用为mysyscall(int number),那么就应该在系统的/usr/src/linux/kernel/sys.c文件中添加相应的源代码,如下所示:

asmlinkage int sys_mysyscall(int number)
{
    printk("This is a example of systemcall n");
    return number;
}


2. 添加新的系统调用后,为了从已有的内核程序中添加到新的函数的链接,需要编辑以下2个文件:
(1) /usr/src/linux/include/asm-i386/unistd.h
(2) /usr/src/linux/arch/i386/kernel/syscall_table.S
第一个文件中定义了每个系统调用的中断号,可以打开文件/usr/src/linux/include/asm-i386/unistd.h来查看,该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码,部分内容如下:

#define __NR_add_key 286
#define __NR_request_key 287
#define __NR_keyctl 288
#define __NR_ioprio_set 289
#define __NR_ioprio_get 290
#define __NR_inotify_init 293
#define __NR_inotify_add_watch 292
#define __NR_inotify_rm_watch 293

#define NR_syscalls        294

文件中每一行的格式如下:

#define __NR_syscallname N

sysscallname为系统调用名,而N则是该系统调用对应的中断号,每个系统调用都有唯一的中断号。应该将新的系统调用的名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用号。在该文件中的最后一句:#define NR_syscalls 294中,NR_syscalls表示系统调用的个数,294表示有294个系统调用,标号从0开始,所以最后一个系统调用号是293,那么如果新添加一个系统调用其中断号应该是294.
例如可以在该文件中这样定义一个系统调用:

#define __NR_mysyscall 294

如果还需要添加另外的系统调用,可以此类推将中断号依次递增。此外需要注意的是,重新添加系统调用之后,应该在/usr/src/linux/include/asm-i386/unistd.h文件中的#define NR_syscalls语句重新制定编号n,例如在上面添加一个新的系统调用之后,该语句应该改为:

#define NR_syscalls 295

第二个需要编辑的文件时:/usr/src/linux/arch/i386/kernel/syscall_table.S。该文件中定义了系统调用列表。在该文件中有以下类似的内容:


.data
ENTRY(sys_call_table)
    .long sys_restart_syscall
    .long sys_exit
    .long sys_read
    .long sys_write
    .long sys_open
    .long sys_close
    .long sys_waitpid
    .long sys_creat
    .long sys_link
    .long sys_unlink

在该文件中添加新的系统调用:

.long sys_mysyscall

3. 重新编译内核。
添加好系统调用之后,需要重新编译内核,并且用心的内核来启动,此时,系统调用就添加好了。
4. 测试新的系统调用,编辑程序test_call.c如下:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

_syscall(int, mysyscall, int, num); //系统调用宏定义

int main(void)
{
    int n;
    n = mysyscall(10);
    printf("n=%dn", n);
    return 0;
}

编译并执行该程序:

# gcc -o test_call -I/usr/src/linux/include test_call.c

# ./test_call

n=10

输出值正确,说明添加系统调用就成功了。
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载