qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Qemu and mmap_min_addr


From: Jussi Hakala
Subject: [Qemu-devel] Qemu and mmap_min_addr
Date: Wed, 30 Apr 2008 14:43:09 +0300
User-agent: Mozilla-Thunderbird 2.0.0.9 (X11/20080110)

Depending on the setting of mmap_min_addr, the userspace qemu may just die with permission denied when trying to run a program with recent linux kernels.

The newest Ubuntu, Hardy Heron, ships with a default value of 65536 in /proc/sys/vm/mmap_min_addr which will cause the following problem (the test program is a simple hello world compiled for arm architecture).

$ sudo sh -c 'echo 65536 > /proc/sys/vm/mmap_min_addr'
$ qemu-arm ./a.out
mmap: Permission denied
$ sudo sh -c 'echo 32768 > /proc/sys/vm/mmap_min_addr'
$ qemu-arm ./a.out
hello world
$ qemu-arm -h
qemu-arm version 0.9.1, Copyright (c) 2003-2008 Fabrice Bellard
usage: qemu-arm [options] program [arguments...]
Linux CPU emulator (compiled for arm emulation)

The problem is present in every version of qemu I've tried, from 0.8.2 to a quite recent cvs snapshot.

Seems that the problem is related to the mmap2 call and the first argument interpreted as a fixed address with MAP_FIXED flag set... here's an excerpt from strace for details:

mmap2(0x40000000, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40000000
mprotect(0x40080000, 4096, PROT_NONE)   = 0
mmap2(0x8000, 434176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = -1 EACCES (Permission denied)
dup(2)                                  = 4
fcntl64(4, F_GETFL)                     = 0x2 (flags O_RDWR)
fstat64(4, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 10), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f5f000
_llseek(4, 0, 0xbfe5bf48, SEEK_CUR)     = -1 ESPIPE (Illegal seek)
write(4, "mmap: Permission denied\n", 24mmap: Permission denied
) = 24
close(4)                                = 0
munmap(0xb7f5f000, 4096)                = 0
exit_group(-1)                          = ?

So, basically I'm asking if this is an easy thing to fix, ie. if it's easy to increment the address value to begin with or if the MAP_FIXED can be somehow done away with...

Regards,

  Jussi




reply via email to

[Prev in Thread] Current Thread [Next in Thread]