コンテンツにスキップ

Adt


title: Apple Device Tree (ADT) summary: Apple Device Tree, Apple Silicon 機器で使われるハードウェア検出・初期化システム


2025/3/9時点のadtの翻訳


Appleのファームウェアはカーネルを起動するときにバイナリ形式のDeviceTreeを渡します。このフォーマットは、Linuxが想定する Open Firmware標準に非常に似ていますが、異なります。

LinuxのDeviceTreeと同様に、AppleのDeviceTree(ADT)は、ノードの階層にいくつかの型付けされていないバイト配列 (プロパティ)をエンコードしています。これらは、利用可能なハードウェアを記述したり、Appleがファームウェアがカーネルに 伝える必要があると考えるその他の情報を提供します。これにはシリアル番号やWiFiキーのような識別情報や秘密情報が含まれます。

ADTとLinuxのDTの主な違いはバイトオーダーです。プロパティは型付けされていないため、自動的に補正することはできません。

ADTの取得

ハードウェアがある場合、いくつかの方法でADTにアクセスすることができます。

オプション1:m1n1デバッグコンソール経由

最も簡単な方法は、adt.pyを使用してm1n1を使用することでしょう。

cd m1n1/proxyclient ; python -m m1n1.adt --retrieve dt.bin

これにより、生の(バイナリの)ADTを含む『dt.bin』というファイルが書き込まれ、デコードされたADTが表示されます。

オプション2: macOS im4pファイル経由 (注意: これらはブート時にiBootによって埋められる詳細が欠落)
img4lib

xerub氏の img4lib を入手します

git clone https://github.com/xerub/img4lib
cd img4lib
make -C lzfse
make
make install
img4tool

tihmstar氏の img4tool を入手します (作者のlibgeneralに加え autoconf, automake, libtool, pkg-config, openssl, libplist-2.0 も必要です)。

git clone https://github.com/tihmstar/libgeneral.git
git clone https://github.com/tihmstar/img4tool.git

次にそれぞれに対して

./autogen.sh
make
make install
Device Tree ファイルを取得

im4pファイルを下記ディレクトリからコピーしてください。Machine 'j' モデルの詳細については、デバイスを参照してください。

/System/Volumes/Preboot/[UUID]/restore/Firmware/all_flash/DeviceTree.{model}.im4p

ディレクトリが存在しない場合、リカバリーモードでcsrutilを無効化し、設定からターミナルですべてのファイルにアクセスできるようにするか、 シンボリックリンクされている可能性があるので Volumes/Macintosh HD/ から起動してみてください。 それでもアクセスできない場合は、以前からのsudo find . -type f -name '*.im4p'を試してみてください。

そして、img4tool を使って dt.bin を抽出します。

img4tool -e DeviceTree.j274ap.im4p -o j274.bin

img4libで同様の処理をするために、以下を実行します。

img4 -i DeviceTree.j274ap.im4p -o j274.bin
オプション3:macOSより

macOSから直接ADTのテキスト表現を取得するには、次のように実行します。

ioreg -p IODeviceTree -l | cat

これはデコードする必要はありませんが、m1n1を使う(後述)よりはるかに少ない情報しか出力されません。

ADTのデコード

m1n1インストール後(リポジトリページ を参照)

cd m1n1/proxyclient

contruct python libraryを取得(construct.pyファイルでない、それはライブラリ)

pip install construct

j{*}.binを含むファイルをproxyclientディレクトリにコピーし、次のように抽出:

python -m m1n1.adt j{*}.bin

また-aオプションでメモリマップを取得することができます。

python -m m1n1.adt -a j{*}.bin

他に方法ありますか?