一、macro fs_initcall,以fs_initcall(usb20_init)为例
1. fs_initcall(usb20_init) macro展开
*******************************************************************************
fs_initcall(usb20_init);
expanding:
fs_initcall(usb20_init) -->
static initcall_t __initcall_usb20_init5 __used \
__attribute__((__section__(".initcall" "5" ".init"))) = usb20_init;
*******************************************************************************
通过fs_initcall定义了一个initcall_t类型的函数指针变量,它指向usb20_init。
initcall_t函数指针类型定义:
*******************************************************************************
typedef int (*initcall_t)(void);
*******************************************************************************
2. kernel段定义
在include/asm-generic/vmlinux.lds.h中有如下macro定义:
*******************************************************************************
#define INITCALLS \
*(.initcallearly.init) \
VMLINUX_SYMBOL(__early_initcall_end) = .; \
*(.initcall0.init) \
*(.initcall0s.init) \
*(.initcall1.init) \
*(.initcall1s.init) \
*(.initcall2.init)
1. fs_initcall(usb20_init) macro展开
*******************************************************************************
fs_initcall(usb20_init);
expanding:
fs_initcall(usb20_init) -->
static initcall_t __initcall_usb20_init5 __used \
__attribute__((__section__(".initcall" "5" ".init"))) = usb20_init;
*******************************************************************************
通过fs_initcall定义了一个initcall_t类型的函数指针变量,它指向usb20_init。
initcall_t函数指针类型定义:
*******************************************************************************
typedef int (*initcall_t)(void);
*******************************************************************************
2. kernel段定义
在include/asm-generic/vmlinux.lds.h中有如下macro定义:
*******************************************************************************
#define INITCALLS \
*(.initcallearly.init) \
VMLINUX_SYMBOL(__early_initcall_end) = .; \
*(.initcall0.init) \
*(.initcall0s.init) \
*(.initcall1.init) \
*(.initcall1s.init) \
*(.initcall2.init)