上一篇文章讲了怎么用Gem5构建和启动FS模式,这一次想看看怎么在模拟的环境中测试自己的程序.
我这里还是用的上次提到的X86的环境,整体过程是以下几个步骤:
ypf@ypf-PC:~/ws$ sudo mount -o,loop,offset=32256 full_system_images/disks/linux-x86.img /mnt
ypf@ypf-PC:~/ws$ sudo cp mountfile/hello /mnt/test
ypf@ypf-PC:~/ws$ sudo umount /mnt
一个终端启动:
ypf@ypf-PC:~/ws$ sudo gem5-40c18bb90501/build/X86/gem5.opt gem5-40c18bb90501/configs/example/fs.py
另外一个终端连接:
ypf@ypf-PC:~/ws/gem5-40c18bb90501/util/term$ sudo m5term 127.0.0.1 3456
(none) test # ./hello
FATAL: kernel too old
hello[810]: segfault at 00002ba4ed02dde0 rip 0000000000406227 rsp 00007fff1fca5270 error 4
Segmentation fault
这里遇到一个问题,提示FATAL: kernel too old
,查了网上相关资料
出现“kernel too old” 的原因是不同版本的glibc库文件要依赖于不同版本的linux内核版本,并且编译器会限定运行该可执行文件所需的最低的内核版本。在编译时使用的编译器的版本比较高,它所指定的最低linux内核版本要高于m5声明的内核版本
按照这个意思,就是要调高m5声明的kernel版本
使用,uname -a
查看内核版本
(none) test # uname -a
Linux (none) 2.6.22.9 #2 Mon Oct 8 13:13:00 PDT 2007 x86_64 GNU/Linux
于是按照网上的说法
https://blog.csdn.net/sdupine/article/details/7940867
找到源文件:
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,即可成功运行。
我将我的对应版本号改为4.9.30,但是实际操作后发现内核版本并没有变化,没有任何效果,依然报同样的错误.
这个问题对当前其他测试工作影响不大,留作日后处理.