zoukankan      html  css  js  c++  java
  • Linux的 __setup解析 -- 命令行处理


    __setup这条宏在Linux Kernel中,使用最多的地方就是定义处理Kernel的启动参数 的函数及数据结构,宏定义如下:

    #define __setup(str, fn)
    __setup_param(str, fn, fn, 0)

    #define __setup_param(str, unique_id, fn, early)
    static char __setup_str_##unique_id[] __initdata __aligned(1) = str;
    static struct obs_kernel_param __setup_##unique_id
    __used __section(.init.setup)
    __attribute__((aligned((sizeof(long)))))
    = { __setup_str_##unique_id, fn, early }


    ===================


    使用Kernel中的例子分析一下这两条定义:

    __setup("root=", root_dev_setup);

    这条语句出现在init/do_mounts.c中,其作用是处理Kernel启动时的像root=/dev/mtdblock3之类的参数的。


    分解一下这条语句,首先变为:

    __setup_param("root=",root_dev_setup,root_dev_setup,0);


    继续分解,将得到下面这段代吗:

    static char __setup_str_root_dev_setup_id[] __initdata __aligned(1) = "root=";
    static struct obs_kernel_param __setup_root_dev_setup_id
    __used __section(.init.setup)
    __attribute__((aligned((sizeof(long)))))
    = { __setup_str_root_dev_setup_id, root_dev_setup, 0 };


    也就是 以下 定义:

    static char __setup_str_root_dev_setup_id[]  = "root=";
    static struct obs_kernel_param __setup_root_dev_setup_id = { __setup_str_root_dev_setup_id, root_dev_setup, 0 };

    这段代码定义了两个变量:字符数组变量__setup_str_root_dev_setup_id,其初始化内容为"root=",由于该变量用 __initdata修饰,它将被放入.init.data输入段;另一变量是结构变量__setup_root_dev_setup_id,其类型为 struct obs_kernel_param, 该变理被放入 输入段.init.setup中。结构struct struct obs_kernel_param也在该文件中定义如下:

    struct obs_kernel_param {
         const char *str;
         int (*setup_func)(char *);
         int early;
    };


    变量__setup_root_dev_setup_id的三个成员分别被初始化为:

    __setup_str_root_dev_setup_id --> 前面定义的字符数组变量,初始内容为"root="。

    root_dev_setup --> 通过宏传过来的处理函数。

    0 -->常量0,该成员的作用以后分析。


    现在不难想像内核启动时怎么处理启动参数的了:通过__setup宏定义obs_kernel_param结构变量都被放入.init.setup段中,这样一来实际是使.init.setup段变成一张表,Kernel在处理每一个启动参数时,都会来查找这张表,与每一个数据项中的成员str进行比较,如果完全相同,就会调用该数据项的函数指针成员setup_func所指向的函数(该函数是在使用__setup宏定义该变量时传入的函数参数),并将启动参数 如root=后面的内容 传给该处理函数。


    也就是 root_dev_setup 的参数为  /dev/mtdblock3





  • 相关阅读:
    js 仿 asp中的 asc 和 chr 函数的代码
    escape,encodeURI,encodeURIComponent
    从项目从SVN上check下来,用idea打开后,idea没有SVN的工具栏解决方法
    idea中导入SVN的项目时,连接失败,报“Cannot run program "svn"
    spring基础----事件(Applicaition Event)
    idea在导入项目时遇到的问题
    Spring基础---bean的初始化和销毁
    spring基础----EL和资源调用
    spring基础----Bean的Scope
    面试题-------------js三种信息框
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744509.html
Copyright © 2011-2022 走看看