Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> 組み込みシステムの起動について(すべて共有)

組み込みシステムの起動について(すべて共有)

  

組み込みLinuxの起動は、システム起動とLinux起動の2つの部分に分けられます。システムを起動すると、CPUと関連するIOデバイスが完成し、Linuxがメモリにロードされる前にLinuxがメモリにロードされます。システム起動は主にBootLoaderによって実装されます。 BootLoaderがLinuxカーネルをメモリにロードした後、電源をLinuxKernelに渡し、Linuxブートセクションに入ります。以下は、起動プロセスと使用されるファイルの詳細な分析です。

まず、システムの起動とBootLoaderBootLoaderは、組み込みシステムの違いにより、PCとは大きく異なりますが、ここではHyper250(Inter Xscale GDPXA250)の起動を例として取り上げます。 BIOSドライバボードがないので、EnbeddedOSはすべてのハードウェアを完了し、ハードウェアの初期化を完了するためにブートローダによって駆動されなければなりません。すべての初期設定ファイルはhyper250 /Bootloaderディレクトリにあります。まず、ブートのコンポーネントを分析します。hyper250 /Bootloader /X-Hyper250R1.1-Boot /src /start_xscale.Sファイルには、2つのライブラリファイルが含まれています。 Hhyper250 /Bootloader /X-Hyper250R1.1-Boot /src /include /start_xscale.hファイルconfig.hは主にシステムの各ハードウェアのマクロ定義と設定を完了し、xscale.hは主にシステムチップとシステム動作の設定を完了します。

config.hファイルの次の分析:(1)ストレージバスデバイスのマクロ定義:フラッシュのサイズ、ワード長などの情報を定義し、SRAMのベースアドレス、サイズ、ブロックサイズを定義します。 (2)ダイナミックメモリ設定:DRAMのサイズとベースア​​ドレスを定義します。 (3)パッケージ情報:パッケージ名、バージョン番号。 (4)BOOT LOADERの位置(DRAMとSRAMの最大値、DRAMのロード位置、スタックのベースアドレス)を設定します。 (5)カーネルの位置を設定します。DRAMとSRAMのベースアドレス、KERNELの最大値、およびKERNELのブロック数です。 (6)ファイルシステムの場所を設定します。DRAMとSRAMのベースディレクトリ、ファイルシステムの最大値、ファイルシステム内のブロック数です。 (7)LOADERプログラムの設定:LOADERプログラムのスタティックメモリベースアドレス、LOADERプログラムの最大値、およびブロック数。 (8)ネットワーク設定次の分析starts_xcalse.hファイル:(1)メモリベースアドレス(A0000000)を定義します。(2)オフセットベースアドレス(40D00000)を定義し、割り込み保護スタックのオフセット(3)クロック管理ベースアドレスを定義します。 41300000)およびレジスタオフセットとその初期値(4)はGPIOインタフェースのレジスタベースアドレス(40E00000)を定義し、各レジスタのオフセット(5)はGPIOインタフェースの各レジスタの初期値を定義します(6)はメモリ制御レジスタベースアドレス(48000000)を定義しますそして、各レジスタのオフセット(7)は、メモリ制御レジスタ(8)の初期値を定義し、電力管理レジスタ(9)のパラメータは、FFUARTレジスタ(40100000)のベースアドレスを定義し、各レジスタ(10)のオフセットは、各FFUARTを定義する。レジスタの初期値はstart_xcalse.Sファイルで解析されます。(1)割り込みベースアドレスの設定(40D00000)、割り込み保護スタックの初期化の完了、(2)GPIOインターフェイスの初期化、(3)メモリのSDRAMの初期化、(4)ブートローダのフラッシュへのコピーSDRAM(5)でLinuxカーネルイメージをロードし、Flash(000C 0000)からSDRAM(A0008000)にカーネルをロードします(6)start_xcalseの上でmain.cのメイン関数c_main()を呼び出すように保護スタック(7)を設定します。 Sは、APCSプログラミング標準によって書かれたアセンブリファイルを介してシステム関連のハードウェアを初期化します。そしてBootLoaderのロードとLinuxカーネルのロードを完了し、最後にmain.cに電源を移しました。以下はmain.cファイルを分析します:hyper250 /Bootloader /X-Hyper250R1.1-Boot /src /main.cと2つのライブラリファイルhyper250 /Bootloader /X-Hyper250R1.1-Boot /src /include /main.hhyper250 /ブートローダ/X-Hyper250R1.1-Boot /src /include /scc.h#2

2番目に、Linuxのブートプロセス分析

1.ファイル分析:arch /arm /boot /の分析圧縮ディレクトリ内のファイルを使用する場合、カーネルはこのディレクトリ内に生成されるため、Makefileの分析は非常に重要です。ここでの主な仕事はカーネルの圧縮と解凍です。このディレクトリは、コンパイル後にvmlinux、head.o、misc.o、head-xscale.o、およびpiggy.oファイルを生成します。その中でvmlinuxは圧縮されていないカーネルです。 Head.oはカーネルのヘッ​​ダファイルで、初期設定を担当します。 Misc.oはhead.o以降のカーネルの解凍を主に担当します。 head-xscale.oファイルは主にXscaleの初期化用であり、リンク時にhead.oとマージされます。 Piggy.oは中間ファイルです。これは実際には圧縮されたカーネルですが、初期化ファイルと抽出ファイルへのリンクはありません。 2.解凍分析:BootLoaderがシステムの起動を完了し、Linuxカーネルをメモリに呼び出した後、bootLinux()を呼び出します。これにより、カーネルの先頭にジャンプします。カーネルが圧縮されていない場合は起動できます。カーネルが圧縮されている場合は、解凍されます。圧縮されたカーネルヘッダーに解凍プログラムがあります。圧縮カーネルエントリの最初のファイルソースの場所は、arch /arm /boot /compressed /head.Sです。 arch /arm /boot /compressed /misc.cファイルにある関数decompress_kernel()を呼び出し、decompress_kernel()はproc_decomp_setup()、arch_decomp_setup()を呼び出し、次に「Uncompressing Linux」というメッセージを出力します。 ... and' gunzip()を呼び出した後。指定された場所にカーネルを置きます。最初に実行されるファイルは以下のとおりです。arch /arm /boot /compressed /head.Sarch /arm /boot /compressed /head-xscale.Sarch /arm /boot /compressed /misc.cこれらのファイルは主にカーネルの解凍と起動に使用されます。カーネルイメージカーネルが起動されると、これらのファイルによって占有されていたメモリ空間は解放されます。さらに、リセットによってシステムが再起動されると、BootLoaderが圧縮カーネルをメモリに入れたときに、最初にコードを実行する必要があります。以下のhead.Sファイルの解析は次のとおりです。(1)さまざまなArm CPUのDEBUG出力設定について、マクロを使用して操作を統一します。 (2)カーネルの開始アドレスと終了アドレスを設定し、アーキテクチャIDを保存します。 (3)CPUがARM2以上で使用されており、通常のユーザーモードが使用されている場合、スーパーユーザーモードにアップグレードされてからオフになります。 (4)LC0構造のデルタオフセットを分析して、カーネルアドレスをリロードする必要があるかどうかを判断します(r0はオフセットを格納し、r0がゼロかどうかを判断します)。ここでカーネルアドレスをリロードする必要があるかどうか、私は主にvmlinuxを見るために3つのファイルでarch /arm /boot /Makefile、arch /arm /boot /compressed /Makefileとarch /arm /boot /compressed /vmlinux.lds.inを分析することを考えました.lds.inリンクファイルのメインセクションの場所、LOAD_ADDR(_load_addr)= 0xA0008000、およびTEXT_START(_text、_start)の位置は、0に設定されるだけです。BSS_START(__ bss_start)= ALIGN(4)。この結果は、カーネルの解凍方法、つまりカーネルがメモリ(RAM)またはFLASHのどちらで解凍されるかによって異なります。ここでは、BOOTLOADERが圧縮カーネル(zImage)をRAM 0xA0008000に移動するためです。位置、圧縮カーネルは0xA0008000アドレスから始まるメモリ(RAM)に配置されているため、r0はオフセットアドレス(0xA0008000)を取得します。次のステップは、カーネルイメージの相対アドレスをメモリの物理アドレス、つまりオーバーロードされたカーネルアドレスに変換することです。

Copyright © Windowsの知識 All Rights Reserved