How does loader(8) decide where to load the kernel?
John Baldwin
jhb at freebsd.org
Mon May 7 14:05:31 UTC 2012
On Saturday, May 05, 2012 1:06:13 am Tim Kientzle wrote:
> I have ubldr loading the ELF kernel on BeagleBone and am now
> trying to untangle some of the hacks I used to get this working.
>
> Unfortunately, there's one area of the common loader(8) code
> that I really don't understand: How does sys/boot/common/load_elf.c
> determine the physical address at which to load the kernel?
>
> __elfN(loadfile) has the following comment:
>
> [The file] will be stored at (dest).
>
> But that's not really true. For starters, loadfile maps dest
> through archsw.arch_loadaddr. (This mechanism seems
> to only be used on ia64 and pc98, though the result is
> later discarded on those platforms.)
>
> Loadfile then passes the value to loadimage which does
> very strange things:
>
> On i386, amd64, powerpc, and arm, loadimage subtracts
> the dest value from the address declared in the actual ELF
> headers so that the kernel always gets loaded into low memory.
> (there's some intermediate bit-twiddling I'm glossing over, but
> this is the general idea).
The bit twiddling is supposed to be the equivalent of subtracting
KERNBASE from the load address. On both i386 and amd64, there is
a direct mapping of the kernel text such that KERNBASE maps address
0, etc. By default on i386 KERNBASE is 0xc0000000.
--
John Baldwin
More information about the freebsd-hackers
mailing list