Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 8 May 2012 21:39:54 +1200
From:      Andrew Turner <andrew@fubar.geek.nz>
To:        Tim Kientzle <kientzle@freebsd.org>
Cc:        arm@freebsd.org, freebsd-hackers@freebsd.org, John Baldwin <jhb@FreeBSD.org>
Subject:   Re: How does loader(8) decide where to load the kernel?
Message-ID:  <20120508213954.3c4a0c0e@fubar.geek.nz>
In-Reply-To: <8B01DF29-747A-449C-A762-E852F57C6380@freebsd.org>
References:  <3B2A320B-3ADE-4F48-B94E-4F0886178251@freebsd.org> <201205070957.03842.jhb@freebsd.org> <8B01DF29-747A-449C-A762-E852F57C6380@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 7 May 2012 22:32:10 -0700
Tim Kientzle <kientzle@freebsd.org> wrote:

> 
> On May 7, 2012, at 6:57 AM, John Baldwin wrote:
> 
> > 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.
> 
> Exactly my problem.  This all assumes that you're loading
> the kernel into low memory.
> 
> On the AM3358, the DRAM starts at 0x8000 0000
> on boot, so I'm trying to find a clean way to convince
> the loader's ELF code to put the kernel there.

I have a script at [1] that builds an image to load the kernel directly
from U-Boot. It figures out where to tell U-Boot to load a kernel by
using readelf to find the value of physaddr and kernbase to use to
calculate what physical addresses to use to load the kernel to and
where the first instruction to execute is.

Andrew

[1] http://fubar.geek.nz/files/freebsd/omap/build_beagle.sh



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120508213954.3c4a0c0e>