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