我编辑了2.6.32.65 linux内核的一些部分并进行了编译。内核编译得很好并且正常生成bzImage。然后制作然后继续如下:
Kernel: arch/x86/boot/bzImage is ready. (#170)
Building modules, stage 2.
MODPOST 2414 modules.
ERROR: "external_page_start" [fs/cachefiles/cachefiles.ko] undefined!
ERROR: "variable_hash_start" [fs/cachefiles/cachefiles.ko] undefined!
虽然有两个问题。
首先,这些变量在头文件include/linux/stthash.h
中定义如下:
extern unsigned long fixed_hash_start;
extern unsigned long variable_hash_start;
extern unsigned long external_page_start;
extern unsigned long command_space_start;
并在mm/page_alloc.c
中定义如下:
unsigned long fixed_hash_start;
unsigned long variable_hash_start;
unsigned long external_page_start;
unsigned long command_space_start;
然后根据需要为它们分配变量。他们确实通过编译并创建了bzImage
,所以我不知道这有什么问题。
第二个问题是variable_hash_start
中的fs/cachefiles
未在external_page_start
中的任何文件中使用,fs/cachefiles/rdrw.c
中只有cachefiles.ko
被访问(读取,未写入)。
我不知道是什么导致了这个错误,我猜测变量在{{1}}中没有正确链接,但我不知道如何解决这个问题。有什么帮助吗?
答案 0 :(得分:2)
Linux内核的动态模块默认情况下无权访问内核中的全局变量和函数(标题中的函数除外)。您需要专门为模块导出它。
EXPORT_SYMBOL
宏是最常用的。此外,您只能通过EXPORT_SYMBOL_GPL
导出变量和函数来限制GPL模块访问您的变量和函数。
详情: http://tuxthink.blogspot.in/2011/07/exporting-symbols-from-module.html
答案 1 :(得分:0)
首先,在构建内核模块时会遇到错误,这些模块是独立于主内核映像生成的,因此模块中的错误将停止编译,但仍然会为您提供bzImage。
此外,随意浏览内核2.6.32.65表示变量external_page_start和command_space_start不存在于mm / page_alloc.c中
但是,您还没有告诉我们您修改了什么,这些变量是由您添加的吗?
在任何情况下,包括您定义这些变量的正确头文件都将停止未定义的变量错误。