LinuxでUEFIハードウェア情報にアクセスする

LinuxでUEFIハードウェア情報にアクセスする

UEFIを介してハードウェアに関する情報を取得したいと思います。 Linuxでは、fwtsツールを使用してefi変数を取得してダンプできることを知っています。また、UEFIによって管理されているすべてのデバイスを表示するEFIシェルの「device」コマンドについても知っています。しかし、Linuxでこの情報を取得する方法はありません。他のツールを使用してハードウェアに関する情報を取得する方法があることを知っていますが、UEFIを使用することができるか(研究に使用している場合)知りたいのですが。

ベストアンサー1

UEFI 管理デバイスがありません。これは、LinuxオペレーティングシステムがUEFI ExitBootServices機能を呼び出すためです。これは、オペレーティングシステムがすべてのデバイス管理を開始するために必要です。

最新のオペレーティングシステムには、ハードウェアデバイス用のドライバが含まれています。単一のデバイスを2つの異なるドライバで駆動しないでください。これには、子デバイスを列挙して通信するために使用される親デバイス/「バス」が含まれます。

たとえば、モニターのUSBハブは、マザーボードのPCI-Eスロットに接続されているPCI-EカードのUSB-Cポートを介してコンピュータに接続されます。ブートファームウェアは、このUSBポートに接続されているUSBストレージデバイスからEFI実行可能ファイルをロードできます。ただし、実行可能ファイルを実行してUEFI ExitBootServicesを呼び出すと、これらすべてが制御されます。

したがって、一般的な規則は、オペレーティングシステムが接続されているハードウェアを列挙することです。ファームウェアはもう制御できません。現在接続されているハードウェアを列挙し、合理的な結果を得るようにファームウェアに要求することはできません。

一般的なルールには例外があります。彼らはすべて扱うのは非常に難しいです。作成された質問には、コンピュータに適用されるすべての例外を列挙する理由は含まれていません。だからしないでください。

一部のハードウェア情報はACPIとDMIで確認できます。技術的には、ACPIテーブルはポインタを渡してUEFIを介して提供されます(UEFIが渡したOSのメモリマップに関連するメモリを予約すると推測されます)。おそらくDMIも似ているでしょう。

DMIコマンドはdmidecode主に識別子の集まりであるようです。これらのいくつかは起動時にハードウェアから収集されます。これらのどれも包括的である必要はないので、基本的に必要なすべてのハードウェアデバイスを見つけるにはバスドライバが必要です。

acpidump、およびを含む多くのACPIコマンドがありますacpixtract。これらのツールの1つは、オペレーティングシステムがさまざまな場合に実行されるAMLという解釈言語用の逆アセンブラです。

AMLは多少恐ろしく聞こえるかもしれませんが、少なくともオペレーティングシステムドライバとAMLドライバが同じハードウェアに接続され、競合を引き起こさないように設計されています。たとえば、オペレーティングシステムには組み込みコントローラデバイス用のドライバがあり、AMLは実際にはオペレーティングシステムドライバと通信できます。あるいは、ACPIはAMLが直接使用できるように特定のハードウェアリソースを予約することができ、OSはそのリソースの使用が許可されていないことを知ることができます。

ACPIはまた、以前のバージョンのISA PNPを置き換えます。これは、オペレーティングシステム自体で列挙できない従来のデバイス(シリアルポートなど)を列挙するために使用されます。

同様に、ACPIは公称オペレーティングシステムに初期PCIレジスタまたはIOメモリアドレスを見つけるように指示する役割を果たします。 (私は最新ではありませんが、ACPIではないと言うと、Linuxがそれに対する一般的なアドレスを調べようとすることを想像できます。)

多くのデバイスは、PCIバスを介して直接または間接的にアクセスされます。

IIRC Windowsは、PCIをACPIのサブデバイスとしてマークし、デバイスマネージャにそれを表示します。 Linuxには問題がないようです(pci0000:00/今ログインしました/sys/devices)。 ACPI-> PCIがデフォルトで公開する必要のない特別な形式なのか、Linuxで特に処理して気にしないのか覚えていません。 ACPIを親デバイスとして公開します。

おすすめ記事