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

Reply via email to