您的位置:首页 > 运维架构 > Linux

在内核linux-3.1-rc4中加入系统调用 (32位和64位)

2013-03-27 11:40 811 查看
最近为了在内核中加入指令,需要增加系统调用。我采用的方法是通过修改内核源码来增加系统调用。

1 . 实验环境为 Centos-6.0 + 32位,使用的内核源码为 linux-3.1-rc4.tar.gz.

需要增加的系统调用函数为:

int mycall(int num)

{

printk("This is my syscall from kernel.\n");

printk("current pid is: %d.\n", current->pid);

return num;

}

解压内核源码压缩包,然后修改如下文件:

1) linux-3.1-rc4/arch/x86/kernel/syscall_table_32.S

在最后添加:

.long sys_mycall

2) linux-3.1-rc4/arch/x86/include/asm/unistd_32.h

可以看到原有的最后一个系统调用为:

#define __NR_syncfs 344

在后面添加自己的系统调用:

#define __NR_mycall 345

同时,修改总的系统调用数:

#define NR_syscalls 346

3)linux-3.1-rc4/include/linux/syscalls.h

添加增加的系统调用的声明:

asmlinkage long sys_mycall(int num);

4) linux-3.1-rc4/kernel/sys.c

添加系统调用函数:

SYSCALL_DEFINE1(mycall, int, num)

{

printk("This is my syscall from kernel.\n");

printk("current pid is: %d.\n", current->pid);

return (long)num;

}

编译模块:

$ make

$ make modules

安装模块:

$ make modules_install

安装内核:

$ make install

2 . 实验环境为 Centos-6.0 + 64位,使用的内核源码为 linux-3.1-rc4.tar.gz.

需要增加的系统调用函数为:

int mycall(int num)

{

printk("This is my syscall from kernel.\n");

printk("current pid is: %d.\n", current->pid);

return num;

}

解压内核源码压缩包,然后修改如下文件:

1) linux-3.1-rc4/arch/x86/include/asm/unistd_64.h

可以看到原有的最后一个系统调用为:

#define __NR_getcpu 309

__SYSCALL(__NR_getcpu,sys_getcpu)

我们添加:

#define __NR_mycall 310

__SYSCALL(__NR_mycall,sys_mycall)

修改 #define NR_syscalls (__NR_syscall_max + 1)

为: #define NR_syscalls (__NR_syscall_max + 2)

2) linux-3.1-rc4/include/linux/syscalls.h

添加增加的系统调用的声明:

asmlinkage long sys_mycall(int num);

3) linux-3.1-rc4/kernel/sys.c

添加系统调用函数:

SYSCALL_DEFINE1(mycall, int, num)

{

printk("This is my syscall from kernel.\n");

printk("current pid is: %d.\n", current->pid);

return (long)num;

}

编译模块:

$ make modules

$ make

安装模块:

$ make modules_install

安装内核:

$ make install

也可以linux-3.1-rc4/kernel 增加自己的目录文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: