start_kernel
setup_arch
mdesc = setup_machine(machine_arch_type);
paging_init(mdesc);
devicemaps_init
mdesc->map_io();
#ifdef config_mach_smdkc110
machine_start(smdkc110, "smdkc110")
#elif config_mach_smdkv210
machine_start(smdkv210, "smdkv210")
#endif
/* maintainer: kukjin kim */
.phys_io = s3c_pa_uart & 0xfff00000,
.io_pg_offst = (((u32)s3c_va_uart) >> 18) & 0xfffc,
.boot_params = s5p_pa_sdram + 0x100,
//.fixup = smdkv210_fixup,
.init_irq = s5pv210_init_irq,
.map_io = smdkc110_map_io,
.init_machine = smdkc110_machine_init,
.timer = &s5p_systimer,
machine_end
#define machine_start(_type,_name) \
static const struct machine_desc __mach_desc_##_type \
__used \
__attribute__((__section__(".arch.info.init"))) = ;
machine_desc結構體來控制系統體系架構相關部分的初始化。map_io成員即核心提供給使用者的建立外設i/o資源到核心虛擬位址靜態對映表的介面函式,這個函式需要我們自己實現。通常情況下可以實現得很簡單,只要直接呼叫iotable_init建立對映表就行了。
smdkc110_map_io
s5p_init_io
iotable_init(s5p_iodesc,...)
static struct map_desc s5p_iodesc __initdata = , , , , , , ,
};
struct map_desc ;
經過分析,真正的核心移植時給定的靜態對映表在arch/arm/plat-s5p/cpu.c中的s5p_iodesc,本質是乙個結構體陣列,陣列中每乙個元素就是乙個對映,這個對映描述了一段實體地址到虛擬位址之間的對映。這個結構體陣列所記錄的幾個對映關係被iotable_init所使用,該函式負責將這個結構體陣列格式的表建立成mmu所能識別的頁表對映關係,這樣在開機後可以直接使用相對應的虛擬位址來訪問對應的實體地址。 linux驅動開發擴充套件 核心啟動logo
static struct logo data fb logo read mostly 裡面包含了色深depth以及一些調色盤資料和logo資料指標 struct linux logo 該結構體中包含了logo本身的所有資訊以及影象資料,這些資料並沒有直接出現在核心原始碼中,核心原始碼中只能找到lo...
linux字元裝置驅動開發之記憶體對映
linux驅動最終都死通過配置暫存器完成,linux驅動開發需要滿足linux的驅動框架.所以存在乙個記憶體管理單元 mmu 實現虛擬位址與實體地址的對映,記憶體保護和虛擬位址快取功能.通過記憶體對映,只需要對虛擬位址進行操作,就可以實現相應的驅動開發.記憶體對映 對映函式 記憶體對映 void i...
linux驅動開發擴充套件 輸入事件驅動層原始碼分析
drivers input evdev.c define evdev minor base 64 define evdev minors 32 define evdev buffer size 64struct evdev struct evdev client static struct evde...