我需要做什么: 修改Linux内核代码(从kernel.org下载的3.13.6)。查找调用kvm_vmx_exit_handler函数的次数。
我想做什么: 在'x86.h'文件中声明一个数组
extern unsigned long int my_count_s[40];
文件x86.h,它包含在'vmx.c'文件中
#include "x86.h"
现在,我正在尝试将数组中的元素初始化为文件'vmx.c'中的值0。
my_count_s[1] = 0;
每次调用kvm_exit_handler函数时,我都会递增它。我将了解kvm在发生事件时退出的次数,以及调用特定退出处理函数的次数。我将为每个exithandler函数使用数组的单个元素。
我遇到的错误:
arch/x86/kvm/vmx.c:58:1: warning: data definition has no type or storage class [enabled by default]
arch/x86/kvm/vmx.c:58:1: error: type defaults to ‘int’ in declaration of ‘my_count_s’ [-Werror=implicit-int]
arch/x86/kvm/vmx.c:58:1: error: conflicting types for ‘my_count_s’
arch/x86/kvm/x86.h:8:26: note: previous declaration of ‘my_count_s’ was here
arch/x86/kvm/vmx.c:58:1: error: invalid initializer
我的理解: 我已经将my_count_s [40]的数据类型声明为unsigned long int,但为什么它被默认为'int'? 即使它是默认的ti数据类型'int',为什么行my_count_s [1] = 0会出现初始化错误; ?
注意: 1. vmx.c中的第58行是“my_count_s [1] = 0;” 2.如果我通过声明数组来编译内核,它工作正常,但在我尝试为数组中的元素赋值时会弹出错误。
答案 0 :(得分:2)
声明,包括作业必须是内部功能。我打赌你的功能超出了功能。
编译器很困惑,因为=
只能出现在声明和语句中,并且因为它在函数外部,所以你的行被解析为声明。那是行不通的;哪种类型?
答案 1 :(得分:-1)
问题是,即使你的头文件中有这个:
extern unsigned long int my_count_s[40];
你仍然没有在任何地方定义数组 - 你只是声明它存在某处。
在某些源文件(可能是arch/x6/kvm/vmx.c
)中,您需要定义数组:
unsigned long int my_count_s[40];
请记住,extern
说“嘿编译器,这个变量存在于某个模块中。”这就是我们在头文件中放置extern
声明的原因。它们实际上并没有为变量分配任何空间,它们只表明它的存在。
没有extern
的行是定义,并放在.c
文件中。在该编译单元中,实际上为变量保留了空间。
另一方面。此变量是否需要是全局范围的?如果arch/x6/kvm/vmx.c
是唯一引用它的文件,那么它不应该在头文件中,并且应该在static
文件中标记为.c
:
static unsigned long int my_count_s[40];
此处,static
将其可见性限制为仅定义在其中的C文件。