module_param_call宏的作用解析 cmdline解析分析

2024-04-04 23:58

本文主要是介绍module_param_call宏的作用解析 cmdline解析分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

module_param_call宏的定义如下,

#define __module_param_call(prefix, name, set, get, arg, perm)          /
        /* Default value instead of permissions? */                     /
        static int __param_perm_check_##name __attribute__((unused)) =  /
        BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2)); /
        static char __param_str_##name[] = prefix #name;                /
        static struct kernel_param const __param_##name                 /
        __attribute_used__                                              /
        __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) /
        = { __param_str_##name, perm, set, get, arg }


    #define module_param_call(name, set, get, arg, perm)                          /
        __module_param_call(MODULE_PARAM_PREFIX, name, set, get, arg, perm)

在kernel编译阶段,会把这个宏定义,加载到对应的链表中,KP(KP对应下面的结构kernel_param)中。

它的作用其实对于kernel和bootloader来说,起到关联的作用,bootloader可以通过传递参数到kernel,在kernel的启动过程中需要对cmdline参数进行解析,在解析的过程中,需要用到kernel_param的结构体,

kernel_param结构体的定义是:
    struct kernel_param {
        const char *name;
        unsigned int perm;
        param_set_fn set;
        param_get_fn get;
        void *arg;
    };

既,一旦在解析的过程中,发现kernel_param的链表中的一项kernel_param的name与cmdline中的某个字符串xxx匹配,则会调用module_param_call宏中定义set函数,进行我们需要的操作。

如高通平台中,如果在cmdline中加入start_mode的话,在restart.c中定义一个module_param_call(start_mode,xxx,set),在启动的过程中,直接调用set.

 

 

下面的这篇文章主要是针对前期的解析cmdline进行分析。

【参考】

<1>Linux启动bootargs参数分析: http://blog.chinaunix.net/u3/99423/showart_2213279.html
<2>Linux 2.6内核启动传递命令行的过程分析: http://soft.zdnet.com.cn/software_zone/2007/1017/561631.shtml

【环境】
    Linux内核版本:V 2.6.20
    
【简介】
    在嵌入式系统中,我们经常在bootloader中设置启动命令行参数,以传递给内核,如在u-boot中,大家比较熟悉的启动命令行参数可能为:
         bootargs=root=/dev/ram rw console=tty0,115200 initrd=0x30800000,0x320000 mem=64M
    这个参数告诉了内核串口的配置,根文件系统挂载方式为ramdisk形式,以及其地址等。
    这些参数在内核中是如何得到解析的呢?

【梦开始的地方--追忆篇】
    参看文章《 Linux内核启动参数的传递 》可以知道,命令参数属于tag值为( define ATAG_CMDLINE 0x54410009  )的tag参数,对该tag解析的结构体定义为:(注意:struct tag结构为为联合体定义形式,以下为了描述清楚而将其简化了表述)
     struct tag {
         struct tag_header hdr;
        struct tag_cmdline   cmdline;
    }
    其中:
    struct tag_cmdline {
        char   cmdline[1];   /* this is the minimum size */
    };

 

    内核在 main()->setup_arch()->parse_tags()->parse_tag()中调用了 parse_tag_cmdline()函数,该函数如下:
    
    static int __init parse_tag_cmdline(const struct tag *tag)
    {
        strlcpy(default_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);
        return 0;
    }
    呵呵,该函数实际上将tag结构体中传递的参数拷贝到了 default_command_line这个全局变量中,这个全局变量的定义在:
     arch/arm/kernel/setup.c
     static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE      

 

    现在,命令行已经被保存了,接下来的工作就是开始解析。Linux的设计者们将命令行的解析搞得挺复杂,将解析过程分为了 3部分,弄得人晕头转向,其实啊,估计是前面的设计没做好,功能不够强大,满足不了后来发展的需要了,所有又进行了扩展,但又得兼容以前的设计,修修补补,才弄得如此的繁琐;人非圣贤,一个这么庞大的软件,不可能是一步到位的啦~~

【Part1--命令行解析】
备注:先解析这个结构的cmdline
    __early_begin = .;
    *(.early_param.init)
    __early_end = .;
具体如下
    还是在 main()->

这篇关于module_param_call宏的作用解析 cmdline解析分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877153

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php