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

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字