代码之家  ›  专栏  ›  技术社区  ›  rpjohnst

非.bss未初始化数据节

  •  3
  • rpjohnst  · 技术社区  · 15 年前

    我正在使用自定义链接器脚本将内核映像拆分为两部分。第一个是正常的代码和数据,第二个是初始化代码和不再需要时要丢弃的数据。初始化部分也不会像内核那样在地址空间之间共享,所以如果fork()仍然存在,那么任何内容都会被复制到fork()上(它处于开发的早期阶段)。

    我已经分配了一个小的内核堆栈来在引导时使用,但是从我所看到的来看,我只能把它放在 任何一个 在.bss部分,它在地址空间之间共享 在不能作为未初始化数据存储的初始化区域中。我想将它存储在映像的初始部分,作为未初始化的数据,以便每个进程都获得自己的副本。

    我可以想出两种可能的方法来做这个,但是我还没有弄清楚它们是否可行,或者我如何告诉链接器去做它们。第一种方法是将未初始化的区域放在非.bss节中,但我不确定这是可能的-我认为您不能混合这样的节。第二种方法是创建第二个.bss类的节,该节只存储未初始化的数据,我可以将其放入链接器脚本的初始化pat中。

    有什么想法吗?为了完整起见,下面是我使用的链接器脚本:

    ENTRY(_start)
    
    _kernel_offset = _start_kernel - _start_kernel_phys;
    
    SECTIONS {
        _start_init = 0x100000;
    
        .init _start_init : AT(ADDR(.init)) { *(.mboot .init*) }
        .ctors : {
            __CTOR_NUM__ = .; LONG((__CTOR_END__ - __CTOR_LIST__) / 4)
            __CTOR_LIST__ = .; *(.ctors*)
            __CTOR_END__ = .;
        }
    
        _end_init = .;
    
        . = ALIGN(4M);
        _start_kernel_phys = .;
        _start_kernel = 0xF0000000;
    
        .text _start_kernel : AT(ADDR(.text) - _kernel_offset) { *(.text*) }
        .data ALIGN(4K) : AT(ADDR(.data) - _kernel_offset) { *(.rodata* .data*) }
        .bss ALIGN(4K) : AT(ADDR(.bss) - _kernel_offset) { *(.bss) *(COMMON) }
    
        _end_kernel = .;
        _end_kernel_phys = _end_kernel - _kernel_offset;
    
        /DISCARD/ : { *(.eh_frame .comment) }
    }
    
    1 回复  |  直到 15 年前
        1
  •  3
  •   rpjohnst    15 年前

    .section .init.bss, "aw", @nobits