[U-Boot] [PATCH 0/2] Make sure 85xx bss doesn't start at 0x0
Peter Tyser
ptyser at xes-inc.com
Wed Oct 7 01:10:18 CEST 2009
On Tue, 2009-10-06 at 15:34 -0700, J. William Campbell wrote:
> Peter Tyser wrote:
> > On Tue, 2009-10-06 at 13:34 -0700, J. William Campbell wrote:
> >
> >> Peter Tyser wrote:
> >>
> >>> On Tue, 2009-10-06 at 19:51 +0200, Wolfgang Denk wrote:
> >>>
> >>>
> >>>> Dear Peter Tyser,
> >>>>
> >>>> In message <1254843932.24664.2083.camel at localhost.localdomain> you wrote:
> >>>>
> >>>>
> >>>>> I personally like the current implementation of putting the bss after
> >>>>> the entire U-Boot image. It keeps U-Boot's code, malloc pool, stack,
> >>>>> bss, etc all in the same general area which is nice, and has the side
> >>>>> benefit that the bootpg won't be overwritten.
> >>>>>
> >>>>>
> >>>> OK, if you think so...
> >>>>
> >>>>
> >>>>
> >>>>> I know ORing in 0x10 is a bit ugly, but what's the real downside of
> >>>>> doing it?
> >>>>>
> >>>>>
> >>>> Nothing. I just hate to allocate the bss at 0x0, because this is
> >>>> actually incorrect - it's the result of an address overflow /
> >>>> truncation, and pretty much misleading to someone trying to read and
> >>>> understand the code. For the linked image, it does not _look_ as if
> >>>> the bss was located _after_ the U-Boot image, it looks detached and
> >>>> allocated in low RAM.
> >>>>
> >>>>
> >>> Do you have a preference Kumar? You're probably going to be the first
> >>> in line to have to deal with any resulting confusion:)
> >>>
> >>> I personally would rank the options:
> >>> 1. OR in an offset to the bss address and leave some good comments in
> >>> the linker script and commit message
> >>>
> >>> 2. Make the bss the last section like other PPC boards which would
> >>> result in the bootpg sometimes being overwritten
> >>>
> >>> 3. Put the bss at an arbitrary address
> >>>
> >>>
> >> FWIW, I think an arbitrary address disjoint from the u-boot addresses is
> >> best. While u-boot is in ROM, you can't use the bss anyway. The bss will
> >> actually be located at an address selected by the u-boot code itself
> >> after memory is sized. All references to the bss will be re-located by
> >> subtracting the arbitrary start address and adding the run-time chosen
> >> start address. So the linked start address is not important, except that
> >> is cannot be NULL or it may confuse the relocation code that doesn't
> >> want to re-locate NULL pointers. Some of the confusion in this
> >> discussion probably stems from the fact that the linker scripts make the
> >> bss look like "part of u-boot", when it is really not. It is just a
> >> chunk of "zero'ed" ram, located anywhere the u-boot code decides to put
> >> it. An arbitrary strange address would make this more apparent.
> >>
> >
> > Hi Bill,
> > What's the advantage of having the bss not be located next to U-Boot?
> > The big disadvantage of picking an arbitrary address for the bss is that
> > there's now 1 more magical section of SDRAM that the user needs to know
> > shouldn't be used. I already field enough question from people that
> > corrupt their exception vectors or stack/malloc pool/u-boot code, I
> > don't want to add more bss questions:)
> >
> Hi Peter,
> The point is that the address chosen for the ld step is NOT the
> address in ram where the bss will reside anyway. This address can
> overlap the exception vectors, stack, or even the u-boot code itself and
> it wouldn't matter (other than possible confusion). The actual physical
> address where the bss and u-boot itself resides is COMPUTED by u-boot
> after it sizes memory. u-boot only needs to know how big the section is
> in order to allow enough room. All references to the bss will then be
> re-located correctly. Where the bss actually ends up is a function of
> u-boot code. It may be on some processors that the computation of bss
> start is done assuming the bss is adjacent to u-boot in the original
> memory map, but if so, it is an un-necessary restriction. All that is
> required is a "safe" chunk of ram, which is also what is needed for
> stack and malloc area and should be chosen in a similar manner. So at
> run time, bss probably ends up adjacent to u-boot in ram because that's
> how it was coded, but at ld time it shouldn't matter.
Hi Bill,
I understand that the final addresses in RAM of all the sections are
calculated by U-Boot during relocation based on memory size. However,
the section addresses are the same relative to each other at link time
as well as after relocation. Eg before relocation I print out:
(408) &_start = fff80000
(409) &__bss_start = (null)
(410) &_end = 00008184
Now running in RAM - U-Boot at: 7ff70000 (After relocation)
(665) &_start = 7ff70000
(666) &__bss_start = 7fff0000
(667) &_end = 7fff8184
The values all changed and are dependent on RAM size, but their
relationship to one another didn't - they all just increased by
0x7fff0000. So practically speaking, we do need to know where the bss
is at link time - its address is not dynamic like the malloc pool or
stack - its tied directly to the address of the other sections at link
time. (Unless we added some bss-specific fixups I imagine)
Am I missing something? Is there an example that would make things
clearer?
Best,
Peter
More information about the U-Boot
mailing list