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()函数介绍相关推荐

  1. 快速找到 Linux Kernel 中各种函数原型的方法

    如果你是使用VS Code的话,下面这个小技巧适合你 最近一直在研究Linux的kernel代码,有时候遇到需要查看具体struct定义的时候,但是使用VS Code的时候,每次在查询里面输入的时候, ...

  2. linux kernel中的栈的介绍

    目录 1.linux kernel中的中断irq的栈stack (1).arm32体系的irq的栈 (2).arm64体系的irq的栈 2.linux kernel中的栈stack (1).概念介绍: ...

  3. Linux kernel 中模块化的平台驱动代码介绍

    介绍 在linux kernel中通过module_platform_driver来实现模块化平台驱动.大量的设备驱动程序都基于该种方式来实现,使用频次非常的高,在linux kernel 5.4.1 ...

  4. linux 内核flush,armv8(aarch64)linux内核中flush_dcache_all函数详细分析

    /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...

  5. Linux kernel中常见的宏整理

    0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识 ...

  6. 内存访问顺序 - part2: 屏障及Linux kernel中屏障的使用

    文章目录 屏障是什么 Linux Kernel 中的屏障 Linux 屏障 API 一般的屏障 强制性屏障 SMP 条件屏障 隐式屏障 其他屏障 屏障的开销 未来的文章 本文翻译自 Memory ac ...

  7. Linux系统中的函数

    Linux系统中的函数: 一.进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtables ...

  8. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别

    TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...

  9. linux kernel中的进程栈

    1.linux中的user mode的进程栈 在thread_info.h中,设置进程栈的大小为16k #define THREAD_SIZE 16384 #define THREAD_START_S ...

最新文章

  1. LAMP环境搭建之rpm软件包
  2. PAT题解-1118. Birds in Forest (25)-(并查集模板题)
  3. (0094)iOS开发之本地文件预览的三种方法(2)
  4. 【react】使用代理解决跨域问题
  5. 树莓派学习笔记——交叉编译工具链
  6. cvCalcBackProject的例子
  7. 《MySQL排错指南》——1.9 许可问题
  8. Javascript高级程序设计第二版第十二章--Event--笔记
  9. 【iOS】UIViewController、UINavigationController与UITabBarController的整合使用
  10. 【为书豪相亲】单身小姐姐你在哪里,我是书豪,我在等你
  11. html浏览器图片不显示图片,教你网页图片显示不出来怎么办
  12. android 清理工具,安卓清理君深度清理软件/真心强
  13. Flutter的isolate异步线程机制及使用实战详解
  14. 电视K歌软件哪个好?这10款最火,最好用的电视K歌软件,赶紧收藏
  15. 2022-2-13 转换函数(conversion function) non-explicit-one argument ctor explicit-one argument ctor
  16. HTML英雄联盟 效果图代码结构 (多多指教,感谢)
  17. pandas取整 pandas取整数 pandas 转成int
  18. css3 3d 与案例分析
  19. 【Vijos-P1285】佳佳的魔法药水-Dijkstra思想
  20. iView框架Select组件

热门文章

  1. 上海一百多个数据中心每年消耗全市1.6%的电,将优胜劣汰
  2. 国内的IDC数据中心运营维护前景如何?
  3. java汽车生产工厂模式_什么是工厂模式java
  4. ML:MLOps系列讲解之《MLOps原则之测试》解读
  5. Paper:《How far are we from solving the 2D 3D Face Alignment problem? 》解读与翻译
  6. Jupyter notebook 编写scala与spark
  7. keras保存和载入模型继续训练
  8. 【BZOJ5470】【FJOI2018】—所罗门王的宝藏(BFS)
  9. 2018-11-25-今日总结
  10. LeetCode:汇总区间【228】