当前位置: 技术问答>linux和unix
请问:怎样写一个linux的系统调用,模块或写到kernel都行
来源: 互联网 发布时间:2015-05-09
本文导语: 怎样写一个linux的系统调用,模块或写到kernel都行 | #define MODULE #define __KERNEL__ #define LINUX #include #include #include #include #include #include #include #define __NR_pedagogictime 199 #define SCT 0xc0...
怎样写一个linux的系统调用,模块或写到kernel都行
|
#define MODULE
#define __KERNEL__
#define LINUX
#include
#include
#include
#include
#include
#include
#include
#define __NR_pedagogictime 199
#define SCT 0xc030a0f0//在/boot/System.map中查sys_call_table
static int (*anything_saved)(void);
/*static int sys_pedagogictime(struct timeval *tv)
{
struct timeval ktv;
MOD_INC_USE_COUNT;
do_gettimeofday(&ktv);
if(copy_to_user(tv,&ktv,sizeof(ktv))){
MOD_DEC_USE_COUNT;
return -EFAULT;
}
printk("Pid %ld called sys_gettimeofday().n",(long)current->pid);
MOD_DEC_USE_COUNT;
return 0;
}*/
static int sys_pedagogictime(int k )
{
// printk(" the syscall is .......%dn",k);
k+=100;
return (k);
}
int __init init_addsyscall(void)
{
long __MM_TEST;
long * sys_call_table;
sys_call_table=(long *)SCT;
anything_saved=(int(*)(void))(sys_call_table[__NR_pedagogictime]);
*( sys_call_table+__NR_pedagogictime)=(unsigned long)sys_pedagogictime;
//EXPORT_SYMBOL(__MM_TEST);
return 0;
}
void __exit exit_addsyscall(void)
{
long *sys_call_table;
sys_call_table=(long *)SCT;
*(sys_call_table+__NR_pedagogictime)=(unsigned long)anything_saved;
}
module_init(init_addsyscall);
module_exit(exit_addsyscall);
MODULE_LICENSE("GPL");
#define __KERNEL__
#define LINUX
#include
#include
#include
#include
#include
#include
#include
#define __NR_pedagogictime 199
#define SCT 0xc030a0f0//在/boot/System.map中查sys_call_table
static int (*anything_saved)(void);
/*static int sys_pedagogictime(struct timeval *tv)
{
struct timeval ktv;
MOD_INC_USE_COUNT;
do_gettimeofday(&ktv);
if(copy_to_user(tv,&ktv,sizeof(ktv))){
MOD_DEC_USE_COUNT;
return -EFAULT;
}
printk("Pid %ld called sys_gettimeofday().n",(long)current->pid);
MOD_DEC_USE_COUNT;
return 0;
}*/
static int sys_pedagogictime(int k )
{
// printk(" the syscall is .......%dn",k);
k+=100;
return (k);
}
int __init init_addsyscall(void)
{
long __MM_TEST;
long * sys_call_table;
sys_call_table=(long *)SCT;
anything_saved=(int(*)(void))(sys_call_table[__NR_pedagogictime]);
*( sys_call_table+__NR_pedagogictime)=(unsigned long)sys_pedagogictime;
//EXPORT_SYMBOL(__MM_TEST);
return 0;
}
void __exit exit_addsyscall(void)
{
long *sys_call_table;
sys_call_table=(long *)SCT;
*(sys_call_table+__NR_pedagogictime)=(unsigned long)anything_saved;
}
module_init(init_addsyscall);
module_exit(exit_addsyscall);
MODULE_LICENSE("GPL");
|
你可以在LINUX内核中增加系统调用。
1。首先找到entry.S,在这个文件中,找到syscall_table你就会看到很多的系统调用,加上你的系统调用的名称。
2。找到unistd.h文件,增加你的系统调用号,这些步骤你可以根据在这2个文件的原来的系统调用的格式来模仿着写。
3。这样,你就可以写你的系统调用了。以我的经验,你最好在原来的内核文件中写,而且最好是在有关的系统调用的文件中写。
4。在测试你的系统调用时,要加上_syscall0( ,),根据你的参数个数来写。
1。首先找到entry.S,在这个文件中,找到syscall_table你就会看到很多的系统调用,加上你的系统调用的名称。
2。找到unistd.h文件,增加你的系统调用号,这些步骤你可以根据在这2个文件的原来的系统调用的格式来模仿着写。
3。这样,你就可以写你的系统调用了。以我的经验,你最好在原来的内核文件中写,而且最好是在有关的系统调用的文件中写。
4。在测试你的系统调用时,要加上_syscall0( ,),根据你的参数个数来写。
|
zeng_xiangyang(娃哈哈) 的程序比较标准,可以通过模块实现,但是有限制,只能用于2.4内核,2.6的内核已经不导出sys_call_table符号了
wenxiaoxue(wen) 的程序通用性强,但是需要重新编译内核
wenxiaoxue(wen) 的程序通用性强,但是需要重新编译内核