明日にはでっかい太陽が昇るかもしれません。

「覚悟」とは!! 暗闇の荒野に!!進むべき道を切り開く事だッ!

U-Boot (aarch64) on Qemu を動作させたい (10)

github.com

ほそぼそと開発を続けていたのですが、ようやく eMMC (実態は SDHCバイス) の実装がある程度まともに動作するようになり、 U-Boot から ext2 パーティションをマウントできるようになりました。

仕事で使用しているカスタムボードは eMMC から kernel をブートするので、 PCIe よりも優先して対応していました。

コード対応はコミットを見ればわかるけど、 qemu の起動引数での emmc ファイルイメージの指定方法や、そもそも emmc イメージファイルにパーティションファイルシステムを作成する手順をまとめておく。

emmc ファイルイメージファイルを作成する

### truncate コマンドを使用する場合
$ truncate -s 4GiB emmc.img

サイズは適当に。

イメージファイルにパーティションファイルシステムを作成する

### 開いているループバックデバイスを調べてファイルを割り当てる
$ sudo losetup -f
/dev/loop0
$ sudo losetup /dev/loop0 emmc.img 

### パーティションを作成する
$ sudo parted /dev/loop0
GNU Parted 2.3
/dev/loop0 を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。
(parted) mkpart primary ext2 1024KiB 100%                                                                                                                     
(parted) print                                                            
モデル: Loopback device (loop)
ディスク /dev/loop0: 4295MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  4295MB  4294MB  primary

(parted) q

### ext1 パーティションを作成
$ sudo mkfs.ext2 /dev/loop0p1

### ループバックデバイスの割り当てを解除
$ sudo losetup -d /dev/loop0

なんか、パーティションの開始セクタは開けておかないと 警告: 操作の結果できるパーティションはアライメントが正しくないためにパフォーマンスがでません。 という警告が出たので、 fdisk で初期化した時に作成される隙間と同じサイズを開けている。

一応、 parted コマンドでもファイルシステムを作れるけど、 mkfs サブコマンドを実行すると

警告: ファイルシステムに対して parted による操作(mkfs)を行おうとしています。
parted のファイルシステム操作コードは、e2fsprogs のようなファイルシステム専
用のものほど堅固に作られていません。可能なかぎり parted をパーティションテー
ブルの操作だけに用いることをお勧めします。ほとんどのファイルシステムに
対するほとんどの操作は今後のリリースで削除される予定です。

ってでるので、あとから mkfs コマンドを実行している。

fdisk を使わずに parted コマンドでパーティションを作成しているのは、 partedパーティション作成後に自動で /dev/loop0p1 デバイスファイルを作成してくれるから。 (fdisk 使っても手動でデバイスファイルは作れるんだろうけど、未調査)

仮想マシンにイメージファイルをマウントする

### drive オプション (種別は SD) でファイルをマウントする
$ qemu-system-aarch64 \
    -machine ls1046ardb \
    -smp 4 \
    -m 2046M \
    -kernel u-boot.elf \
    -drive if=sd,cache=unsafe,format=raw,file=emmc.img \
    -nographic \

仮想マシン上から読み込む

### ファイルの確認と、内容の確認
=> mmc dev 0
switch to partitions #0, OK
mmc0 is current device
=> mmc part

Partition Map for MMC device 0  --   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
  1     2048            8386560         3bc514ae-01     83
=> ext2ls mmc 0:1 /
<DIR>       4096 .
<DIR>       4096 ..
<DIR>      16384 lost+found
               5 test.txt
=> ext2load mmc 0:1 80000000 /test.txt
5 bytes read in 26 ms (0 Bytes/s)
=> md.b 80000000 8
80000000: 74 65 73 74 0a 00 00 00                            test....

ホスト PC 上でイメージにファイルを追加する

開発は docker 上で行っているが、 docker コンテナで parted の自動デバイス割り当てが動作しなかった (udevadm が動作しない) ので、こちらの手順は fdisk で行っている。

### パーティションの位置を確認する
$ fdisk -l ../../emmc.img 
Disk ../../emmc.img: 4 GiB, 4294967296 bytes, 8388608 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3bc514ae

Device          Boot Start     End Sectors Size Id Type
../../emmc.img1       2048 8388607 8386560   4G 83 Linux

### パーティションの先頭をオフセットにしてマウントする
$ sudo mount -o loop,offset=$((2048*512)) emmc.img /mnt

ということで、無事に emmc イメージファイル上のファイルを仮想マシン上で読み込むことができた。

次は kernel ブートを試してみる。