内核启动用户态的程序

内核启动用户态的应用程序是通过call_usermodehelper来调用的,比较常见的调用,比如modprobe. 

Java代码   收藏代码
  1. static inline int  
  2. call_usermodehelper(char *path, char **argv, char **envp, enum umh_wait wait)  


参数说明; 

path : 应用程序的位置 

argv : 传递给用户态应用程序的参数 

envp: 传递给应用程序的环境变量 

wait : 调用用户态应用程序的内核程序是否等到用户态程序退出后才退出。 

使用的例子: 

我们来看kmod.c的源码,它通过调用用户态的modprobe来加载所需要的驱动模块。 

Java代码   收藏代码
  1. int request_module(const char *fmt, ...)  
  2. {  
  3.     va_list args;  
  4.     char module_name[MODULE_NAME_LEN];  
  5.     unsigned int max_modprobes;  
  6.     int ret;  
  7.   
  8. ///构造传递给modeprobe的参数  
  9.     char *argv[] = { modprobe_path, "-q""--", module_name, NULL };  
  10.     static char *envp[] = { "HOME=/",  
  11.                 "TERM=linux",  
  12.                 "PATH=/sbin:/usr/sbin:/bin:/usr/bin",  
  13.                 NULL };  
  14.     static atomic_t kmod_concurrent = ATOMIC_INIT(0);  
  15. #define MAX_KMOD_CONCURRENT 50  /* Completely arbitrary value - KAO */  
  16.     static int kmod_loop_msg;  
  17.   
  18.     va_start(args, fmt);  
  19.     ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args);  
  20.     va_end(args);  
  21.     if (ret >= MODULE_NAME_LEN)  
  22.         return -ENAMETOOLONG;  
  23.   
  24.     /* If modprobe needs a service that is in a module, we get a recursive 
  25.      * loop.  Limit the number of running kmod threads to max_threads/2 or 
  26.      * MAX_KMOD_CONCURRENT, whichever is the smaller.  A cleaner method 
  27.      * would be to run the parents of this process, counting how many times 
  28.      * kmod was invoked.  That would mean accessing the internals of the 
  29.      * process tables to get the command line, proc_pid_cmdline is static 
  30.      * and it is not worth changing the proc code just to handle this case.  
  31.      * KAO. 
  32.      * 
  33.      * "trace the ppid" is simple, but will fail if someone's 
  34.      * parent exits.  I think this is as good as it gets. --RR 
  35.      */  
  36.     max_modprobes = min(max_threads/2, MAX_KMOD_CONCURRENT);  
  37.     atomic_inc(&kmod_concurrent);  
  38.     if (atomic_read(&kmod_concurrent) > max_modprobes) {  
  39.         /* We may be blaming an innocent here, but unlikely */  
  40.         if (kmod_loop_msg++ < 5)  
  41.             printk(KERN_ERR  
  42.                    "request_module: runaway loop modprobe %s\n",  
  43.                    module_name);  
  44.         atomic_dec(&kmod_concurrent);  
  45.         return -ENOMEM;  
  46.     }  
  47. ///调用modeprobe.  
  48.     ret = call_usermodehelper(modprobe_path, argv, envp, 1);  
  49.     atomic_dec(&kmod_concurrent);  
  50.     return ret;  
  51. }  

你可能感兴趣的:(linux内核,操作系统)