虽然 bananapi m2u
是 4 核 32 位的 Cortex-A7, damn是他的支持是全面的, 不会像 raspi
那样因为 dtb
报错。(我还没试, 不过我运行 raspi3b
确实跑不起来, 我等待大概 5 分钟)
wget <https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.14.6.tar.xz>
tar xf linux-6.14.6.tar.xz
cd linux-6.14.6
make ARCH=arm sunxi_defconfig
make LLVM=1 ARCH=arm -j$(nproc)
# copy it to image
cp arch/arm/boot/zImage ../bananapi_m2u
cp arch/arm/boot/dts/allwinner/sun8i-r40-bananapi-m2-ultra.dtb ../bananapi_m2u
运行一下, 虽然没有根文件系统。
qemu-system-arm -M bpim2u -nographic \\
-kernel zImage \\
-dtb sun8i-r40-bananapi-m2-ultra.dtb \\
-append 'console=ttyS0,115200'
喜讯, panic
了
因为 bananapi_m2u
的支持是完整的, 隔壁还有个 orangepi
也是 32 位机器, 后续看他两资料情况, 我会选择一个作为嵌入式linux信息的模拟机器。对个人而言, 不需要板子就能体验嵌入式linux开发学习, 先熟悉驱动的编写, 以及设备树的修改。虽然没有硬件的直观感受。但是设备树和模拟机使用基本和硬件一致。
你可以根据 编译 u-boot && kernel && rootfs 和 运行 && 根文件系统 制作你的根文件系统, 后续或许可以操作 desktop
我基于 busybox
制作了一个 initrd
, init
脚本如下
#!/bin/sh
echo "Loading, please wait..."
[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir --mode=0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
[ -d /mnt ] || mkdir /mnt
# Mount /proc and /sys:
mount -n proc /proc -t proc
mount -n sysfs /sys -t sysfs
# Note that this only becomes /dev on the real filesystem if udev's scripts
# are used; which they will be, but it's worth pointing out
#mount -t tmpfs -o mode=0755 udev /dev
[ -e /dev/console ] || mknod /dev/console c 5 1
[ -e /dev/null ] || mknod /dev/null c 1 3
# this will scan device update /dev list
mdev -s
# Do your stuff here.
echo "This script just mounts and boots the rootfs, nothing else!"
# Mount the root filesystem.
[ -d /mnt/root ] || mkdir /mnt/root
mount -o rw /dev/mmcblk0p1 /mnt/root
# Clean up.
umount /proc
umount /sys
exec switch_root /mnt/root /sbin/init
然后就是只安装了 openrc
和 alpine-base
的 rootfs, 默认的串口使用 ttyS0