Hi, I am trying to run a jitted-vm (meant for php scripts) on x86 FS mode. I
have a virtual-box with centos, I built that jitted-vm inside that, it can run
simple "hello world" program in that vbox. Now I am using that vbox image with
gem5 (after converting VBox *vdi disk to raw *img). That VBox is using
linux-2.6.32-431.5.1.el6 kernel, so I downloaded a centos kernel source with
that same exact version, built that kernel inside VBox and now using that with
gem5 FS. I did that to ensure that my jitted-vm binary and kernel using the
same version of gcc and libc etc. So now this disk-image with this kernel can
boot properly in gem5 and works for hello_world.cpp. So most probably the disk
image with this kernel setup are ok for regular c++ workloads. Now when I ran
that jitted-vm with simple php_script (just "echo hello world"), it starts
executing (debug that using strace) and goes on to some extent (~1000 lines of
strace dump). However after a point suddenly it starts mmap-ing more and more
memory (doubling each time) until it runs out of memory/swap space and
eventually shows the std::bad_alloc error.
So in order to compare the strace dump during that phase, I got a golden strace
dump by running the jitted-vm with that same script inside the Vbox. here is
the comparison:
Golden (strace inside vbox run):
...........
...........
open("/usr/lib64/libtbbmalloc.so.2", O_RDONLY) = 4
read(4, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220T\0\0\0\0\0\0"...,
832) = 832
fstat(4, {st_mode=S_IFREG|0755, st_size=517025, ...}) = 0
mmap(NULL, 2268728, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) =
0x7fe60f358000
mprotect(0x7fe60f36d000, 2093056, PROT_NONE) = 0
mmap(0x7fe60f56c000, 12288, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x14000) = 0x7fe60f56c000
mmap(0x7fe60f56f000, 77368, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe60f56f000
close(4) = 0
mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fe60f158000
mmap(NULL, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fe60f138000
open("/proc/meminfo", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fe615648000
read(4, "MemTotal: 10012668 kB\nMemF"..., 1024) = 1024
read(4, "e: 0\nHugePages_Rsvd: "..., 1024) = 174
read(4, "", 1024) = 0
close(4) = 0
munmap(0x7fe615648000, 4096) = 0
brk(0x4e90000) = 0x4e90000
brk(0x4eb1000) = 0x4eb1000
----->mmap(NULL, 8392704, PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7fe60e937000
mprotect(0x7fe60e937000, 4096, PROT_NONE) = 0
clone(child_stack=0x7fe60f133870,
flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID,
parent_tidptr=0x7fe60f1379d0, tls=0x7fe60f137700, child_tidptr=0x7fe60f1379d0)
= 27122
futex(0x7fe60f1379d0, FUTEX_WAIT, 27122, NULL) = 0
socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4
connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT
(No such file or directory)
close(4) = 0
socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4
connect(4, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT
(No such file or directory)
close(4) = 0
open("/etc/services", O_RDONLY|O_CLOEXEC) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=641020, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fe615648000
..........
..........
Gem5 run strace:
​........
........
open("/usr/lib64/libtbbmalloc.so.2", O_RDONLY) = 4
read(4, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220T\0\0\0\0\0\0"...,
832) = 832
fstat(4, {st_mode=S_IFREG|0755, st_size=517025, ...}) = 0
mmap(NULL, 2268728, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) =
0x7fd2f4378000
mprotect(0x7fd2f438d000, 2093056, PROT_NONE) = 0
mmap(0x7fd2f458c000, 12288, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x14000) = 0x7fd2f458c000
mmap(0x7fd2f458f000, 77368, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fd2f458f000
close(4) = 0
mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2f4178000
mmap(NULL, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2f4158000
open("/proc/meminfo", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2f4157000
read(4, "MemTotal: 4057152 kB\nMemF"..., 1024) = 1024
read(4, " 0\nHugePages_Surp: "..., 1024) = 118
read(4, "", 1024) = 0
close(4) = 0
munmap(0x7fd2f4157000, 4096) = 0
brk(0x3f2a000) = 0x3f2a000
brk(0x3f56000) = 0x3f56000
------> mmap(NULL, 249856, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x7fd2f411b000
brk(0x3f1c000) = 0x3f1c000
mmap(NULL, 499712, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2f40a1000
munmap(0x7fd2f411b000, 249856) = 0
mmap(NULL, 1011712, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2f3faa000
munmap(0x7fd2f40a1000, 499712) = 0
mmap(NULL, 2052096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2f3db5000
munmap(0x7fd2f3faa000, 1011712) = 0
mmap(NULL, 4165632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2f39bc000
munmap(0x7fd2f3db5000, 2052096) = 0
mmap(NULL, 8454144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2f31ac000
munmap(0x7fd2f39bc000, 4165632) = 0
mmap(NULL, 17162240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2f214e000
munmap(0x7fd2f31ac000, 8454144) = 0
mmap(NULL, 34848768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2f0012000
munmap(0x7fd2f214e000, 17162240) = 0
mmap(NULL, 70762496, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2ebc96000
munmap(0x7fd2f0012000, 34848768) = 0
mmap(NULL, 143691776, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2e338d000
munmap(0x7fd2ebc96000, 70762496) = 0
mmap(NULL, 291790848, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2d1d47000
munmap(0x7fd2e338d000, 143691776) = 0
mmap(NULL, 592535552, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7fd2ae831000
munmap(0x7fd2d1d47000, 291790848) = 0
mmap(NULL, 1203257344, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
= 0x7fd266cad000
munmap(0x7fd2ae831000, 592535552) = 0
mmap(NULL, 2443452416, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
= -1 ENOMEM (Cannot allocate memory)
brk(0x9595d000) = 0x3f1c000
mmap(NULL, 2443583488, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
= -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1,
0) = 0x7f86ba500000
munmap(0x7f86ba500000, 28311552) = 0
munmap(0x7f86c0000000, 38797312) = 0
mprotect(0x7f86bc000000, 135168, PROT_READ|PROT_WRITE) = 0
mmap(NULL, 2443452416, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
= -1 ENOMEM (Cannot allocate memory)
futex(0x7f88758d6af0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
munmap(0x7f87e59a4000, 1203257344) = 0
write(2, "terminate called after throwing "..., 48terminate called after
throwing an instance of ') = 48
write(2, "std::bad_alloc", 14std::bad_alloc) = 14
write(2, "'\n", 2'
) = 2
write(2, " what(): ", 11 what(): ) = 11
write(2, "std::bad_alloc", 14std::bad_alloc) = 14
write(2, "\n", 1
) = 1
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
tgkill(1006, 1006, SIGABRT) = 0
Output in my terminal
**** REAL SIMULATION ****
info: Entering event queue @ 0. Starting simulation...
warn: Don't know what interrupt to clear for console.
warn: instruction 'wbinvd' unimplemented
15004861500: system.pc.com_1.terminal: attach terminal 0
warn: Tried to clear PCI interrupt 14
warn: i8042 "Write output port" command not implemented.
warn: i8042 "Write keyboard output buffer" command not implemented.
warn: Write to unknown i8042 (keyboard controller) command port.
hack: Assuming logical destinations are 1 << id.
warn: Unknown mouse command 0xe1.
Writing checkpoint
info: Entering event queue @ 2372968200000. Starting simulation...
warn: instruction 'fild' unimplemented
warn: instruction 'fmul' unimplemented
warn: instruction 'fild' unimplemented
warn: instruction 'fild' unimplemented
warn: instruction 'fdiv' unimplemented
warn: instruction 'fucomi' unimplemented
warn: instruction 'fild' unimplemented
warn: instruction 'fmul' unimplemented
So as shown, gem5 can properly executes/maps until libtbbmalloc and
/proc/meminfo. However it differed from the golden one in mmap marked with
"------>". mmap lengths and flags became different (MAP_STACK is present in
golden whereas absent in gem5 run). Any idea? something to do with the mmap
implementation in gem5? or any unimplemented functions?
-Dibakar​
_______________________________________________
gem5-users mailing list
[email protected]
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users