6

C と ARM で自己修正コードを書こうとしています。以前、MIPS について同様の質問をしましたが、現在、プロジェクトを ARM に移植しようとしています。
私のシステム:=ラズベリーパイ、ARMv6、GCCのラズビアン

私が確信していないことがいくつかあります:

  • ARM は D キャッシュのライトバック/I キャッシュの無効化 (キャッシュ フラッシュ) を必要としますか? もしそうなら、どうすればこれを行うことができますか?

また、私は例を試しました

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

int inc(int x){ //increments x
    uint16_t *ret = malloc(2 * sizeof(uint16_t));

    *(ret + 0) = 0x3001; //add r0 1 := r0 += 1
    *(ret + 1) = 0x4770; //bx lr    := jump back to inc()

    int(*f)(int) = (int (*)(int)) ret;
    return (*f)(x);
}

int main(){
    printf("%d",inc(6)); //expect '7' to be printed
exit(0);}

しかし、セグメンテーション違反が発生し続けます。私はaapcs呼び出し規約を使用しています.これは、すべてのARMのデフォルトであることを理解するために与えられました.

誰かが私を正しい方向に向けてくれたなら、私はとても感謝しています

おまけの質問 (つまり、実際に答える必要はありませんが、知っておくと便利です) - 私は「MIPS のバックグラウンドから来ました」。(値 0 にハードコードされたレジスタのように)

4

3 に答える 3

2

の読み取りキャッシュと自己変更コードblogs.arm.com。記事には、あなたが説明していることを行う例も含まれています。

記事から質問に答えるには

... ARM アーキテクチャは、多くの場合、変更されたハーバード アーキテクチャと見なされます。...

純粋なハーバード アーキテクチャの典型的な欠点は、データ メモリと同じアドレス空間から命令メモリに直接アクセスできないことですが、この制限は ARM には適用されません。ARM では命令をメモリに書き込むことができますが、D キャッシュと I キャッシュは一貫性がないため、新しく書き込まれた命令が I キャッシュの既存の内容によってマスクされ、プロセッサが古い (または無効な可能性があります) 命令。

キャッシュを無効にする方法については、 __clear_cacheを参照してください。

命令をメモリにプッシュすることを計画している場合は、ARM/Thumb 命令セットについても知っていることを願っています。

于 2013-04-05T07:13:17.043 に答える
1

いくつかの問題があります。

  1. D-キャッシュと I-キャッシュをフラッシュしないため、ほとんどの場合、I-キャッシュは L2 から古いデータをフェッチします。Linux では、これを行う libc/sys-call があります。__clear_cache(begin, end) または _ builtin _clear_cache(begin, end) を使用してください。
  2. Thumb-Code を出力しますが、コードがどのように呼び出されるかは気にしません。これを修正する最も簡単な方法は、いくつかの asm コードを使用して実際の blx 呼び出しを実行し、アドレスを 1 で OR することです。これは、このビットがプロセッサの実行モードを設定するためです。ワード境界、アームモードでサムコードを呼び出すようにします。
于 2013-04-04T21:29:11.770 に答える