日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux kernel中__setup()函数介绍

發布時間:2025/3/21 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()函数介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。