web-dev-qa-db-ja.com

実行中のカーネルの/ sysを使用してデバイスツリーの情報を取得することはできますか?

一般的にアームシステムの場合、デバイスツリーはハードウェア情報をカーネル(Linux)に提供します。これらのデバイスツリーは、コンパイルされてカーネルに読み込まれるdts(デバイスツリーソース)ファイルとして存在します。問題は、そのようなdtsファイルにアクセスできず、dtbファイルにもアクセスできないことです。

マシンで/sys/procにアクセスできます。これにより、dtsで使用する「正しい値を推測」できるかどうかを確認したいと思いますか?

また、この質問への回答が、ハッキングの代わりにデバイスツリーインターフェースが最初に使用されたかどうか(つまり、dtbが作成され、カーネルに提供されたかどうか)に依存する場合、潜在的な回答はさらに側面を強調する可能性があります「私たちは単にバニラから迂回し、カーネルにパッチを適用して、カーネルのみのデバイス情報問題を解決します」-解決策?

23

/proc/device-treeまたは/sys/firmware/devicetree/base

どちらもエイリアスだと思います。/sys/firmware/devicetree/baseを使いこなした後は、/procの方が適していると思います。

次に、ファイルからdtsプロパティにアクセスできます。

 hexdump /sys/firmware/devicetree/base/apb-pclk/clock-frequency

整数の出力形式はバイナリなので、hexdumpが必要です。

dtc -I fs

ファイルシステムから完全なデバイスツリーを取得します。

Sudo apt-get install device-tree-compiler
dtc -I fs -O dts /sys/firmware/devicetree/base

dtsをstdoutに出力します。

参照: カーネルデバイスツリーの一覧表示方法| Unix&Linux Stack Exchange

dtc in Buildroot

Buildrootには、ルートファイルシステム内にdtcを配置するためのBR2_PACKAGE_DTC=y構成があります。

QEMU -machine dumpdtb

QEMU内でLinuxを実行している場合、-dtbを使用して明示的に指定しないと、QEMUがDTBを自動的に生成するため、次のコマンドを使用して直接ダンプすることもできます。

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine dumpdtb=dtb.dtb

https://lists.gnu.org/archive/html/qemu-discuss/2017-02/msg00051.html で述べたように

Linuxカーネルv4.19 arm64で this QEMU + Buildroot setup を使用してテストされています。

私があなたを正しく理解しているかどうかはわかりません。

Dtbを使用して起動したシステムを使用している場合、デバイスツリーはdebugfs内でアクセスできる必要があります。

Pantelis Antoniouによるdtcツールを試すこともできます。これらには、blobからdtsを出力するfdtdumpおよびfdtgetが含まれています。

デバイスツリーがまったくなく、dtbからブートブートしなかった場合は、自分でマシンコードを調べて、すべてのデバイス固有の属性とノードをdtsに追加する必要があります。このようなブート用に生成された「合成」デバイスツリーはありません。開始点は、同様のマシンまたは親であり、システムごとに作業します。

4
FRob