On 16 March 2018 at 10:34, Richard Henderson <richard.hender...@linaro.org> wrote: > Limit this to 16M; there does not appear to be any special > support for this in the kernel itself, at least for i686. > > Fixes: https://bugs.launchpad.net/bugs/1749393 > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > > Commentary in the launchpad bug suggests 128M gap for x86_64, but that's > somewhat irrelevant to the given i686 test case. There's certainly nothing > in the referenced kernel patch that does any more than we had been doing > without this patch.
I think the 128MB is enforced by mmap_base() in arch/x86/mm/mmap.c: since x86-64 sots HAVE_ARCH_UNMAPPED_AREA_TOPDOWN, mmap_base is the highest address in memory where mmap is permitted, and mmap_base() enforces that it goes at least 128MB below the bottom of the stack (accounting for rlimit stack size requirements also). Since binfmt_elf() loads ELF segments via mmap this means that they won't go too close to the stack. (The commit a87938b2e246 ensures the gap is honoured by using the full binary size when it does the first mapping so that mmap picks an address that is sufficiently before the end of the mmap region for everything to fit.) The kernel also uses ELF_ET_DYN_BASE to ensure that PIE programs themselves get loaded clear of the ELF interpreter, which we don't have any equivalent of (so you can see that different values of -R result in either the interpreter or the executable getting loaded at lower addresses.) PS: do you know what the intention of the if (reserved_va) { mmap_next_start = reserved_va; } code in linux-user/main.c is? It seems a bit odd to say "ok, we have reserved a big region. we will start trying to mmap outside it.", especially when that region covers the full 4G that the guest can access... thanks -- PMM