出處:
start_kernel() -> setup_arch(&command_line) -> mdesc = setup_machine(machine_arch_type) -> list = lookup_machine_type(nr) -> return struct machine_desc.
核心在啟動的時候就是最先執行start_kernel() , 然後她就會呼叫體系結構相關的setup_arch(&command_line), 如arm體系結構的在arch/arm/kernel/setup.c中, 進一步, 她就要初始化板級相關的裝置, 但在此之前, 她必須找到這塊目標板的描述結構, 所以她就先通過lookup_machine_type(nr)來查詢這個結構, 傳入的引數是又uboot傳過來的, 儲存在r2中. 如假設她傳入的是'smdk2410' 的nr, lookup_machine_type(nr) 就會找到如下的machine_desc. 這個結構在乙個專門描述sddk2410的檔案中--arch/arm/mach-s3c2410/mach-smdk2410.c
machine_start(smdk2410, "smdk2410") /* @todo: request a new identifier and switch
* to smdk2410 */
/* maintainer: jonas dietsche */
.phys_io = s3c2410_pa_uart,
.io_pg_offst = (((u32)s3c24xx_va_uart) >> 18) & 0xfffc,
.boot_params = s3c2410_sdram_pa + 0x100,
//重要的板級初始化函式
.map_io = smdk2410_map_io,
.init_irq = s3c24xx_init_irq,
.init_machine = smdk2410_init,
.timer = &s3c24xx_timer,
machine_end
machine_start的第乙個引數是用來構造機器的型別的, 如這裡的smdk2410 ,
又下面的定義
.nr = mach_type_##_type
有 nr =
mach_type_smdk2410
而mach_type_smdk2410這些機器型別則在/include/asm-arm/mach-types.h中定義:
#define mach_type_smdk2410 193
完整的結構描述如下:
struct machine_desc ;
/** set of macros to define architecture features. this is built into
* a table by the linker.
*/#define machine_start(_type,_name) /
static const struct machine_desc __mach_desc_##_type /
__used /
__attribute__((__section__(".arch.info.init"))) = ;
在arch/arm/mach-s3c2410/mach-smdk2410.c 定義了以下兩個函式實現:
static struct map_desc smdk2410_iodesc __initdata = ;
static struct platform_device *smdk2410_devices __initdata = ;
static void __init smdk2410_map_io(void)
static void __init smdk2410_init(void)
/* devices we initialise */
static struct platform_device __initdata *smdk_devs = ;
void __init smdk_machine_init(void)
初始化 鍵盤裝置
1 bool initinput hwnd hwnd 216 第二步 建立裝置,滑鼠,鍵盤等。17 res pinput createdevice 18 guid syskeyboard,裝置的guid,這裡使用定義好的 19 pkeyboard,裝置指標 20null 21if succeeded...
第十課 板級初始化
板級初始化即 hal 層 硬體抽象層 初始化,其中執行了平台初始化,hal層的記憶體初始化,中斷初始化,最後是核心層初始化。該檔案中只有這乙個函式,呼叫函式用於初始化 hal層和核心層 為了分離硬體的特性,設計了 hal層,把硬體相關的操作集中在這個層,並向上提供介面,目的是讓核心上層不用關注硬體相...
類初始化和例項初始化過程
類初始化過程 乙個類要建立例項需要先載入並初始化該類 main方法所在的類需要先載入和初始化 乙個子類要初始化需要先初始化父類 乙個類初始化就是執行 方法 由靜態類變數賦值 和靜態 塊組成 靜態類變數賦值 和靜態 塊從上往下執行 方法只執行一次 例項初始化過程 例項初始化就是執行 方法 方法可能過載...