私はGNU / Linuxオペレーティングシステムを実行するハードウェアプロジェクトを作成していますが、質問があります。 (編集:ARMベース)
Linuxカーネルは、どのタイプのハードウェアがCPUに接続されているかを正確に知ることができますか?つまり、これがRAMなのかドライブなのかなどをどうやって知ることができますか?
特に、ネットワークインターフェイスの場合、システムに複数のイーサネットネットワークカードと複数のWiFiトランシーバがある場合、どちらが何であるか、ハードウェアでどのように接続されているかを知ることができます(おそらくMUX、I2C、SPIで接続されている可能性があります)。 ..など)。
答え1
これらすべての非常に低いレベルの作業はもちろん、次のことに依存します。建築学。
最も一般的なもの(x86 / IBM PC)の場合、BIOSは良いブートに非常に役立ちます。このメッセージを受信すると、ブートログを確認するとBIOSのクエリが開始されます。
BIOSが提供する物理RAMマッピング:
下に下がると、次の内容が表示されます。
BIOS-e820: [mem 0x00000000cff80000-0x00000000cff8dfff] ACPI データ
これは、オペレーティングシステムが周辺機器に関する追加情報を取得するために依存する可能性のあるBIOSによって提供されるテーブルです。
一方、ARM SoCがある場合、各ベンダーは独自の方法(通常はプライベートソース)で周辺機器をサポートし、もちろん同等のBIOSに同意しません。この状況は、Linus Torvaldの有名な引用につながります。
SoC ARMの設計者が非常に痛みを伴う事故で死ぬことを願っています。 [...]ガア、皆さん、このARMの問題はジョンナ苦痛です。
あなたのプロジェクトがそのようなハードウェアに基づいているならば…まあ…幸運です!メモリ範囲を無差別に代入する必要があるかもしれません。 (どんなことが起こるのか書き留めて考えてみてください)
これにより、スキーマ依存情報データが削減されます。標準バスのデバイスについて:
~のためISAデバイス(最近は主にシリアル/パラレルポート)の場合、非常に限られた数のデバイスを読み取るには、いくつかの試行錯誤方法を使用する必要があります。通常ポートアドレスを見てください。
接続機器の場合PCIバス、PCI構成スペース標準(アーキテクチャに依存しない)列挙および初期化方法を実装する標準。
とにかく、あなたのハードウェアが標準化されたプロービング方法を使用できない場合、あなたは自分で質問に答えます@通信会社提案:
ARMでは、ハードウェア設計者(または場合によってはリバースエンジニアリング)がこれを次の形式で説明する必要があるという標準があるようです。デバイスツリーデータ、これはカーネルファイルとinitramfsファイルと共にハードウェア固有のブートローダによってロードされます。したがって、ハードウェアプロジェクトがPCIやPCIeなどの標準化された自動検出可能なベースバスを含まないアーキテクチャを使用している場合は、ハードウェア設計者であるお客様はLinuxカーネルにこの情報を提供する必要があります。
答え2
x86アーキテクチャは、起動中にLinuxカーネルが列挙する標準PCコンポーネントを記述します(インターフェイスにはPCI、PCI-E、RAMなどが含まれます)。一部のバスでは、USBやSATAなどのデバイスの動的接続/分離が可能です。あなたの質問はLinux / Unixに限定されません。