Linux __setup宏解析

Linux kernel cmdline,_setup宏和core_param代码分析 Linux gcc __attribute__和 aligned()介绍 __attribute__ 为修饰对象的属性以及改变其类型;aligned(m),为m字节对起。 sizeof(int) = 4; sizeof(char) = 1 ;sizeof (char *) = 8; struct stu { char name[5]; int length; //... 阅读详情

__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 };


这段代码定义了两个变量:字符数组变量__setup_str_root_dev_setup_id,其初始化内容为"root=",由于该变量用 __initdata修饰,它将被放入.init.data输入段;另一变量是结构变量__setup_root_dev_setup_id,其类型为 structobs_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=后面的内容传给该处理函数。

 

Verilator+VSCode实战:5分钟搞定Verilog语法检查与波形调试 本文详细介绍了如何将Verilator仿真器与VSCode编辑器高效集成,打造极速的Verilog开发工作流。通过环境配置、实时语法检查、一键仿真与波形生成等实战技巧,帮助IC设计工程师在几分钟内完成从代码编写到波形调试的全过程,大幅提升中小规模模块的验证效率。 阅读详情

相关推荐

Zynq实战:如何用AXI4-Stream To Video Out实现HDMI视频输出(附时序调试技巧)

本文详细介绍了基于Zynq平台使用AXI4-Stream To Video Out IP核实现HDMI视频输出的工程化解决方案。内容涵盖系统架构设计、AXI4-Stream接口优化、异步FIFO配置、时序同步调试技巧等核心环节,特别针对1080p60视频输出提供具体参数配置和性能优化建议,帮助开发者快速构建稳定的视频处理系统。

sql99的博客 462

Linux中__setup()实现原理以及源码分析

1. __setup()介绍 static __init int dma_debug_cmdline(char *str) { if (!str) return -EINVAL; if (strncmp(str, "off", 3) == 0) { pr_info("debugging disabled on kernel command line\n"); global_disable = true; } return 1; } static __init int dma_deb

assiduous_me的博客 2378

密码学:一文看懂Base64算法

Base64常常在我们开发中出现,我们可能只知道它是一串乱码(看不懂的符号),知道有时候知道我们需要把一些数据进行base64编码,有时候需要进行Base64解码。但是却不知道它的作用是什么?它存在的意义是什么?还有它是如何生成的?如何编码和解码?上述的疑问相信在你读完本篇文章之后烟消云散。下面开始正文。Base64是什么?它和加密解密操作有什么关系吗?没错,这就是经过Base64编码后的字符串。对它解码后,我们获得以下内容点个关注,是对我持续创作的最大的鼓励!

Shujie 1万+

linux使用之__setup关键字

我们这里暂不管__setup_param的具体内容,只要搞清楚 __setup的作用即可。__setup只是告诉内核在启动时输入串中含有string时,内核要去执行function_handler。也就是说对于上面的例子,在启动时,bootcmd中含有nfsroot=,就在内核启动时执行nfs_root_setup函数。这是一个宏,它的定义在include/linux/init.h。可以看到,该配置里有nfsroot,它与__setup有何关系?在一个一般化的 __setup定义中,

fyl027的专栏 702

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3338

基于STM32F4的NRF24L01驱动程序

基于STM32F4xx的NRF24L01驱动程序 提示:硬件平台基于STM32F427VIT6、NRF24L01模块 文章目录基于STM32F4xx的NRF24L01驱动程序前言一、NRF24L01简单介绍1,什么是NRF24L012,NRF24L01通信方法3,NRF24L01通信原理4,地址分配&通道分配问题二、STM32CubeMX配置三、添加底层文件1,添加.c/.h文件到工程中2,使用说明四,下载 前言 提示:本例程采用STM32CubeMX配置底层,采用硬件SPI方式驱动NRF24

qq_43603289的博客 2813

linux中的__setup的作用

那把这在这里实现这个的内容是这样的,  __setup() 是一个宏定义,在include/linux/init.h这个文件中.  struct kernel_param {  const char *str;  int (*setup_func)(char *);  };  extern struct kernel_param __setup_start, __set

shenhuxi_yu的专栏 6759

【故障处理】- ORA-01722

在执行升级脚本@?/rdbms/admin/catupgrd.sql时报错ora-01722。

weixin_39099660的博客 855

Linux内核__setup 宏的作用及分析

记录Linux中__setup 的作用

hinewcc的博客 1006

前端实现微信扫一扫的思路

本篇文章的关键点就是讲解了我在实现处理多张二维码的场景时的思路,利用canvas遮挡识别过的二维码这个思路是pbk-bin大佬最先想到的,在实现这个需求以后还是很感叹这个思路的巧妙。👏pbk-bin🎁~如果文章对你有帮助,不妨赠人玫瑰,手有余香,预计将会在下篇更新较为完整的微信扫一扫界面和功能。

fang_my的博客 2488

手把手教你用Trae配置Python开发环境(含Claude 3.5代码生成实战)

本文详细介绍了如何使用字节跳动推出的Trae智能开发环境配置Python开发环境,并实战演示了Claude 3.5代码生成功能。从环境准备到项目初始化,再到AI辅助编码和调试优化,全面展示了Trae在提升开发效率方面的强大能力,特别适合Python开发者快速搭建项目和解决复杂问题。

weixin_28309571的博客 976

linux kernel中__setup()函数介绍

setup1、__setup使用示例2、__setup宏原理3、__setup链接函数的调用 1、__setup使用示例 我们先看一个例子,在driver中,定义下面这一段函数,并加上__setup注册 static int __init skip_initramfs_param(char *str) { if (*str) return 0; do_skip_initramfs = 1; return 1; } __setup("skip_initramfs", skip_initramfs_p

baron-周贺贺-代码改变世界ctw 6840

LAMMPS后处理—如何构建二维云图-接触角呢?

计算接触角

Rockyoung 6523

early_param和__setup宏

一.宏的定义 在/include/linux/Init.h中 #define __setup(str, fn) \ __setup_param(str, fn, fn, 0)   #define early_param(str, fn) \ __setup_param(str, fn, fn, 1) 两个宏都会调用__setup_param 跟踪进__setup_p

paomadi的专栏 2817

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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 __setu

soulfy的专栏 612

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

__setup宏以及表驱动编程

在linux的代码中,经常可以看到这样的写法: __setup("root=", root_dev_setup); 其中__setup为宏,root_dev_setup为函数名,这样的写法是什么意义呢? 查找宏的定义 #define __setup_param(str, unique_id, fn, early) \ static const char __setup_str_#...

zhoudawei的专栏 962

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

__setup

目录 作用 示例 定义 调用流程 作用 根据传入的字符串参数,与bootloader传递的参数(bootargs)进行匹配,从而调用传入的函数 示例 static int __init cmdline_test_setup(char *s) { printk("%s\n", s); return 1; } __setup("test=", cmdline_t...

IT利刃出鞘的博客 953

关于__setup() 宏

@do_mounts.cstatic int __init load_ramdisk(char *str){ rd_doload = simple_strtol(str,NULL,0) & 3; return 1;}__setup("load_ramdisk=", load_ramdisk);#define __setup(str, fn) \ __setup_param(str, fn, fn,

120

__setup宏简介

Origin: http://blog.youkuaiyun.com/wushuan10141/article/details/5914258 内核组件用__setup宏来注册关键字及相关联的处理函数,__setup宏在include/linux/init.h中定义,其原型如下: #define __setup(str, fn)__setup_param(str, fn, fn, 0) (__se

ganggexiongqi的专栏 909

Linux的 __setup解析 -- 命令行处理

__setup这条宏在Linux Kernel中,使用最多的地方就是定义处理Kernel的启动参数 的函数及数据结构,宏定义如下: #define __setup(str, fn) \ __setup_param(str, fn, fn, 0) #define __setup_param(str...

268

linux驱动中宏__setup(str, fn)

(一). 定义如下:#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

前行 2260

Linux内核代码中的__setup的用途

在Linux内核代码中经常会看到__setup,如下所示: __setup("nfsroot=", nfs_root_setup); 这是一个宏,它的定义在include/linux/init.h #define __setup(str, fn) __setup_param(str, fn, fn, 0) 我们这里暂不管__setup_param的具体内...

金溪的博客 552

__setup,early_param宏

我们在跟踪rootfs挂载过程的时候,会在init/main.c看到有如下一个函数rdinit_setup,并通过__setup宏进行声明: //init/main.c static int __init rdinit_setup(char *str)

HZero 1218

linux -- _setup宏介绍

 内核组件用__setup宏来注册关键字及相关联的处理函数,__setup宏在include/linux/init.h中定义,其原型如下:__setup(string, function_handler)其中:string是关键字,function_handler是关联处理函数。__setup只是告诉内核在启动时输入串中含有string时,内核要去执行function_handler。String必须以“=”符结束以使parse_args更方便解析。紧随“=”后的任何文本都会作为输入传给 function_

OLillian的专栏 1436

linux内核启动过程中__set_up的作用!

__set_up是一个宏 #define __setup(str, fn) \ __setup_param(str, fn, fn, 0) #define __setup_param(str, unique_id, fn, early) \ static char __setup_str_##un...

dijianfei2190的博客 432
上一篇: ARM Linux系统调用的原理
下一篇: container_of和list_for_each_entry 及其相关函数的分析
LinuxWorking
博客等级 码龄10年 24粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值