世の中にARMアーキテクチャのSoCであるQualcomm Snapdragon Xシリーズを搭載したWindowsマシン
ただ、Snapdragon XベースのWoAデバイスについては以前に比べ、
- Windows 11ではamd64
(Intel/ AMDの64ビット命令。x86_ 64とも) のエミュレーション機能が搭載された (Windows 10ではx86 (同32ビット命令) のエミュレーションのみ。それ以前のWindows RTではエミュレーションなし) - Microsoft社の販売するSurfaceシリーズでSnapdragon Xシリーズを全面採用している
(現時点では、Intel社のCPUを採用するのは法人向けのSurface Pro 11のみ) - 最近のトレンドであるAI PCの文脈でMicrosoft社の提唱するCopilot+ PCの要件
(40 TOPS以上のNPU (Neural Processing Unit) を搭載) をいち早く満たした - その他の大手PCメーカーもSnapdragon Xシリーズ搭載PCを販売しており入手しやすい
という具合に、
それなりな数のSnapdoragon XベースのWoAデバイスが世に出回ると
筆者はSnapdragon XベースのWoAデバイスにとても興味をもっており、この度、Snapdragon X Elite
結果はというと
ハードウェア構成を把握する方法
OSが動くにはOS自身が稼働しようとしているシステムのハードウェア構成を理解していなければなりません。
Windows on amd64
これに対して、ARMの世界ではACPIが標準的でないため、ACPI以外の方法でデバイス構成をカーネルに伝える必要がありました。Linuxの当初のアプローチでは各種ARMマシン
これに代わる方法としてDevice Treeという仕組みがLinux on ARMの世界で採用されることになりました。この仕組みでは、Device Treeファイル.dtb
ファイル)
では、ARMアーキテクチャのSnapdragon XをベースとするWoAデバイスで、Windowsはハードウェア構成をどのように検出しているのでしょうか。答えになりそうな情報がSurface向けのLinuxカーネルを提供するプロジェクトに立てられたスレッドのなかにありました。これを読むと、Surface Pro 11ではACPIを利用できるものの、ACPIの標準仕様にないPlatform Extension Plug-ins(PEPs)が利用されている状況のようです。もちろん、Windowsの世界ではWindows 10以降でPEPsがサポートされていて、amd64なPCと同じように、ACPIを使ったデバイス構成の検出が可能です。なお、この話は後で見てみるようにSurface Pro 11に固有のものではなく、Snapdragon XベースのWoAデバイスに共通する内容と筆者は理解しています。
一方、Linuxでは
なお、ハードウェア構成の検出方法とは別に、ハードウェアを動かすためのドライバーは必要です。無事にハードウェア構成を把握できても、認識したハードウェアを動かすためのドライバーがなければそのハードウェアは動かないためです。
インストールISOイメージから状況を確認してみる
ここまでの内容を念頭に
Ubuntu 25.boot/
ファイルを確認してみます。すると、次のような記載があります
set dtb=
set cmdline=
smbios --type 1 --get-string 5 --set system_product_name
smbios --type 1 --get-string 6 --set system_product_version
smbios --type 1 --get-string 19 --set system_sku_number
regexp "ThinkPad X13s.*" "$system_product_version"
if [ $? = 0 ]; then
cmdline="clk_ignore_unused pd_ignore_unused arm64.nopauth"
dtb="devicetree /casper/dtbs/sc8280xp-lenovo-thinkpad-x13s.dtb"
fi
if [ "$system_product_version" == "ThinkPad T14s Gen 6" ]; then
# Workaround for 64GB crashes on T14s
cutmem 0x8800000000 0x8fffffffff
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1e78100-lenovo-thinkpad-t14s.dtb"
fi
if [ "$system_product_version" == "Yoga Slim 7 14Q8X9" ]; then
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1e80100-lenovo-yoga-slim7x.dtb"
fi
if [ "$system_product_name" == "XPS 13 9345" ]; then
# Workaround for 64GB crashes. Sigh...
cutmem 0x8800000000 0x8fffffffff
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1e80100-dell-xps13-9345.dtb"
fi
if [ "$system_product_name" == "Galaxy Book4 Edge" ]; then
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1e80100-samsung-galaxy-book4-edge.dtb"
fi
if [ "$system_product_name" == "Swift SF14-11" ]; then
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1p64100-acer-swift-sf14-11.dtb"
fi
if [ "$system_product_name" == "Swift SF14-11T" ]; then
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1p64100-acer-swift-sf14-11.dtb"
fi
regexp "ASUS Vivobook S 15.*" "$system_product_name"
if [ $? == 0 ]; then
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1e80100-asus-vivobook-s15.dtb"
fi
regexp "ASUS Zenbook A14 UX3407Q.*" "$system_product_name"
if [ $? == 0 ]; then
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1p42100-asus-zenbook-a14.dtb"
fi
regexp "ASUS Zenbook A14 UX3407R.*" "$system_product_name"
if [ $? == 0 ]; then
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1e80100-asus-zenbook-a14.dtb"
fi
regexp "HP OmniBook X Laptop 14-.*" "$system_product_name"
if [ $? == 0 ]; then
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1e80100-hp-omnibook-x14.dtb"
fi
if [ "$system_sku_number" == "Surface_Laptop_7th_Edition_2036" ]; then
# Workaround for 64GB crashes. Sigh...
cutmem 0x8800000000 0x8fffffffff
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1e80100-microsoft-romulus13.dtb"
fi
if [ "$system_sku_number" == "Surface_Laptop_7th_Edition_2037" ]; then
# Workaround for 64GB crashes. Sigh...
cutmem 0x8800000000 0x8fffffffff
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1e80100-microsoft-romulus15.dtb"
fi
if [ "$system_product_name" == "CRD" ]; then
cmdline="clk_ignore_unused pd_ignore_unused cma=128M"
dtb="devicetree /casper/dtbs/x1e80100-crd.dtb"
fi
menuentry "Try or Install Ubuntu" {
set gfxpayload=keep
linux /casper/vmlinuz $cmdline --- quiet splash console=tty0
initrd /casper/initrd
$dtb
}
ここからわかるように、smbios
で取得した情報をもとにこれから起動しようとしているデバイスを判断し、該当するSnapdragon X搭載のデバイスであれば、それに対応する.dtb
ファイルを変数$dtb
経由でカーネルに渡していることがわかります。すべての判定から外れる場合、$dtb
は空となるため、Device Treeを使った起動は試みられず、カーネルはACPIを使ってハードウェア構成を取得しようとします。このようなDevice Treeの泥臭い打ち分けが
ちなみに、今回の検証・
さらにgrub.
の内容を細かく見ると、デバイスの判定はかなりシビアASUS Zenbook A14
という同じ名前の製品でも
ASUS Zenbook A14 UX3407Q
系列は/casper/
とSnapdragon X Plus向けのDevice Treeをdtbs/ x1p42100-asus-zenbook-a14. dtb ASUS Zenbook A14 UX3407R
系列は/casper/
とSnapdragon X Elite向けのDevice Treeをdtbs/ x1e80100-asus-zenbook-a14. dtb
と、読み込ませるデバイスツリーが違っています.dtb
ファイル名に含まれるx1p42100
はSnapdragon X Plus X1P-42-100を、同じくx1e80100
はSnapdragon X Elite X1E-80-100を指すものと読み取れます[4])。このことからSnapdragon Xを搭載する同一シリーズの製品でもSnapdragon X Eliteを採用するものか同Plusを採用するものかで起動する・
この流れで上に記載のあるHP OmniBook X Laptop 14
という系列を取り上げると、このシリーズにはSnapdragon X Eliteを採用する製品と同Plusを採用する製品とがあることがわかります。一方、読み込む/casper/
はSnapdragon X Elite向けのファイルに見えます。そのため、Snapdragon X Plusを採用する構成ではたぶん動かないだろうということが想像できます。筆者は実機を持っておらず購入予定もないのですが、とても気になるところです[5]。
反対に、Swift SF14-11
とSwift SF14-11T
のように同じSnapdragon X Plusを採用していても、読み込むべきDevice Treeが異なる/casper/
および/casper/
)
ちなみに、Surface Pro 11と同じタイミングに出て、概ね似たような構成であろうと想像されるSurface_
用の/casper/
を読み込ませるなどしてみましたが、やはり起動しませんでした。
ここまで見た内容を整理すると次のようなことが言えます。
- 「対応していない」
というステータスにあるSnapdragon XベースのWoAデバイスはUbuntuの起動すらままならない - 「対応している」
デバイスも型番レベルで厳密に判定されうるし、ちょっとでもハードウェア構成が異なると動かない可能性がある
そのため、Ubuntuを動かすためのSnapdragon XベースのWoAデバイスを入手しようとする場合には細心の注意を払うべきでしょう。つまり、その時々で最新版のUbuntuのインストールイメージに含まれるgrub.
を同じようにチェックし、型番レベルで対応していることが確認できるデバイスを入手するようにすべきです。あるいは、うまく動かないデバイスの実機を持っている人間としてubuntu-conceptのBugに情報提供して
なお、Snapdragon XベースのWoAデバイス上で直接Ubuntuを動かさなくてもよければ、Windows上で稼働する仮想マシンでUbuntuを使うという方法は考えられます。つまり、WSLでUbuntuを使う、Hyper-Vの仮想マシン上でUbuntuを使うといった方法です
今後の展望
実はUbuntuに限らなければ、今回検証・.dtb
ファイルとを用意しています。そのため、Ubuntuでもこれら
中長期的な展望としては、
では、実際問題として