2015-11-20 238 views
-1

我想從linux內核開源中單獨構建一個linux內核模塊。內核模塊警告

源文件是mm/ksm.c。下面發生

make -C /usr/src/linux-headers-3.16.0-30-generic/ M=/home/wei/module modules 
make[1]: Entering directory `/usr/src/linux-headers-3.16.0-30-generic' 
    CC [M] /home/wei/module/ksm.o 
    Building modules, stage 2. 
    MODPOST 1 modules 
WARNING: "munlock_vma_page" [/home/wei/module/ksm.ko] undefined! 
WARNING: "follow_page_mask" [/home/wei/module/ksm.ko] undefined! 
WARNING: "page_remove_rmap" [/home/wei/module/ksm.ko] undefined! 
WARNING: "mm_find_pmd" [/home/wei/module/ksm.ko] undefined! 
WARNING: "__page_check_address" [/home/wei/module/ksm.ko] undefined! 
WARNING: "anon_vma_interval_tree_iter_next" [/home/wei/module/ksm.ko] undefined! 
WARNING: "__mmu_notifier_change_pte" [/home/wei/module/ksm.ko] undefined! 
WARNING: "ptep_clear_flush" [/home/wei/module/ksm.ko] undefined! 
WARNING: "page_address_in_vma" [/home/wei/module/ksm.ko] undefined! 
WARNING: "alloc_pages_vma" [/home/wei/module/ksm.ko] undefined! 
WARNING: "page_add_anon_rmap" [/home/wei/module/ksm.ko] undefined! 
WARNING: "try_to_free_swap" [/home/wei/module/ksm.ko] undefined! 
WARNING: "lru_add_drain_all" [/home/wei/module/ksm.ko] undefined! 
WARNING: "linear_hugepage_index" [/home/wei/module/ksm.ko] undefined! 
WARNING: "anon_vma_interval_tree_iter_first" [/home/wei/module/ksm.ko] undefined! 
WARNING: "split_huge_page_to_list" [/home/wei/module/ksm.ko] undefined! 
WARNING: "handle_mm_fault" [/home/wei/module/ksm.ko] undefined! 
WARNING: "mlock_vma_page" [/home/wei/module/ksm.ko] undefined! 
WARNING: "__put_anon_vma" [/home/wei/module/ksm.ko] undefined! 
    CC  /home/wei/module/ksm.mod.o 
    LD [M] /home/wei/module/ksm.ko 
make[1]: Leaving directory `/usr/src/linux-headers-3.16.0-30-generic' 

但問題我解決不了,甚至我在每個頭文件中插入EXPORT_SYMBOL(fun);

如何解決此警告?

+0

這些符號**不會從內核核心**中導出。您無法使用修改頭文件的模塊訪問它們 - 您需要修改內核源代碼並重新編譯內核。通常,如果你想使用許多非導出的符號,你最好直接將**添加到內核本身(通過修改它的源代碼並重新編譯它)而不是創建外部模塊。 – Tsyvarev

+0

感謝您的建議:) – wayne

回答

0

編譯內核代碼模塊的部分,最好的方法是運行make menuconfig和選擇編譯爲模塊。或者,這可以通過手動編輯.config文件完成。不鼓勵手動編譯內核部分的模塊,因爲它增加了不必要的工作。

另外,你要知道,不是內核的所有部分可以編譯成模塊:內核核心(即,內存管理,調度等)並沒有被設計成被編譯爲一個可加載內核模塊。現在

,關於您的問題,您正在編譯內存管理相關的文件。如果您查看mm/Makefilemm/Kconfig文件,您會發現該文件不能編譯爲模塊。

+0

我曾在菜單配置中看到過這個選項。 但是「KSM」這個特徵不能被選爲「M」。 所以我嘗試從linux源代碼構建它。 – wayne

+0

「M」不能被選中的原因是它是一個核心組件,因此它沒有被設計爲編譯爲模塊。 – Claudio

+0

我懷疑爲什麼Redhat的論文會說「KSM是Linux內核模塊」 – wayne