【问题标题】:Kernel module warning内核模块警告
【发布时间】:2016-02-22 14:37:30
【问题描述】:

我想从 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);,我也无法解决。

我该如何解决这个警告?

【问题讨论】:

  • 这些符号不是从内核导出的。您无法通过修改标头使模块可访问它们 - 您需要修改内核源代码并重新编译内核。通常,如果您想使用许多未导出的符号,最好将您的功能直接添加到内核本身(通过修改其源代码并重新编译)而不是创建外部模块。
  • 感谢您的建议:)

标签: linux-kernel kernel-module


【解决方案1】:

将部分内核代码编译为模块的最佳方法是运行make menuconfig 并选择编译为模块。或者,这甚至可以通过手动编辑.config 文件来完成。不鼓励手动编译内核部分的模块,因为它会增加不必要的工作。

此外,您必须知道并非内核的所有部分都可以编译为模块:内核核心(即内存管理、调度程序等)并未被设计为编译为可加载的内核模块。

现在,关于您的具体问题,您正在编译一个与内存管理相关的文件。如果您查看mm/Makefilemm/Kconfig 文件,您会发现该文件无法编译为模块。

【讨论】:

  • 我在 menuconfig 中看到了该选项。但是“KSM”这个功能不能选为“M”。所以我尝试从linux源代码构建它。
  • 之所以不能选择“M”是因为它是一个核心组件,所以它不是被设计成模块编译的。
  • 我怀疑为什么 Redhat 的论文说“KSM 是一个 Linux 内核模块”
猜你喜欢
  • 2014-07-07
  • 1970-01-01
  • 2021-04-05
  • 2011-07-15
  • 2012-03-18
  • 2010-10-12
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多