编译安装了gem5 ARM架构的模拟器,运行使用arm-linux-gcc-4.4.3交叉编译链编译的文件时,出现了如下错误:
%——————————————————————————————————————–%
**** REAL SIMULATION ****
info: Entering event queue @ 0. Starting simulation…
FATAL: kernel too old
panic: Page table fault when accessing virtual address 0x18
@ cycle 351000
[invoke:build/ARM/sim/faults.cc, line 70]
Memory Usage: 624444 KBytes
Program aborted at cycle 351000
Aborted (core dumped)
%——————————————————————————————————————–%
在google搜索一些资料之后,原因和解决方法如下:
出现“kernel too old” 的原因是不同版本的glibc库文件要依赖于不同版本的linux内核版本,并且编译器会限定运行该可执行文件所需的最低的内核版本。在编译时使用的编译器的版本比较高,它所指定的最低linux内核版本要高于m5声明的内核版本。
所以有两种解决方案。
第一种,调高m5声明的kernel版本。
找到源文件:
src/arch/arm/linux/process.cc: //不同架构请修改对应的arch
如下代码段:67-71行
strcpy(name->sysname, “Linux”);
strcpy(name->nodename, “m5.eecs.umich.edu”);
strcpy(name->release, “x.x.xx“);
strcpy(name->version, “#1 Mon Aug 18 11:32:15 EDT 2003”);
strcpy(name->machine, “armv7l”);
修改 strcpy(name->release, “x.x.xx“) —–>strcpy(name->release, “2.6.35“);
我的arm-linux-gcc版本是4.4.3,将上述代码修改为 “2.6.35”。如有需要,请查找内核版本号历史,修改更高一点。
保存,重新编译m5,即可成功运行。
第二种,使用较低版本的arm-linux-gcc。
我没有测试第二种,应该是可以的,只要将arm-linux-gcc的版本将下来,对内核版本的要求自然就低了。