2010-11-23 47 views
2

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

我已分配了一个小的内核堆栈,同时启动使用,但是从我所看到的,我只能把它要么在.bss段那里得到的地址空间之间在init区域共享它不能被存储为未初始化的数据。我想将它作为未初始化的数据存储在映像的init部分,以便每个进程都有自己的副本。

我可以想到两种可能的方法来做到这一点,但我一直无法确定它们是否可行,或者我会如何告诉链接器执行此操作。首先是将未初始化的区域放入非.bss段,但我不确定这是否可能 - 我认为您不能混合这样的部分。第二个是创建第二个.bss-like部分,它只存储未初始化的数据,我可以将其放入链接描述文件的初始化部分。

任何想法?为了完整起见,这里是我使用的链接脚本:

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) } 
} 

回答

2

(啊,再回答我的问题)

使没有属性的内容的作品一个新的部分;它在汇编中声明如下:

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