質問
カスタムリンカースクリプトを使用して、カーネル画像を2つの部分に分割しています。 1つ目は通常のコードとデータであり、2つ目は、不要になったときに破棄される初期化コードとデータです。初期化の部分は、カーネルの適切な方法でアドレススペース間で共有されていないため、まだ周囲にある場合はFork()にコピーされます(これらの初期段階にあります)。
ブート中に使用する小さなカーネルスタックを割り当てましたが、私が見ることができるものから、私はそれを置くことができます また アドレススペース間で共有される.bssセクションで また 初期化されていないデータとして保存できないinit領域。各プロセスが独自のコピーを取得できるように、画像のinit部分に未知のデータとして保存したいと思います。
これを行うための2つの潜在的な方法を考えることができますが、それらが可能か、リンカーにそれらを行うように指示する方法を知ることができませんでした。 1つ目は、非初期化された領域を非INTSSセクションに配置することですが、それが可能であるかどうかはわかりません。そのようなセクションを混ぜることはできないと思います。 2つ目は、UnInitialized Dataのみを保存する2番目の.BSSのようなセクションを作成することです。これをリンカースクリプトの初期化PATに入れることができます。
何か案は?完全性のために、私が使用しているリンカースクリプトは次のとおりです。
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