2010-11-23 5 views
2

私はカーネルイメージを2つの部分に分割するカスタムリンカースクリプトを使用しています。最初のコードとデータは通常のコードで、もう1つは初期化コードと不要になったときに破棄するデータです。初期化部分は、カーネルが正しく動作するようにアドレス空間間でも共有されないので、fork()にまだ何かがコピーされています(これは開発の初期段階です)。非.bss非初期化データセクション

は私が起動中に使用する小型のカーネルスタックを割り当てられているが、私は何を見ることができますから、私は、それが初期化領域にまたはアドレス空間の間で共有されます.bssセクションにいずれかを置くことができます初期化されていないデータとして保存することはできません。初期化されていないデータとしてイメージのinit部分に格納して、各プロセスが独自のコピーを取得するようにしたいと思います。

私はこれを行う可能性のある2つの方法を考えることができますが、可能かどうか、リンカーにどのように指示するかを知ることができませんでした。最初は非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) } 
} 

答えて

2

(ぐふっ、再び自分の質問に答える)CONTENTSせずに新しいセクションを作成

が作品を属性。このようにアセンブリで宣言されています:

.section .init.bss, "aw", @nobits 
関連する問題