我正在使用自定义链接描述文件将内核映像拆分为两部分。第一个是普通代码和数据,第二个是初始化代码和不再需要时要丢弃的数据。初始化部分也不像内核本身那样在地址空间之间共享,所以如果它仍然存在(它处于开发的早期阶段),那么任何东西都会被复制到fork()上。
我已经分配了一个小内核堆栈以便在启动时使用,但从我所看到的情况来看,我只能将 放在.bss部分,它在地址空间之间共享或者在init区域中,它不能作为未初始化的数据存储。我想将它作为未初始化的数据存储在图像的init部分中,以便每个进程都有自己的副本。
我可以想到两种可能的方法来做到这一点,但我无法确定它们是否可能或我如何告诉链接器这样做。第一个是将非初始化区域放在非.bss部分,但我不确定是否可能 - 我认为你不能混合这样的部分。第二个是创建第二个类似.bss的部分,它只存储未初始化的数据,我可以将其放在链接描述文件的初始化中。
有什么想法吗?为了完整起见,这是我正在使用的链接器脚本:
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) }
}
答案 0 :(得分:3)
(呃,再回答我自己的问题)
创建没有CONTENTS属性的新部分;它在汇编中声明如下:
.section .init.bss, "aw", @nobits