Memset the BSS explicitly
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 25 Nov 2015 17:05:40 +0000 (12:05 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Nov 2015 21:05:31 +0000 (16:05 -0500)
Previously, we were assuming that everything from the end of .data to the
end of the kernel image was .bss.  That is definitely not the case, which
becomes apparent if you try to add an attribute for another section and
then you wonder why said section is zeroed at runtime (but not in the
object!).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/riscv/kernel.ld
kern/arch/x86/kernel64.ld
kern/src/init.c

index 126b8bf..c2c9205 100644 (file)
@@ -53,8 +53,10 @@ SECTIONS
        PROVIDE(edata = .);
 
        .bss : {
+               PROVIDE(__start_bss = .);
                *(.bss)
                *(.sbss)
+               PROVIDE(__stop_bss = .);
        }
 
        PROVIDE(end = .);
index 0656297..f37a095 100644 (file)
@@ -56,8 +56,10 @@ SECTIONS
        PROVIDE(edata = .);
 
        .bss : {
+               PROVIDE(__start_bss = .);
                *(.bss)
                *(COMMON)
+               PROVIDE(__stop_bss = .);
        }
 
        PROVIDE(end = .);
index 67502c6..5b2e9d2 100644 (file)
@@ -119,9 +119,9 @@ static void extract_multiboot_cmdline(struct multiboot_info *mbi)
 
 void kernel_init(multiboot_info_t *mboot_info)
 {
-       extern char edata[], end[];
+       extern char __start_bss[], __stop_bss[];
 
-       memset(edata, 0, end - edata);
+       memset(__start_bss, 0, __stop_bss - __start_bss);
        /* mboot_info is a physical address.  while some arches currently have the
         * lower memory mapped, everyone should have it mapped at kernbase by now.
         * also, it might be in 'free' memory, so once we start dynamically using