Archive for the F9-kernel Category

F9-kernel 之 init_hook

Posted in F9-kernel, 嗜好 with tags , on 2014 年 04 月 18 日 by Kun-Yi

F9-kernel 是知名大牛Jserv 的發起的計劃, 因為想玩玩microkernel 的東西 所以開始關注這個計劃

F9-kernel 用了一個技巧 把許多模組內的 init 函式, 集合到 .init_hook 這個text section (read only), 他的技巧是使用 gcc 的屬性修飾宣告將特定程式碼的片斷編譯後放到特定程式段, 目前透過下列的 macro 來將 module 內的init 宣告放到正確程式段

#define INIT_HOOK(_hook, _level) \
const init_struct _init_struct_##_hook \
__attribute__((section(“.init_hook"))) = { \
.level = _level, \
.hook = _hook, \
.hook_name = #_hook, \
};

當系統run 起來時, 核心會去呼叫 run_init_hook() (ref. ./kernel/init.c) 這個函式 來查找需要執行的 init 函式 (因為 struct 內有level 成員的設計, 所以可以區分不同的執行時機點)

目前這個函式就是將每次將整個.init_hook 整個跑一遍, 遇到level 吻合的就執行, 為了能做到跑一遍的動作, 還特別在link script (ref. ./platform/stm32f4/f9.ld) 內宣告了兩個 init_hook_startinit_hook_end symbols 來取得 讓 run_init_hook() 可以簡單的找到 .init_hook 程式段的起始與終點

目前版本, 可以找到系統已經定義了下列 init function ( 使用 “find . -type f -exec grep init_struct -Hn {} \;" )

./build/discoveryf4/f9_symmap.c:705:"_init_struct_dbg_device_init_hook"
./build/discoveryf4/f9_symmap.c:706:"_init_struct_ktimer_event_init"
./build/discoveryf4/f9_symmap.c:707:"_init_struct_memory_init"
./build/discoveryf4/f9_symmap.c:708:"_init_struct_sched_init"
./build/discoveryf4/f9_symmap.c:709:"_init_struct_syscall_init"
./build/discoveryf4/f9_symmap.c:710:"_init_struct_thread_init_subsys"
./build/discoveryf4/f9_symmap.c:711:"_init_struct_kdb_init"
./build/discoveryf4/f9_symmap.c:712:"_init_struct_kprobe_init"
./build/discoveryf4/f9_symmap.c:713:"_init_struct_ksym_init"

 

廣告