在
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中,系統呼叫是使用者空間訪問核心的唯一手段,除異常和中斷外,他們是核心唯一...