以前的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