私はARMを初めて使用し、ARMに基づいてプラットフォームのメモリマップを検出する方法を見つけています。以前はx86でほとんど作業していなかったので、BIOS呼び出しを使用してメモリマップを見つけることができました。
BIOS は ARM にありませんが、同じ方法で ARM を実行できます。
メモリマップを見つけるためにARMに存在する命令はありますか??
ARM CPU ガイドのメモリ マップを見つける方法:
またはショートカットとして: プラットフォーム ベンダーがコードをコンパイルするためのツールチェーンを提供している場合は、ダミー プロジェクトを作成し、リンカー ファイルでメモリ レイアウトを探します...
次の情報を収集します。
ARM システム用の BIOS や EFI ほどユビキタスなインターフェイスはありませんが、Microsoft は Windows を実行するシステム用に UEFI を指定しています。
Linux ブート インターフェイスは最も一般的なインターフェイスです。カーネル ソースとヘッダー ファイルの Documentation/arm/Booting を参照してください。
異なる Arm デバイス間で移植可能なプログラムを作成する場合は、自分でメモリを検出する必要があります。私は特に ARM が得意ではありませんが、一般的な原則があります。単純にアドレス空間全体をスキャンし、数値を書き込んでから読み取ることでメモリを調べることができます。通常、このような 2 つの操作には、時折の間違いを排除するために異なる番号が付けられます。
1. write 0aah
2. read and check for 0aah
3. write 055h
4. read and check for 055h
注 1: 速度を向上させるために、すべてのバイトをチェックする必要はありません。自然な粒度を使用して、ページの開始時にのみチェックする必要があります (このプラットフォームのサイズに関係なく)。
最後に、RAM メモリのマップが表示されます。ただし、ROM メモリを検出するのはそれほど簡単ではなく、一般的な解決策はありません。
注 2: アーキテクチャによっては (まあ、私は ARM の専門家ではないと言いました)、CPU のメモリ保護メカニズム (存在する場合) に従って、プログラムはメモリ全体にアクセスできる必要があります。
注 3: このアプローチで唯一考えられる問題は、メモリ マップド IO です。それに触れると、予期しない方法で IO デバイスに影響を与える可能性があります。そのため、アドレス指定空間のどの領域がメモリ マップト IO に使用されているかを知っておく必要があり、それをまったくテストしないでください。