svn commit: r235267 - in head/usr.bin/sort: . nls

John Baldwin jhb at FreeBSD.org
Sun May 13 03:28:01 UTC 2012


On 5/11/12 1:17 PM, Bruce Evans wrote:
> However, they may be some some boot programs that save space by not
> bzeroing the bss.  Not being a C program in this respect apparently
> caused the following farcal churn in i386/boot2:
> - the opts variable started with a bogus explicit initialization
>   to 0.  Long ago (in 2003), but probably after the default of
>   -fzero-initialized-in-bss turned this into just a style bug,
>   the explicit initializaton was removed.
> - zeroing of the bss was moved from i386/boot2/boot1.s ro rbx in 2004.
>   It hopefully still worked.
> - in 2011, the kname variable was changed from char [1024] to a
>   pointer.  The pointer was explicitly initialized to NULL.  This
>   was not just a style bug, since the bss was apparently no
>   longer zeroed.
> - initialization of the opts variable was apparently broken in the
>   same way some time before this (whenever the zeroing was optimized
>   away).
> - in the next commit in 2011, it was claimed that the BSS is not
>   zeroed, and the initialization of kname was moved into main()
>   to fix this.  bss was spelled BSS, so my greps didn't find this
>   immediately.
> - in a later commit in 2012, the initialization of opts was moved into
>   main(), presumably for the same reason, but neither bss nor BSS was
>   mentioned in the commit log, so this took longer to find.
> - these changes broke at least kname.  Apparently, it can be initialized
>   to non-null before main() in some cases.  This was fixed in the most
>   recent commit to boot2.c, in 2012, by moving the initialization of
>   kname out of main().  opts was moved similary.  The commit message
>   doesn't mention bss or BSS, and says that this is to make clange
>   build again.  But boot2 is compiled without -fzero-initialized-in-bss,
>   so initializing kname and opts outside of main() has no effect.  They
>   are now uninitialized again, assuming that the 2011 commit message is
>   correct.  Even the old char array for kname probably needed kname[0]
>   to be zero.  We apparently depend on most memory being 0 when booting,
>   so that the chance of it being nonzero for these 2 variables is tiny.
> 
> kname and opts are the only 2 global variables in i386/boot2 that need
> to be initialized to 0 in some way (the others either need to be
> initialized to non-0, so they never get put in the bss, or their initial
> value doesn't matter.  After reducing kname to a pointer, these variables
> have total size 8.  Perhaps the zeroing code would now take more than 8
> bytes.  However, in the 2004 version when the zeroing code was in boot1.S,
> it size seems to be 6 or 7 bytes (the code for this is smart).  Thus the
> savings might be negative, but they are more likely to be a whole 4-8
> bytes.  There may be safer ways to save space.

So I finally figured this out recently while looking at avg@'s recent
patches.  boot2's BSS is in fact zero'd by
sys/boot/i386/btx/lib/btxcsu.S.  This same code also zero's the BSS of
/boot/loader.  I have a patch to revert boot2 back to depending on the
zero'd BSS in a tree, just need to commit it.

-- 
John Baldwin


More information about the svn-src-all mailing list