Re: [RFC][PATCH] Randomize kernel base address on boot

Dan Rosenberg
2011-05-25T14:03:57Z

On Tue, 2011-05-24 at 16:06 -0700, H. Peter Anvin wrote:
> On 05/24/2011 02:16 PM, Ingo Molnar wrote:
> >
> > On some systems holes can be pretty low as well - you'd have to research e820
> > maps submitted to lkml to see how common this is - but it's not terribly
> > common.
> >
> > Some really old systems might have a hole between 15MB-16MB - but that's not an
> > issue if we load at 16 MB or higher.
> >
>
> It definitely happens, and not just at 15-16 MiB either.
>
> Doing this without actually consulting the memory map is dangerous as
> hell; plus you have to verify that you're not clobbering anything else,
> like the command line, initramfs or the linked list of data.
>

My current idea is to use int 0x15, eax = 0xe801 (which seems to be
nearly universally supported) and use bx/dx to determine the amount of
contiguous, usable memory above 16 MB, which seems to be exactly what we
want to know. If the BIOS does not support this function I'll be sure
to catch that and skip the randomization. Likewise, if the amount of
returned memory seems insufficient or otherwise confusing, I'll skip the
randomization.

Given this information, do you have a conservative guess for how close
to the top of available memory we can put the kernel? As in, let's say
we have an XYZ MB chunk of contiguous, free memory, how should I
calculate the highest, safe place to put the kernel in that region?

I'm going to continue to enforce the requirement that 16 MB is the
lowest address we can safely load the kernel, and I'd still appreciate
any information on why 2/4 MB default alignment might cause problems.

Thanks,
Dan

> -hpa