[Patch] Testcase for PR26858
David Daney
ddaney@avtrex.com
Sat Mar 25 18:15:00 GMT 2006
Andrew Haley wrote:
> David Daney writes:
> > This is the test case for PR26858 and another PR to be named in the future.
>
> This one is going to be quite interesting to fix. I think we should
> start some sort of conversation with kernel engineers and Hans Boehm
> to see what can be done.
>
> One thing that immediately occurs to me is to return to using sbrk()
> to get memory pages for the heap, but that fails when creating
> trampolines because the memory doesn't have execute permission set.
> However, we could use sbrk() and then alter the page permissions with
> mprotect(). I see nothing that says we're allowed to do this, but I'm
> fairly sure it will work.
>
The problem with using sbrk() is that there is no guarantee that code
outside of our control will not mmap things in low memory. If libgcj is
embedded in a web browser, the browser might map things there. Since
switching back to using sbrk will not fully solve the problem, I think
we should try to solve it in a different manner.
We really need the kernel/glibc to by default not map things in low
memory. Where the definition of 'low' is a little murky. However there
is a reason that the kernel started mapping things in low memory (to
reduce memory space fragmentation). I foresee a heated discussion with
the kernel hackers coming if we ask them to change it.
I have not run the testcase on a 64 bit system. There is no reason that
in a 64 bit address space a very large block of low memory cannot be
left unmapped. For a 32 bit system, I don't think leaving something
like 16 or 64 64K pages unmapped would be the end of the world.
We need to have a hard limit on the area that we require, otherwise I
think it would be difficult to get buy-in from others to fix things.
Saying that we have a pathological case where we require more than the
lowest 4K to be unmapped is fine, but we need a hard upper limit. It
would be hard to argue to raise the limit, if it were still possible to
generate code that would break with any possible limit.
Thus my two ideas (as stated on IRC yesterday):
1) Have the compiler generate checks for field accesses in large classes.
2) If #1 breaks the BC ABI or makes it too messy, refuse to execute code
for the pathological cases. It should be possible to have the runtime
determine the size of the unmapped low region, Throw an Error at runtime
when classes are being linked if a field access via a null pointer would
fall outside of that area. For things compiled with the C++ ABI ignore
the problem as you have to be trusted to execute such code. If you have
C++ ABI code that fails in this manner you deserve what happens.
Well that is a quick brain dump. I don't really know what the best
approach is. From a purely practical point of view I don't really care,
because with my current code base, I will never be effected by this problem.
David Daney
More information about the Java
mailing list