Chinaunix首页 | 论坛 | 博客
  • 博客访问: 265271
  • 博文数量: 74
  • 博客积分: 1470
  • 博客等级: 上尉
  • 技术积分: 793
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-25 21:01
文章分类

全部博文(74)

文章存档

2011年(1)

2010年(32)

2009年(32)

2008年(9)

我的朋友

分类: LINUX

2010-02-23 16:33:54

在内核态调用用户空间本身不是一个好的想法,这样做可能会影响内核的稳定.如果确实有这种需求,可以考虑在用户空间做一个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) |
给主人留下些什么吧!~~