在内核linux-3.1-rc4中加入系统调用 (32位和64位)
来源:互联网 发布:淘宝省钱app 编辑:程序博客网 时间:2024/05/29 03:39
最近为了在内核中加入指令,需要增加系统调用。我采用的方法是通过修改内核源码来增加系统调用。
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 增加自己的目录文件。
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 增加自己的目录文件。
- 在内核linux-3.1-rc4中加入系统调用 (32位和64位)
- 32位和64位系统内核函数调用从ZwProtectVirtualMemory到NtProtectVirtualMemory
- Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型
- 切换AIX的64位和32位系统内核
- 如何在64位系统的IIS中调用32位应用程序集
- 32位linux系统调用
- linux 64位系统调用
- Linux asm系统调用:32位和64位的区别
- 基本数据类型在32位系统和64位系统中所占字节数
- 在64位系统中运行32位命令提示符
- 在32位系统中使用64位虚拟机
- 在64位系统中添加32位支持
- NSInteger在64位和32位系统上区别
- 32位和64位系统中数据类型区别
- 解决32位Eclipse和64位Eclipse在64位win7系统上运行问题
- 解决32位Eclipse和64位Eclipse在64位win7系统上运行问题
- 解决32位Eclipse和64位Eclipse在64位win7系统上运行问题
- 64位汇编之linux系统调用
- ubuntu12.04安装samba
- Erlang 命令行监控工具
- Nginx的Rewrite规则与实例
- class VideoCapture之VideoCapture::grab
- Linux中判断文件是否存在
- 在内核linux-3.1-rc4中加入系统调用 (32位和64位)
- 底半部机制分析:软中断,tasklet,工作队列
- JAVA7的新特性之钻石操作符和加强的Switch语句
- java compiler level does not match the version of the installed java project facet
- 采用匹配规则来填充String.xml中的资源
- 浅谈HTTPS传输协议原理
- 第四周—3.程序的多文件组织
- Linux验证网络文件传输的完整性命令 --md5sum
- VideoCapture::retrieve