2017-11-16 7 views
6

仮想メモリの最後に特別なセクションを持つプログラムを作成したいと思います。だから私は、リンカスクリプトをやってみたかった、このような何か:明示的にリンカースクリプトで開始スタックポインタを設定します

/* ... */ 
.section_x 0xffff0000 : { 
    _start_section_x = .; 
    . = . + 0xffff; 
    _end_section_x = .; 
} 

問題は、GCC/LD/glibcのことが知られているが重なった場合でも、32ビットアプリケーションのために、デフォルトでこの場所にスタックをロードするように見えるということですセクション。上記のコードゼロは、例外を引き起こしてスタックから抜け出しています。スタックに別のVMメモリの場所を使用するようにリンカに指示する方法はありますか? (同様に、ヒープが仮想メモリのこのセクションにまたがっていないことを保証したい...)。

+0

ターゲットに関する詳細情報を入力する必要があります。最初のレジスタの内容(スタック位置を決定する)はターゲットに依存します。 –

+0

これはarm-8システム(32ビットモードでコンパイル)です。私はgcc 4.7.0ツールチェーンを持つLinux 3.10カーネルを使用しています。 – HardcoreHenry

答えて

1

質問が間違っていると思われる回答は嫌いですが、64kセグメントが必要な場合は、起動時に割り当てることができないのはなぜですか?

なぜあなたのプロセスアドレス空間内に固定アドレスが必要なのでしょうか?私は30年近くさまざまな種類のコーディングを行ってきましたが、保護されたメモリの出現以来、固定アドレスの必要性は見ていませんでした。

+0

残念ながら、質問は間違っていません。私は既存のシステムを変更して、ポインタ内のさまざまなビットに特別な意味を割り当てることができます。したがって、特別な目的のために0xffff0000アドレス範囲を予約する必要があります。 – HardcoreHenry

+0

@HardcoreHenryこのシステムを作った人は誰でも "エレガントな"と表現していると思いますが、あなたを含めた世界の99%がこれを悪とみなしていると思います。つまり、なぜこれらの愚かなポインタは有効なアドレスに解決する必要がありますか?固定メモリアドレスを必要とせずに、抽象化のレイヤーによって追加機能を提供することはできませんか?彼らは、これらのビットが設定された構造体を指し示すことができます。またはポインタの逆参照は、ルックアサイドを行う方法を知っているルーチンによって行うことができますか? –

関連する問題