linux kernel中__setup()函数介绍
生活随笔
收集整理的這篇文章主要介紹了
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()
總結
以上是生活随笔為你收集整理的linux kernel中__setup()函数介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux kernel中的cmdlin
- 下一篇: [optee]-opteeTA启动的过程