歡迎您光臨本站 註冊首頁

linux loadable module機制以及啟發

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

1,EXPORT_SYMBOL

EXPORT_SYMBOL( my_pub_func);
在預編譯階段會解析為:
extern void *__crc_my_pub_func __attribute__((weak));
static const unsigned long __kcrctab_my_pub_func __attribute__((__used__)) __attribute__((section("__kcrctab" ""), unused)) = (unsigned long) &__crc_my_pub_func;
static const char __kstrtab_my_pub_func[] __attribute__((section("__ksymtab_strings"))) = "" "my_pub_func";
static const struct kernel_symbol __ksymtab_my_pub_func __attribute__((__used__)) __attribute__((section("__ksymtab" ""), unused)) = { (unsigned long)&my_pub_func, __kstrtab_my_pub_func };

很顯然__ksymtab_my_pub_func存儲了my_pub_func的地址和符號信息,該符號對應的地址
只有insmod后才會確定;
__ksymtab_my_pub_func會鏈接到__ksymtab section,__ksymtab section中的所有內容就構成了
內核"導出"的符號表,這個表在insmod 時候會用到.

2,/proc/kallsyms
cat /proc/kallsyms會列印出內核當前的符號表,例如:
...
d8834a24 t snd_free_sgbuf_pages [snd_page_alloc]
c0180d7a U create_proc_entry [snd_page_alloc]
d88341d8 T snd_dma_free_pages [snd_page_alloc]
c013d858 U __get_free_pages [snd_page_alloc]
d8834ab5 t snd_malloc_sgbuf_pages [snd_page_alloc]
c014f906 U kmem_cache_alloc [snd_page_alloc]
c0106dcd U dma_alloc_coherent [snd_page_alloc]
...
其中第一列是該符號在內核地址空間中的地址;第二列是符號屬性,小寫表示
局部符號,大寫表示全局符號,具體含義參考man nm; 第三列表示符號字元串.

3,insmod module_name.ko需要做些什麼?
1),需要分配內存,將模塊中包含的符號分配到內核地址空間;
2),從內核符號表解析該模塊中調用的外部符號,用解析出的真實地址
代替符號地址.

4,一點啟示
內核可載入模塊機制和動態鏈接機制非常類似,但思想卻非常簡單.某些嵌入式
系統(比如mp3/mp4/cell phone系統)RAM空間非常有限,而且更小的SDRAM有利於
降低功耗,提高產品的競爭力,而且這類產品對外部存儲的要求卻不受限制(一般都
集成了大容量的nand flash,這是由產品特性所決定的).同時,這類系統需要集成
越來越多的功能,但這些功能許多時候都是獨立運行,這就很適合將某些功能模
塊化,在需要使用時候載入到系統內存中,不需要使用時候卸載.
受可載入模塊的機制啟發,很容易實現一種類似於動態鏈接的機制,節省系統內存.
這種機制由於思想簡單,很容易在一些簡單的嵌入式環境下(比如ucos,甚至沒有操作
系統)實現.

[火星人 ] linux loadable module機制以及啟發已經有234次圍觀

http://coctec.com/docs/linux/show-post-188617.html