編譯安裝了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的版本將下來,對內核版本的要求自然就低了。