首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非..bss未初始化数据部分

非..bss未初始化数据部分
EN

Stack Overflow用户
提问于 2010-11-23 21:38:13
回答 1查看 1.2K关注 0票数 3

我使用自定义链接器脚本将内核映像分成两部分。第一个是普通代码和数据,第二个是初始化代码和在不再需要时丢弃的数据。初始化部分也不会按照内核本身的方式在地址空间之间共享,因此,如果它还在(处于开发的早期阶段),那么任何东西都会被复制到fork()上。

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

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

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

代码语言:javascript
运行
复制
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) }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-24 23:12:54

(再次回答我自己的问题)

在不使用CONTENTS属性的情况下创建一个新节是可行的;它在程序集中声明如下:

代码语言:javascript
运行
复制
.section .init.bss, "aw", @nobits
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4261220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档