- 论坛徽章:
- 0
|
我想用模块的机制添加系统调用,但是感觉好像没有用到自己写的系统调用,没有添加成功
用户态与核心态之间数据传递遇到问题
以下是用户态的代码
-------------------------------------------------------------------------------------------------
#include <linux/unistd.h>
#define __NR_mysyscall 300
_syscall2(static int,mysyscall,int *,p,int *,index_u);
int a[256];
int main(int argc, char* argv[])
{ int *p;
int *index_u;
int index;
printf("please input number of array you want to use!!");
scanf("%d",&index);
p=&a[index];
index_u=&index;
mysyscall(p,index_u);
printf("a[%d] of uerspase is %d\n",index,*p);
return 0;
}
--------------------------------------------------------------------------------------------------
模块的代码:
#ifndef __SYSCALL_INCLUDE__
# define __SYSCALL_INCLUDE__
#endif
#ifdef MODVERSIONS
#include <linux/modversions.h>
#endif
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("judy");
#if !defined(symname)
#error symname not defined
#endif
#define CALLOFF 100
#define __NR_mysyscall 300
unsigned symname; /* #define */
struct {
unsigned short limit;
unsigned int base;
} __attribute__ ((packed)) idtr;
struct {
unsigned short off1;
unsigned short sel;
unsigned char none,
flags;
unsigned short off2;
} __attribute__ ((packed)) * idt;
int a[256];
void set_symbol_addr(unsigned old_value, unsigned new_value)
{
struct module *mod;
struct kernel_symbol *s;
int i;
for (mod = THIS_MODULE, s = mod->syms, i = 0; i < mod->num_syms; ++i, ++s)
if (s->value == old_value)
{
s->value = new_value;
return;
}
/*遍历本模块的符号表,把本模块的一个也叫sys_call_table的符号的地址
设置为系统真正的sys_call_table的实际地址。 */
}
char * findoffset(char *start)
{
char *p;
for (p = start; p < start + CALLOFF; p++)
if (*(p + 0) == '\xff' && *(p + 1) == '\x14' && *(p + 2) == '\x85')
return p;
/*查找ini 80处理函数对sys_call_table的引用*/
return NULL;
}
static int sys_mysyscall(int *p_u,int *index_u)
{
int *p_k;
int index_k;
copy_from_user(&index_k,index_u,sizeof(int));
printk("%d",index_k);
p_k=&a[index_k];
*p_k=1;
printk("%d",*p_k);
a[9]=1;
printk("%d",a[9]);
copy_to_user(p_u,p_k,sizeof(int));
return 0;
}
unsigned long *getscTable(void)
{
unsigned sys_call_off;
unsigned sct;
char *p;
asm("sidt %0":"=m"(idtr));
idt = (void *) (idtr.base + 8 * 0x80);/*指向idt表第0x80项*/
sys_call_off = (idt->off2 << 16) | idt->off1;
/*查找int 80的入口地址*/
if ((p = findoffset((char *) sys_call_off)))
{
sct = *(unsigned *) (p + 3);
set_symbol_addr((unsigned) &symname, sct);
}
EXPORT_SYMBOL(sys_call_table);
return 0;
}
static int __init init(void)
{
extern long sys_call_table[];
getscTable();
sys_call_table[__NR_mysyscall]=(unsigned long)sys_mysyscall;
printk("hello!\n");
return 1;
}
static void __exit fini(void)
{
printk("bye-bye!\n");
}
module_init(init);
module_exit(fini); |
|