免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1574 | 回复: 0
打印 上一主题 下一主题

从内核态调用用户空间的程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-23 16:33 |只看该作者 |倒序浏览
在内核态调用用户空间本身不是一个好的想法,这样做可能会影响内核的稳定.如果确实有这种需求,可以考虑在用户空间做一个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程序,然后和这个模块放在同一个目录下,就可以了.
最后还是建议最好不要这样做.
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/86590/showart_2185233.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP