通常情况下,内核模块Makefile中的KDIR表示编译要加载这个模块的内核镜像对应的源代码目录。而对于运行在PC上(包括虚拟机)的Linux来说,/lib/modules/x.xx.xx/build这样的路径指向的是这个PC上运行的x.xx.xx版本内核镜像所对应的源代码目录。如果x.xx.xx与“uname -r”命令的结果一致,那就表示是PC当前运行的内核镜像。所以,这样的路径通常用来编译加载到当前PC上运行的Linux的内核模块。这就是你所说的“使用第二个路径且不加交叉编译一路编译顺畅,在虚拟机中加载、使用一切正常,真是一头雾水”的原因。
第一个路径是用来编译开发板上运行的内核模块的。那需要两个条件
1. 开发板当前运行内核镜像对应的源代码目录(并且已配置好);
2. 交叉编译配置。
从你的出错信息
globlemem_5_4: version magic '2.6.36 mod_unload modversions ARMv5 ' should be '2.6.36-FriendlyARM preempt mod_unload ARMv6 '
看,应该是没有正确配置内核源代码。在友善之臂提供的开发板用户手册上可以找到如何配置内核的步骤。
1、虚拟机中linux下 /lib/modules/2.6.18-53.el5/build/是怎么来的?arm与宿主机在编译内核时指定内核目录不同?
这是虚拟机安装Linux过程中生成的,为了方便编译在虚拟机上加载的内核模块,和编译在开发板上运行的内核模块所需要的内核目录不同。
2、是不是从网上下载的源代码编译之后才能使用?
我不清楚你所说的"从网上下载的源代码"指的是什么,不过一般来说,C/C++这样的源代码需要编译成二进制文件(可执行档或库文件)之后才能运行。