linux kernel中__setup()函数介绍
setup
- 1、__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_param);
在开机阶段,当cmdline中有"skip_initramfs"字时,就会调用到skip_initramfs_param()函数
2、__setup宏原理
如下为__setup的宏定义,作用是在".init.setup"段定义变量
(include/linux/init.h)
#define __setup_param(str, unique_id, fn, early) \static const char __setup_str_##unique_id[] __initconst \__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 }#define __setup(str, fn) \__setup_param(str, fn, fn, 0)
(vmlinux.lds.h)
#define INIT_SETUP(initsetup_align) \. = ALIGN(initsetup_align); \VMLINUX_SYMBOL(__setup_start) = .; \*(.init.setup) \VMLINUX_SYMBOL(__setup_end) = .;#define INIT_DATA_SECTION(initsetup_align) \.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \INIT_DATA \INIT_SETUP(initsetup_align) \INIT_CALLS \CON_INITCALL \SECURITY_INITCALL \INIT_RAM_FS \}
3、__setup链接函数的调用
那么什么时候开始调用__setup注册的函数呢?
在start_kernel()阶段调用了obsolete_checksetup函数,该函数会依次解析.init.setup的变量中对应的函数。也就是循环调用这些setup函数了
start_kernel()---->unknown_bootoption()---->obsolete_checksetup()
static bool __init obsolete_checksetup(char *line)
{const struct obs_kernel_param *p;bool had_early_param = false;p = __setup_start;do {int n = strlen(p->str);if (parameqn(line, p->str, n)) {if (p->early) {/* Already done in parse_early_param?* (Needs exact match on param part).* Keep iterating, as we can have early* params and __setups of same names 8( */if (line[n] == '\0' || line[n] == '=')had_early_param = true;} else if (!p->setup_func) {pr_warn("Parameter %s is obsolete, ignored\n",p->str);return true;} else if (p->setup_func(line + n))return true;}p++;} while (p < __setup_end);return had_early_param;
}
linux kernel中__setup()函数介绍相关推荐
- 快速找到 Linux Kernel 中各种函数原型的方法
如果你是使用VS Code的话,下面这个小技巧适合你 最近一直在研究Linux的kernel代码,有时候遇到需要查看具体struct定义的时候,但是使用VS Code的时候,每次在查询里面输入的时候, ...
- linux kernel中的栈的介绍
目录 1.linux kernel中的中断irq的栈stack (1).arm32体系的irq的栈 (2).arm64体系的irq的栈 2.linux kernel中的栈stack (1).概念介绍: ...
- Linux kernel 中模块化的平台驱动代码介绍
介绍 在linux kernel中通过module_platform_driver来实现模块化平台驱动.大量的设备驱动程序都基于该种方式来实现,使用频次非常的高,在linux kernel 5.4.1 ...
- linux 内核flush,armv8(aarch64)linux内核中flush_dcache_all函数详细分析
/* * __flush_dcache_all() * Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...
- Linux kernel中常见的宏整理
0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识 ...
- 内存访问顺序 - part2: 屏障及Linux kernel中屏障的使用
文章目录 屏障是什么 Linux Kernel 中的屏障 Linux 屏障 API 一般的屏障 强制性屏障 SMP 条件屏障 隐式屏障 其他屏障 屏障的开销 未来的文章 本文翻译自 Memory ac ...
- Linux系统中的函数
Linux系统中的函数: 一.进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtables ...
- TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别
TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...
- linux kernel中的进程栈
1.linux中的user mode的进程栈 在thread_info.h中,设置进程栈的大小为16k #define THREAD_SIZE 16384 #define THREAD_START_S ...
最新文章
- LAMP环境搭建之rpm软件包
- PAT题解-1118. Birds in Forest (25)-(并查集模板题)
- (0094)iOS开发之本地文件预览的三种方法(2)
- 【react】使用代理解决跨域问题
- 树莓派学习笔记——交叉编译工具链
- cvCalcBackProject的例子
- 《MySQL排错指南》——1.9 许可问题
- Javascript高级程序设计第二版第十二章--Event--笔记
- 【iOS】UIViewController、UINavigationController与UITabBarController的整合使用
- 【为书豪相亲】单身小姐姐你在哪里,我是书豪,我在等你
- html浏览器图片不显示图片,教你网页图片显示不出来怎么办
- android 清理工具,安卓清理君深度清理软件/真心强
- Flutter的isolate异步线程机制及使用实战详解
- 电视K歌软件哪个好?这10款最火,最好用的电视K歌软件,赶紧收藏
- 2022-2-13 转换函数(conversion function) non-explicit-one argument ctor explicit-one argument ctor
- HTML英雄联盟 效果图代码结构 (多多指教,感谢)
- pandas取整 pandas取整数 pandas 转成int
- css3 3d 与案例分析
- 【Vijos-P1285】佳佳的魔法药水-Dijkstra思想
- iView框架Select组件
热门文章
- 上海一百多个数据中心每年消耗全市1.6%的电,将优胜劣汰
- 国内的IDC数据中心运营维护前景如何?
- java汽车生产工厂模式_什么是工厂模式java
- ML:MLOps系列讲解之《MLOps原则之测试》解读
- Paper:《How far are we from solving the 2D 3D Face Alignment problem? 》解读与翻译
- Jupyter notebook 编写scala与spark
- keras保存和载入模型继续训练
- 【BZOJ5470】【FJOI2018】—所罗门王的宝藏(BFS)
- 2018-11-25-今日总结
- LeetCode:汇总区间【228】