こんにちは。Kanade改めK4eと申します。Linuxディストリビューションが好きで現在Linuxディストリビューションを紹介する一人アドベントカレンダーを進めております。(大遅刻気味ですみません...)
LoongArchとは?
さて、突然ですが、「LoongArch」というCPUアーキテクチャをご存じでしょうか。LoongArchは中国の龙芯(Loongson)テクノロジー株式会社が設計したRISC系のCPUアーキテクチャです。ISAを完全に独自のもので、既存のx86やARMなどとの命令セットと非互換になるように開発がされています。これにより中国国外の企業への依存を断ち切った状態で国内をCPUを製造できるようになります。
RISC-Vじゃだめなのか? という尤もな疑問はあるかと思うのですが、LoongArchには実用的な多様な拡張命令があり、拡張性を持たせたコンパクトなRISC-VのISAとは設計思想に大きな違いがあります。
LoongArch Reference Manual Volume 1: Basic Architectureより引用
LoongArchは上図のようにベースとなる命令セットと4つの拡張命令セットで構成されます。128bitSIMD拡張命令セット(LSX)、256bitSIMD拡張命令セット(LASX)、仮想化拡張命令セット(LVZ)、バイナリ変換命令セット(LBT)がありますが、特筆すべきはバイナリ変換命令です。
LoongArchはx86やARMのような既存のCPU向けにコンパイルされたバイナリをLoongArch向けのバイナリに変換する際使う、専用の拡張命令を持っています。 これによりx86、ARMと非互換でありながら既存のソフトウェア資源を高速に実行することができるという変態的な設計をしています。
Reference Manual Volume 1のcpucfg命令の表記によれば、LBT_X86、LBT_ARM、LBT_MIPSと、x86、ARM、MIPSの3つのアーキテクチャのバイナリ変換を行う拡張があるようです。
現在DebianやOpenSUSE、Arch Linuxと、主要なLinuxディストリビューションのLoongArch移植が精力的に進められています。そんな中で今回はGentoo LinuxというLinuxディストリビューションをLoongArch64仮想マシン上で動かしてみます。
なぜGentooなのか
Gentoo Linuxは、ソースコードからソフトウェアをビルドすることを前提にしたLinuxディストリビューションです。 Portageという優れたビルド管理システムがあり、USEフラグという環境変数を用いて簡単に各パッケージを自分好みにコンパイルすることができます。LinuxディストリビューションというよりPortageを中心とした高性能ビルド環境、といった方が正しいでしょう。公式ページでも「meta-distribution」という言葉でGentooを表しています。ディストリビューションを作るための部品と仕組みを提供するソフトウェア群、といった意味かと思います。
Gentoo LinuxをLoongArchで動かすことができればLoongArchで動く多様なLinuxディストリビューションを開発する基盤となります。しかし、LoongArch上でGentoo Linuxを動かしたという日本語記事がなかったので、実際に動かして試してみよう、というのが今回の主題です。
実際にGentoo Linux stage3の起動まではうまくいきました。起動方法をまとめておきます。
検証環境
今回はWSL2上で動くGentoo上にloongarch64のqemuシステムを構築して、その上でGentooを動かしました。わざわざUbuntuではなくGentooを選んでいるのは、クロスコンパイル環境を作る難易度がGentooの方が低いためです。sys-devel/crossdevというパッケージがあり、これを使うことで簡単にクロスコンパイル環境を構築することができます。
WSL2上でGentooを動かす方法は公式ページにて記載があります。
WSL2へのGentooインストール方法の解説は省略します。
クロスコンパイル環境作成
前述の通り、sys-devel/crossdevパッケージを用いてクロスコンパイル環境を作成していきます。まずインストールしていきます。
emerge --ask sys-devel/crossdev
ホストのリポジトリを汚さないようにcrossdev用のPortageリポジトリを作成します。app-eselect/eselect-repositoryパッケージをインストールします。
emerge --ask app-eselect/eselect-repository
crossdevというローカルPortageリポジトリを作成します。
eselect repository create crossdev
こうするとクロスビルド用のファイルをホストと隔離して管理することができるようになります。
crossdevを用いてクロスコンパイル環境を作成しましょう。
以下のコマンドを使うだけでloongarch64向けのクロスコンパイル環境を作成できます。
crossdev --target loongarch64-unknown-linux-gnu
このコマンドにより、loongarch64向けのgccやg++、ldなどのツールが一通りそろいます。/usr/bin内に大量のシンボリックリンクが張られ、これらのクロスコンパイラを用いることでloongarch64向けのビルドを行うことができるようになります。
ls /usr/bin/loongarch* 実行結果
DESKTOP-TMUKBBC ~ # ls /usr/bin/loongarch*
/usr/bin/loongarch64-unknown-linux-gnu-addr2line /usr/bin/loongarch64-unknown-linux-gnu-gcc-nm
/usr/bin/loongarch64-unknown-linux-gnu-ar /usr/bin/loongarch64-unknown-linux-gnu-gcc-ranlib
/usr/bin/loongarch64-unknown-linux-gnu-as /usr/bin/loongarch64-unknown-linux-gnu-gfortran
/usr/bin/loongarch64-unknown-linux-gnu-c++ /usr/bin/loongarch64-unknown-linux-gnu-gfortran-15
/usr/bin/loongarch64-unknown-linux-gnu-c++-15 /usr/bin/loongarch64-unknown-linux-gnu-gprof
/usr/bin/loongarch64-unknown-linux-gnu-c++filt /usr/bin/loongarch64-unknown-linux-gnu-ld
/usr/bin/loongarch64-unknown-linux-gnu-cc /usr/bin/loongarch64-unknown-linux-gnu-ld.bfd
/usr/bin/loongarch64-unknown-linux-gnu-cpp /usr/bin/loongarch64-unknown-linux-gnu-lto-dump
/usr/bin/loongarch64-unknown-linux-gnu-cpp-15 /usr/bin/loongarch64-unknown-linux-gnu-nm
/usr/bin/loongarch64-unknown-linux-gnu-ebuild /usr/bin/loongarch64-unknown-linux-gnu-objcopy
/usr/bin/loongarch64-unknown-linux-gnu-elfedit /usr/bin/loongarch64-unknown-linux-gnu-objdump
/usr/bin/loongarch64-unknown-linux-gnu-emerge /usr/bin/loongarch64-unknown-linux-gnu-pkg-config
/usr/bin/loongarch64-unknown-linux-gnu-fix-root /usr/bin/loongarch64-unknown-linux-gnu-ranlib
/usr/bin/loongarch64-unknown-linux-gnu-g++ /usr/bin/loongarch64-unknown-linux-gnu-readelf
/usr/bin/loongarch64-unknown-linux-gnu-g++-15 /usr/bin/loongarch64-unknown-linux-gnu-size
/usr/bin/loongarch64-unknown-linux-gnu-gcc /usr/bin/loongarch64-unknown-linux-gnu-strings
/usr/bin/loongarch64-unknown-linux-gnu-gcc-15 /usr/bin/loongarch64-unknown-linux-gnu-strip
/usr/bin/loongarch64-unknown-linux-gnu-gcc-ar
これを用いてLinuxカーネルをLoongArch64向けにコンパイルします。
Linuxカーネルのコンパイル
Linuxカーネルをコンパイルします。今回は余計な問題がなさそうなLTSバージョンのv6.12.63カーネルを用います。
wgetでソースコードを持ってきます。
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.63.tar.xz
tar xf linux-6.12.63.tar.xz
cd linux-6.12.63
ARCH、CROSS_COMPILE変数を指定します。
export ARCH=loongarch
export CROSS_COMPILE=loongarch64-unknown-linux-gnu-
これを指定することで/usr/bin/loongarch64-unknown-linux-gnu-*のクロスコンパイラを使用するようになります。
.configファイルを生成します。
make defconfig
コンパイルを始めます。
make -j$(nproc)
コンパイル時にエラーが起きたのでcpioをインストールしました。
emerge --ask app-arch/cpio
コンパイルが終わり、vmlinuxが生成されていれば完成です。
qemu-system-loongarch64の準備
loongarch64のqemu仮想マシンを準備します。qemuのUSEフラグを設定することによりloongarch64向けのビルドを行うことができます。
USEフラグを設定します。nanoなどで/etc/portage/package.use/qemuに以下行を追加します。
app-emulation/qemu slirp seccomp qemu_softmmu_targets_loongarch64 qemu_user_targets_loongarch64
qemu_softmmu_targets_loongarch64とqemu_user_targets_loongarch64が本命です。これらのUSE変数を設定するとUSE_EXPAND変数であるQEMU_SOFTMMU_TARGETSとQEMU_USER_TARGETSにloongarch64が追加されます。slirpはネットワーク用の追加機能、seccompはセキュリティ用の追加機能です。
これを設定したらqemuをインストールします。
emerge --ask app-emulation/qemu
適宜etc-updateを使ってUSE衝突やunmask処理をしてビルドを通します。
終わったら以下のように、コマンドが使えるかどうかを確認します。
DESKTOP-TMUKBBC ~ # qemu-system-loongarch64 --version
QEMU emulator version 10.0.5
Copyright (c) 2003-2025 Fabrice Bellard and the QEMU Project developers
rootfs用disk.img作成
qcow2イメージを作成します。
qemu-img create -f qcow2 disk.img 16G
disk.imgをマウントします。直接のマウントではloop関連のエラーが出たのでnbd経由でマウントを行いました。
modprobe nbd max_part=16
qemu-nbd --connect=/dev/nbd0 disk.img
パーティションを作成します。
まず、etc-updateで調整しながらgptfdiskをインストールします。
emerge --ask sys-apps/gptfdisk
sgdiskでパーティション設定をします。1つパーティションを作ってext4フォーマットしました。
sgdisk --zap-all /dev/nbd0
sgdisk -n 1:0:0 -t 1:8300 -c 1:rootfs /dev/nbd0
partprobe /dev/nbd0
mkfs.ext4 -L rootfs /dev/nbd0p1
stage3の展開
Gentooは公式にloongarch64のstage3ファイルを公開しています。
こちらをダウンロードし、disk.imgに展開します。
stage3は1週間ごとに更新されるので適宜このページからURLを確認してください。
wget https://distfiles.gentoo.org/releases/loong/autobuilds/20251217T161557Z/stage3-loong-systemd-20251217T161557Z.tar.xz
マウントして、展開します。
mkdir -p /mnt/loongroot
mount /dev/nbd0p1 /mnt/loongroot
tar xpf stage3-loong-systemd-*.tar.xz \
-C /mnt/loongroot \
--xattrs-include='*.*' \
--numeric-owner
最低限の設定を行います。
まず、/etc/fstabの設定です。
cat > /mnt/loongroot/etc/fstab << 'EOF'
/dev/vda1 / ext4 defaults,noatime 0 1
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devtmpfs /dev devtmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
EOF
また、シリアルログインの許可を出しておきます。
echo 'ttyS0' > /mnt/loongroot/etc/securetty
qemuで起動
いよいよ起動します。まず-append="init=/bin/sh"として環境に入り、rootパスワードを変更します。
先ほど作成したvmlinuxとdisk.imgはカレントディレクトリにある想定です。適宜パスを変更してください。
qemu-system-loongarch64 \
-M virt \
-cpu la464 \
-m 2G \
-smp 4 \
-nographic \
-kernel vmlinux \
-append "console=ttyS0 root=/dev/vda1 rw init=/bin/sh" \
-drive file=disk.img,if=virtio,format=qcow2
こうすると、ログインなしで環境に入ることができます。
sh-5.3# passwd root
でrootパスワードの変更を行ってからCtrl+aとxでqemuを終了させます。
その後
qemu-system-loongarch64 \
-M virt \
-cpu la464 \
-m 2G \
-smp 4 \
-nographic \
-kernel vmlinux \
-append "console=ttyS0 root=/dev/vda1 rw" \
-drive file=disk.img,if=virtio,format=qcow2
で実際に環境に入ります。
This is localhost (Linux loongarch64 6.12.63) 14:13:43
localhost login:
という表示が出ればOKです。rootユーザと先ほどのパスワードでログインしましょう。
実際に環境を見てみる
root@localhost ~ # uname -a
Linux localhost 6.12.63 #1 SMP PREEMPT_DYNAMIC Sun Dec 21 03:46:41 JST 2025 loongarch64 GNU/Linux
2025年12月現在最新のv6.12系カーネルが動いていることが確認できます。
/proc/cpuinfo
/proc/cpuinfoを見てみましょう。
root@localhost ~ # cat /proc/cpuinfo
system type : generic-loongson-machine
processor : 0
package : 0
core : 0
global_id : 0
CPU Family : Loongson-64bit
Model Name : Loongson-3A5000
CPU Revision : 0x10
FPU Revision : 0x01
CPU MHz : 0.00
BogoMIPS : 0.00
TLB Entries : 2112
Address Sizes : 48 bits physical, 48 bits virtual
ISA : loongarch32r loongarch32s loongarch64
Features : cpucfg lam ual fpu lsx lasx crc32 lspw
Hardware Watchpoint : no
出力全体
root@localhost ~ # cat /proc/cpuinfo
system type : generic-loongson-machine
processor : 0
package : 0
core : 0
global_id : 0
CPU Family : Loongson-64bit
Model Name : Loongson-3A5000
CPU Revision : 0x10
FPU Revision : 0x01
CPU MHz : 0.00
BogoMIPS : 0.00
TLB Entries : 2112
Address Sizes : 48 bits physical, 48 bits virtual
ISA : loongarch32r loongarch32s loongarch64
Features : cpucfg lam ual fpu lsx lasx crc32 lspw
Hardware Watchpoint : no
processor : 1
package : 0
core : 3
global_id : 3
CPU Family : Loongson-64bit
Model Name : Loongson-3A5000
CPU Revision : 0x10
FPU Revision : 0x01
CPU MHz : 0.00
BogoMIPS : 0.00
TLB Entries : 2112
Address Sizes : 48 bits physical, 48 bits virtual
ISA : loongarch32r loongarch32s loongarch64
Features : cpucfg lam ual fpu lsx lasx crc32 lspw
Hardware Watchpoint : no
processor : 2
package : 0
core : 2
global_id : 2
CPU Family : Loongson-64bit
Model Name : Loongson-3A5000
CPU Revision : 0x10
FPU Revision : 0x01
CPU MHz : 0.00
BogoMIPS : 0.00
TLB Entries : 2112
Address Sizes : 48 bits physical, 48 bits virtual
ISA : loongarch32r loongarch32s loongarch64
Features : cpucfg lam ual fpu lsx lasx crc32 lspw
Hardware Watchpoint : no
processor : 3
package : 0
core : 1
global_id : 1
CPU Family : Loongson-64bit
Model Name : Loongson-3A5000
CPU Revision : 0x10
FPU Revision : 0x01
CPU MHz : 0.00
BogoMIPS : 0.00
TLB Entries : 2112
Address Sizes : 48 bits physical, 48 bits virtual
ISA : loongarch32r loongarch32s loongarch64
Features : cpucfg lam ual fpu lsx lasx crc32 lspw
Hardware Watchpoint : no
ちゃんとLoongson-64bit、Loongson-3A5000として認識されています。
PC、サーバ向けの汎用CPUのようです。
lscpu
root@localhost ~ # lscpu
Architecture: loongarch64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 48 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Model name: Loongson-3A5000
CPU family: Loongson-64bit
Model: 0x10
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
BogoMIPS: 0.00
Flags: cpucfg lam ual fpu lsx lasx crc32 lspw
Caches (sum of all):
L1d: 256 KiB (4 instances)
L1i: 256 KiB (4 instances)
L2: 1 MiB (4 instances)
L3: 16 MiB (1 instance)
NUMA:
NUMA node(s): 1
NUMA node0 CPU(s): 0-3
Vulnerabilities:
Gather data sampling: Not affected
Indirect target selection: Not affected
Itlb multihit: Not affected
L1tf: Not affected
Mds: Not affected
Meltdown: Not affected
Mmio stale data: Not affected
Reg file data sampling: Not affected
Retbleed: Not affected
Spec rstack overflow: Not affected
Spec store bypass: Not affected
Spectre v1: Not affected
Spectre v2: Not affected
Srbds: Not affected
Tsa: Not affected
Tsx async abort: Not affected
Vmscape: Not affected
Flagsの部分に注目してみます。
cpucfg lam ual fpu lsx lasx crc32 lspw
cpucfgの他、並列処理、非aligned memoryアクセス、ハードウェア浮動小数点、SIMD拡張命令(lsx, lasx)などが実装されています。ユーザランド最適化の検証環境として使えそうです。仮想化機能の実装はありません。
残念ながらバイナリ変換命令(LBT)の実装もありません。そもそもドキュメントも見つからないのでどんな命令なのかが調べられない状態です。いったいどんな命令なのか...。
まとめ
今回はqemuを用いてGentoo LinuxをLoongArch64上で動かしてみました。Gentoo Linuxの強みは、stage3の時点でDebianなどの最小構成にはない、build-essentialレベルのビルド機能を持っていることです。そのため、ネットワーク環境すらない今の状態でもコードを書いてビルドし、動作確認まで行うことができます。
次はこの環境を使って大熱血アセンブラのような検証を行いたいと考えています。修論執筆があるのでいつになるかはわかりませんが...。
面白いCPUなので今後の発展に期待です。
