现在的位置: 首页 > 综合 > 正文

如何在linux内核中调用用户空间的程序

2013年12月11日 ⁄ 综合 ⁄ 共 1048字 ⁄ 字号 评论关闭

以前的init进程的启动代码
execveinit_filename,argv_init,envp_init); 

现在改为
static void run_init_process(char *init_filename)
{
argv_init[0] = init_filename;
kernel_execve(init_filename, argv_init, envp_init);
}

好的,聪明人就发现,linux内核中调用用户空间的程序可以使用init这样的方式,调用 kernel_execve

不过内核还是提供了更好的辅助接口call_usermodehelper,自然最后也是调用kernel_execve

2.6.25内核的/kernel/kmod.c就有这样的实例
char modprobe_path[KMOD_PATH_LEN] = "/sbin/modprobe";

int request_module(const char *fmt, ...)
{
          va_list args;
          char module_name[MODULE_NAME_LEN];
          unsigned int max_modprobes;
          int ret;
          char *argv[] = { modprobe_path, "-q", "--", module_name, NULL };
          static char *envp[] = { "HOME=/",
                                  "TERM=linux",
                                  "PATH=/sbin:/usr/sbin:/bin:/usr/bin",
                                  NULL };
        ...... 
         ret = call_usermodehelper(modprobe_path, argv, envp, 1);
        ......  
        return ret;
}
EXPORT_SYMBOL(request_module);

(本文作者deep_pro http://hi.baidu.com/deep_pro/ 转载请注明出处)
顾名思义,request_module用来获取某个模块
大致可以看出内核最终调用了用户空间的程序
/sbin/modprobe -q -- moudule_name

抱歉!评论已关闭.