1

QEMU を使用して ARM11 CPU をシミュレートしています。

私のプログラムは複雑すぎてここで説明できないので、問題をより単純なプログラムに投影します。したがって、私のプログラムには2つのcファイルが含まれています:

  • main.c
  • some_code.c

some_code.c を (some_code.o に) コンパイルしてから、some_code.c のコードを表す HEX 配列変数に変換します。

現在、両方のオブジェクト ファイル (main.o と some_code.o) をリンクしています。この変数 (HEX 配列変数) は、DATA セグメントにあります。

今、main.c のコードから HEX 配列変数を呼び出しています (私の意図は、この時点で some_code.c のコードが実行を開始することです)。プログラム カウンター (PC) が HEX 配列変数に到達すると、例外が発生します (例外の詳細はわかりません)。

この HEX 配列変数を DATA セクションから CODE セクションにコピーすると、PC がこの行に到達すると、例外なく正常にステップ実行できるようになります。

だから私の質問は:

  • QEMU には DATA セクションからのコマンドの実行に制限がありますか?
  • もしそうなら、どうすればこの制限を無効にできますか?

よろしくお願いします。

オムリ

4

2 に答える 2

1

リンカーとオペレーティング システムの組み合わせになります。リンカーがデータ セクションを「データ」としてマークし、ローダーがデータを格納するための実行権限のないメモリ領域を作成する可能性があります。これは、QEMU 自体ではなく、QEMU がエミュレートしているハードウェアの機能です。つまり、これを実際のマシンで実行すると、同じ問題が発生します。

データ セクションを実行可能に変更することは可能ですが、詳細は実行している OS と使用しているコンパイラ ツールチェーンによって異なります。JIT コンパイラーを備えたインタープリターは、同様のことを行う必要があります。

一般に、データ セクションを実行可能にすることは、あらゆる種類のセキュリティ エクスプロイトにつながる可能性があるため、悪い習慣と見なされていることに注意してください。

于 2015-09-10T11:44:09.160 に答える
1

あなたの説明を正しく理解していれば、QEMU の制限ではなく、エミュレートしている CPU の制限に直面しています。QEMU はデータ セクションとコード セクションについて何も知りませんが、QEMU で実行するオペレーティング システムは知っています。

ほとんどの OS は、コード セクションとデータ セクションを異なるパーミッションで設定します。通常、コードは読み取りと実行が可能ですが、書き込みはできません。読み取り専用データは読み取り可能ですが、実行可能または書き込み可能ではありません。変更可能なデータは、読み取りと書き込みは可能ですが、実行はできません。

CPU は、MMU 記述子のフラグを使用して、読み取り、書き込み、および実行のアクセス許可を適用します。ARM では、実行許可は、ARMv6 以降に存在するページ記述子の XN ビットによって制御されます。

実行可能なデータ (ジャストインタイム コンパイラや動的コード読み込みメカニズムなど) が必要な場合は、メモリを実行可能にするようオペレーティング システムに指示する方法を理解する必要があります。

于 2015-09-10T12:05:59.597 に答える