在内核态调用用户空间本身不是一个好的想法,这样做可能会影响内核的稳定.如果确实有这种需求,可以考虑在用户空间做一个deamon程序来实现类似的功能.
不过,这里还是给一个例子,来实现从内核调用用户空间的程序,仅当娱乐:
#include
#include
#include
static int my_execve(const char *filename,char *const argv[], char *const envp[])
{
long __res;
__asm__ volatile ("int $0x80"
:"=a" (__res)
: "0" (__NR_execve),"b"
((long)(filename)),"c"((long)(argv)),"d"((long)(envp)));
return (int) __res;
}
static int exec_cmd(void *filename)
{
//may be need envp and argv
//char *envp[] = { "HOME=/","TERM=linux","PATH=/sbin:/usr/sbin:",NULL};
//char *argv[] = { "/bin/ls","-l","/tmp/",NULL};
int ret;
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
ret = my_execve((char*)filename,NULL,NULL);
printk("execve failed :%s\n",(char*)filename);
set_fs(old_fs);
return ret;
}
int init_module(void)
{
int pid;
pid = kernel_thread(exec_cmd,"./helloworld",0);
if( pid < 0) {
printk(KERN_ERR "kernel_thread failed.\n");
return pid;
}
return 0;
}
void cleanup_module(void)
{
return;
}
在用户空间随便写一个helloworld程序,然后和这个模块放在同一个目录下,就可以了.
最后还是建议最好不要这样做.
阅读(1517) | 评论(0) | 转发(0) |