Linux驅動 init 巨集呼叫的先後順序

2021-06-19 07:28:38 字數 3078 閱讀 1874

linux

核心**裡,

到處充滿了

***_init()巨集

,這些巨集先後順序如何呢?下面以

2.6.21

核心作為例子。

在linux/init.h

裡,有這樣一段**:

#define pure_initcall(fn)  __define_initcall("0",fn,1)

#define core_initcall(fn)  __define_initcall("1",fn,1)

#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)

#define postcore_initcall(fn) __define_initcall("2",fn,2)

#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)

#define arch_initcall(fn) __define_initcall("3",fn,3)

#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)

#define subsys_initcall(fn) __define_initcall("4",fn,4)

#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)

#define fs_initcall(fn)  __define_initcall("5",fn,5)

#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)

#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)

#define device_initcall(fn) __define_initcall("6",fn,6)

#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)

#define late_initcall(fn) __define_initcall("7",fn,7)

#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)

而__define_initcall

又被定義為

#define __define_initcall(level,fn,id) /

static initcall_t  __initcall_##fn##id  __attribute_used__ /

__attribute__((__section__(".initcall"level ".init"))) = fn

so subsys_initcall == __initcall_fn4

它將被鏈結器放於

section  .initcall4.init.

中在啟動過程中,

do_basic_setup--->do_initcalls

裡有以下**

:for (call = __initcall_start; call <__initcall_end; call++)

這個__initcall_start

是在檔案

arch/***/kernel/vmlinux.lds.s

定義的:

__initcall_start = .;

initcalls

__initcall_end = .;

initcalls

被定義於

asm-generic/vmlinux.lds.h:

#define initcalls       /

*(.initcall0.init)      /

*(.initcall0s.init)      /

*(.initcall1.init)      /

*(.initcall1s.init)      /

*(.initcall2.init)      /

*(.initcall2s.init)      /

*(.initcall3.init)      /

*(.initcall3s.init)      /

*(.initcall4.init)      /

*(.initcall4s.init)      /

*(.initcall5.init)      /

*(.initcall5s.init)      /

*(.initcallrootfs.init)   /

*(.initcall6.init)      /

*(.initcall6s.init)      /

*(.initcall7.init)      /

*(.initcall7s.init)

好了,***_init()巨集的呼叫順序應該一目了然了,

順便說一句,在

linux/init.h

裡,還有這樣一段**

:#define core_initcall(fn)  module_init(fn)

#define postcore_initcall(fn) module_init(fn)

#define arch_initcall(fn) module_init(fn)

#define subsys_initcall(fn) module_init(fn)

#define fs_initcall(fn)   module_init(fn)

#define device_initcall(fn)  module_init(fn)

#define late_initcall(fn) module_init(fn)

這是在定義

module

變數的情況下對

subsys_initcall

的定義,

就是說對於驅動模組,使用

subsys_initcall

等價於使用

module_init

linux中的 init巨集

在核心裡經常可以看到 init,devinit這樣的語句,這都是在init.h中定義的巨集,gcc在編譯時會把被修飾的內容放到這些巨集所代表的section中。define init section init.text cold notrace define initdata section ini...

init晶元的主機板網絡卡驅動 for linux

上一次在安裝oracle as4這個linux時,網絡卡編譯通過了,但輸入ifconfig all 檢視時就硬是沒發現有eth0這個資訊,也就是說裝驅動的時候出問題了。沒裝上。上網查了很久,終於發現有乙個說是適用於所有init晶元的主機板自帶的網絡卡的。下來安裝試試,果然可以了。好東西!現上傳到這裡...

linux驅動開發 系統呼叫

本文主要是以前學習系統呼叫原理的筆記,寫得比較詳細,最後會給出新增乙個系統呼叫的步驟。swi 1 什麼是系統呼叫 系統呼叫是核心和應用程式間的介面,應用程式要訪問硬體裝置和其他作業系統資源,必須通過系統呼叫來完成。在linux中,系統呼叫是使用者空間訪問核心的唯一手段,除異常和中斷外,他們是核心唯一...