カスタムリンカースクリプトを使用して、カーネルイメージを2つの部分に分割しています。1つは通常のコードとデータで、もう1つは初期化コードとデータで、不要になったときに破棄されます。初期化部分もカーネル自体のようにアドレス空間間で共有されないため、fork()がまだ存在する場合(開発のこれらの初期段階にある場合)、そこにあるものはすべてfork()にコピーされます。
起動時に使用する小さなカーネルスタックを割り当てましたが、私が見ることができることから、アドレス空間間で共有される.bssセクション、またはとして保存できないinit領域のいずれかにしか配置できません。初期化されていないデータ。各プロセスが独自のコピーを取得できるように、初期化されていないデータとしてイメージのinit部分に保存したいと思います。
これを行うには2つの方法が考えられますが、それらが可能かどうか、またはリンカーにそれらを行うように指示する方法を見つけることができませんでした。1つ目は、初期化されていない領域を.bss以外のセクションに配置することですが、それが可能かどうかはわかりません。そのようなセクションを混在させることはできないと思います。2つ目は、初期化されていないデータのみを格納する2番目の.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) }
}