3

arm アーキテクチャでの Linux ブートの詳細を理解しようとしています。私はインターネットで多くの検索を行い、これまでのところいくつかの詳細を理解しましたが、記事を読むたびに他の多くの新しい用語がもたらされ、物事がより複雑になっていると感じています. Linux を実行しているボードが 2 つあります。olimex 9261 とビーグルボーン ブラックです。組み込みシステム、特にアームに関する私の専門知識はかなり優れていますが、Linux ではあまりプレイしませんでした (一部のユーザー空間プログラムとカーネルの char ドライバーを除く)。

ここに私の質問があります:

1 つのボードに次の uboot 出力があります (linux 2.6.30):

 bootargs=mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2
 bootcmd= cp.b 0xC0042000 0x22000000 0x00199954; bootm 0x22000000

ボードには 64MB の RAM (0x20000000 にマッピング)、512MB の nand フラッシュ (これまでマッピングが見つかりませんでした)、および 2MB のデータ フラッシュ (0xc0000000 にマッピング) があります。

ここで理解できないこと:

  • bootargs に mem=64 があるのはなぜですか? これは ATAG または DTB として与えられるべきではありませんか?
  • コントロールをカーネルに渡すときに、引数としてコンソールが渡されるのはなぜですか? tty を使用するカーネルは、uboot によって既に構成されていますか?
  • initrd と rootfs。これはまだ私にははっきりしていません。initrd は、カーネルにブロック デバイスとして、または uboot がアドレスの詳細をカーネルに渡さなければならない別のイメージとして含めることができることを知っています (本当ですか?)。initrd が含まれていないカーネルと、この jffs2 のような別のファイル システムを使用して、カーネルが残りのドライバーを実行することはできますか? 実際、起動時にカーネルが使用するファイル システムの詳細を完全に理解することはできません。私が持っているこのセットアップには、uImage、bootstrap、env.bin、および jffs2 ファイル システムの 4 つのファイルがあります。したがって、initrd はありません。これはどのように機能していますか?また、上記の bootargs で指定されたファイル システムをルート化するプロセスはどのようになっていますか? 私の理解では、カーネルは最初に jffs2 ファイル システムにアクセスし、次に /dev/mtdblock1 にあるイメージを取得してマウントする必要があります。私の理解が間違っているのかもしれません。実際、カーネルとファイル システムの間のこの相互作用は、私が理解していないようです。上記の bootcmd では、カーネルが nand から sdram にコピーされ、bootm がそれにジャンプします。しかし、カーネルは起動時にどのように jffs を見つけるのでしょうか? ブート中に次の出力行が表示されます: VFS: Mounted root (jffs2 filesystem) on device 31:1.

ボードのユーザーガイドで、私はこれを見つけました:

警告: AT91SAM9261 チップ エラッタにより、NAND フラッシュからの起動はサポートされていません。

...

512MB NAND フラッシュ (Linux ではシリコン ドライブと見なされます)。

  • カーネルをコンパイルした後、System.map にすべてのシンボルが含まれていないことがわかりました。vmlinux を確認しましたが、同じです。誰かが理由を知っていますか?コンパイラが適切に構成されていない可能性がありますか?

どうもありがとう、ダニエル。

4

2 に答える 2