题
我使用的一个自定义的链接脚本到内核图像分割成两个部分。第一个是正常的代码和数据,以及第二个是初始化的代码和数据时,它的不再需要被丢弃。初始化部分也没有地址空间之间共享的核心是正确的方式,因此任何有大干快上叉(),如果它仍然是围绕复制(这是在发展的早期阶段)。
我已分配了一个小的内核堆栈启动时使用,但是从我所看到的,我只能把它的或者的在.bss段那里得到的地址空间之间共享的或在它不能被存储为未初始化数据初始化区域。我想将其存储在该图像作为未初始化的数据,使得每个过程获得其自己的副本的初始化的一部分。
我能想到的做这两种可能的方式,但我一直没能找出他们是否是可能的,或者我怎么会告诉链接做这些。第一是把未初始化的地区,在非.bss段,但我不知道这是possible-我不认为你可以混合像部分。第二是创建一个第二的.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) }
}
解决方案
(啊,再回答我的问题)
制作没有内容属性作品一个新的部分;它被声明在组装这样的:
.section .init.bss, "aw", @nobits
不隶属于 StackOverflow