ご存知のように、X86 アーキテクチャの場合: 電源ボタンを押すと、マシンは 0xFFFFFFF0 でコードの実行を開始し、ハードウェアの初期化を行うために BIOS でコードの実行を開始します。BIOS の実行後、ブートローダーを使用して OS イメージをメモリにロードします。最後に、OS コードの実行が開始されます。ARM アーキテクチャの場合、電源ボタンを押した後の起動プロセスは何ですか? ありがとう!
3 に答える
現在、ARM アーキテクチャには 2 つの例外モデルがあります (リセットは一種の例外と見なされます)。
以前の Cortex チップと現在の Cortex-A/R チップで使用されるクラシック モデル。その中で、0 のメモリにはいくつかの例外ハンドラが含まれています。
Offset Handler
===============
00 Reset
04 Undefined Instruction
08 Supervisor Call (SVC)
0C Prefetch Abort
10 Data Abort
14 (Reserved)
18 Interrupt (IRQ)
1C Fast Interrupt (FIQ)
例外が発生すると、プロセッサは特定のオフセットから実行を開始するだけなので、通常、このテーブルにはコード内の完全なハンドラへの単一命令分岐が含まれます。典型的な従来のベクター テーブルは次のようになります。
00000000 LDR PC, =Reset
00000004 LDR PC, =Undef
00000008 LDR PC, =SVC
0000000C LDR PC, =PrefAbort
00000010 LDR PC, =DataAbort
00000014 NOP
00000018 LDR PC, =IRQ
0000001C LDR PC, =FIQ
実行時に、ベクタ テーブルを 0xFFFF0000 に再配置できます。これは、多くの場合、最速の例外処理のために密結合メモリ範囲として実装されます。ただし、通常、パワーオン リセットは 0x00000000 から始まります (ただし、一部のチップでは、プロセッサ ピンによって 0xFFFF0000 に設定できます)。
新しいマイクロコントローラ モデルは、Cortex-M チップ ラインで使用されます。そこでは、0 のベクトル テーブルは、実際にはベクトル (ポインター) のテーブルであり、命令ではありません。最初のエントリには SP レジスタのスタートアップ値が含まれ、2 番目のエントリはリセット ベクターです。これにより、プロセッサがスタックを設定するため、リセット ハンドラを C で直接記述できます。ここでも、テーブルは実行時に再配置できます。Cortex-M の典型的なベクトル テーブルは次のように始まります。
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
[...more vectors...]
OMAP3 や Apple の A4 などの最新の複雑なチップでは、通常、最初に実行されるコードはユーザー コードではなく、オンチップのブート ROM であることに注意してください。さまざまな条件をチェックして、ユーザー コードをどこからロードするか、ロードするかどうかを決定する場合があります (たとえば、有効なデジタル署名が必要になる場合があります)。このような場合、ユーザー コードはさまざまな起動規則に準拠する必要があります。