実験を行ったとき、前回のアセンブリフローランプ実験のように、ビンファイルをSDカードに焼き付けました。
Q:誰が実行するためにSDカードからこれらの指示を読んでいますか?
A:それはチップの内部ROMに固まっているコードです---それはiROMと呼ばれています。iROMは製造元がチップ上にプログラムしたもので、ソースコードはありません。
iROMはブートデバイスの特定の場所にあるプログラムをオンチップメモリ(iRAM)に読み込んで実行します。このプログラムが呼び出されて実行されます。このプログラムはBL1(Bootloader 1)と呼ばれ、BL1はSamsungによって提供されており、ソースコードは提供されていません。
BL1はブートデバイスの別の特定の場所にあるプログラムをオンチップメモリに読み込んで実行します。これはBL2(Bootloader 2)と呼ばれ、私たちが書いたソースコードです。
アセンブリフローライトプログラムでは、mkbl2ツールを使用してBL2を作成しましたが、同時に詳細な説明も行いました。次のコマンドを実行します。
./mkbl2 leds_on.bin bl2.bin 14336
< Br>
iROMとBL1のより詳細な起動プロセスを次の図に示します(Android_Exynos4412_iROM_Secure_Guide_Ver.1.00.00.pdfから抽出)。
(1)iROM:次の図はiROMの起動フローチャートです。iROM起動
上の図からわかるように、最初にウォッチドッグを閉じ、割り込みとMMUを閉じ、データキャッシュを閉じ、命令キャッシュを開き、TLBをクリアしてから、もう一方のコアをIDLEモードにします。最初のジャンプ分岐、IROMは、現在の起動モードを判断します。コールドスタートかウェイクアップかを判断します。アウェイクモードの場合は、直接BL1にジャンプします。BL1では、アウェイクモードかどうかを判断します。通常はLinuxカーネルのウェイクアップハンドルです。もちろん、ベアメタルではコールドスタートですが、一般的にスリープウェイクアップに注意を払う必要はありません。もちろん、ベアメタルプログラムがスリープウェイクアップをサポートする必要がある場合は、対応するコードを追加する必要があります。
解析を続行し、IRQモードとSVCモードのスタックスペースを設定するこの時点では、スタックアドレスは内部IRAM、この小さなRAMはIROMの外部ランダムアクセスメモリですが、この小さなメモリがないとIROMはできません。走っている。次のステップでは、IROMで使用されているさまざまな変数の初期化、読み取り専用データセグメントの初期化、未初期化データセグメントのクリア、およびコア関数のエクスポートを実行します。頻度、OMピン設定モードを取得します。ここではさまざまな周辺機器から起動できます。具体的な起動モードは次のとおりです。
OM select boot device
ベアメタルチュートリアル
は外部SDカードが起動され、OMブートモードに従って、最初の8KコードがSDカードからコピーされ、コピーが成功すると、チェックサムが検証され、BL1の最初の16バイトがIROMに提供されてBL1関連情報が識別されます。 (後者のチュートリアル
私たちはBL1を自分で書きます。最初にSamsungで利用可能になります):
/** bl1ヘッダ情報(irom用)** 0x0 - bl1サイズ* 0x4 - 予約済み0)* 0x8 - チェックサム* 0xc - 予約済み(0にする必要があります)* /。ワード0x2000.word 0x0.word 0x0.word 0x0
は、最初にBL1のサイズを記述し、次にBL1のチェックサムがあります。それで我々はどのように我々はBL1のチェックサムを知っていますか、これはコンパイラです最後のバイナリファイルの後、mk4412プログラムによって作成された
は、単にiROMがプログラム実行環境を最初に設定すること(ウォッチドッグのクローズ、割り込みのシャットダウン、MMUのクローズ、スタックの設定、スタックの設定、PLLの開始など)です。次に、OMピンに従ってブートデバイス(NANDフラッシュ/SDカード/その他)を特定し、BL1を内側からiRAMに読み取り、最後にBL1を起動します。
(2)BL1:次の図は、BL1の起動プロセスを示しています。
B1起動
簡単に言うと、プログラムの実行環境も設定しています(初期化割り込み、設定スタックなど)。 BL2をデバイスのiRAMに読み込み、最後に起動します。
解決する必要がある問題がいくつかあります。
1ブートデバイスのどこにBL1とBL2を格納できますか。
2BL1、BL2をiRAMに読み込む位置はどれですか。
3 BL1とBL2のサイズは?
4 BL1プログラムとBL2プログラムの整合性を確認する方法(つまり、プログラムの読み取り時にエラーは発生しません)。
以下に示すように、起動がSDカードであると仮定します(ここではSDカードのみが起動されます)。
SDカード上のBL1、BL2の保存場所
iRamのBL1、BL2の保存場所位置
BL1は、SDカードのオフセットアドレスの512バイトにあります(つまり、最初のセクタから開始して、1セクタあたり512バイト、先頭に1セクタが確保されています。クラスメートがDOSパーティションテーブルを研究したことがあるなら、真実を理解することができます最初のセクタはパーティションテーブルの構成領域であり、iROMはこの位置から8Kバイトのデータを読み取り、iRAMアドレスは0x02021400です。事務所で。そのため、BL1は8Kを超えることはできません。
IROMがチェックサムを計算し、パスの検証とBL1の復号化に成功すると、BL1にジャンプすることができますこの時点で、IROMは完全に実行され、権限はBL1に渡されます。起動時にのみ必要で、非暗号化モードの起動ではBL1の復号化は不要です。
BL2はSDカードのオフセットアドレス(512 + 8K)バイトにあり、BL1はこの場所から14Kバイトのデータを読み取り、iRAMアドレス0x02023400にあります。 BL2は(14K * 4)バイトより大きくてはならず、最後の4バイトは比較コードを記憶するために使用される(アセンブリフローランプテストにおいて、我々はBL2を作るためにmkbl2ツールを使用する。mkbl2ツールの主な機能はチェックコードを計算することである。 )
プログラムが(14K - 4)バイトよりも大きい場合、BL2を作成してSDカードオフセットアドレス(512 + 8K)ワードを書き込むために、前の(14K - 4)バイトを傍受する必要があります。祭りBL2は起動すると、SDカードの別の場所に保存されているプログラム全体をメモリに読み込みます。
1. 1.待ち行列のデータ構造 待ち行列は、要素がプロセス記述子へのポインタを含む二重リンクリストによって実装されています。各待機キューには待機キューヘッドがあります。これは、wait_queque_
はじめての基本的なネットワーク設定 1.最初にネットワークのmacアドレスを確認してください。 [root @ centos〜] #cat /etc/udev/rules.d/70-persiste
ここでは、Linuxのコマンドを使用してハードディスクの読み書き入力をテストする方法について説明します(サーバーのセットアップ時およびサーバーの購入時に使用します)。 。 メインコマンド ここで使用
コモンモード信号と差動モード信号の違いを理解することは、パルス磁気回路と動作モジュールの関係を理解する上で非常に重要です。トランス、コモンモードチョーク、およびオートトランスの終端は、ローカル