2015-11-20 178 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