基于芯来科技nuclei-linux-sdk和qemu启动debian 12 bookworm
目前由于demosoc的硬件只有imac指令集,因此先计划在nuclei qemu上测试debian启动流程。
1、创建文件系统镜像,大小为2G,很奇怪超过2G,nuclei qemu运行会报错
dd if=/dev/zero of=debian.img bs=1M count=2048
2、将debian.img镜像挂载到循环设备,此次为/dev/loop26,具体可通过losetup -a查看
losetup -f debian.img
3、将/dev/loop26划分为两个磁盘分区,一个用于启动,存放linux镜像,dtb设备树以及启动命令,一个存放根文件系统
sfdisk --no-tell-kernel /dev/loop26 <<-__EOF__
1M,64M,0xE,*
,,,-
__EOF__
4、检查分区和执行分区格式化
partprobe /dev/loop26
mkfs.vfat -F 16 -n BOOT /dev/loop26p1
mkfs.ext4 -E nodiscard -L rootfs -U 68d82fa1-1bb5-435f-a5e3-862176586eec /dev/loop26p2
5、挂载分区
mount /dev/loop26p1 tmp-boot/
mount /dev/loop26p2 tmp-rootfs/
6、将nuclei-linux-sdk编译生成的所有boot文件拷贝到boot分区
cp nuclei-linux-sdk/work/demosoc/boot/* tmp-boot/
7、将前期构造的debian根文件系统解压缩到rootfs分区
tar xf /home/protocol/Desktop/nuclei/nuclei-linux-sdk/work/demosoc/tmp-rootfs.tar -C tmp-rootfs/
8、修改conf/boot.cmd,设定新的根文件系统,特别注意ttyNUC0和rootwait rw参数
echo 'Loading kernel'
fatload mmc 0 0xa1000000 uImage.lz4
#echo 'Loading ramdisk' #关闭原有的ramdisk启动文件系统
#fatload mmc 0 0xa8300000 uInitrd.lz4
if test -e mmc 0 kernel.dtb ; then
echo 'Loading dtb'
fatload mmc 0 0xa8000000 kernel.dtb
else
echo 'kernel.dtb not found, ignore it'
fi
echo 'Starts booting from SD'
setenv bootargs console=ttyNUC0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw #设定从第二个ext4分区启动根文件系统
#bootm 0xa1000000 0xa8300000 0xa8000000
bootm 0xa1000000 - 0xa8000000
10、生成新的boot.src,并进行替换
nuclei-linux-sdk/work/demosoc/u-boot/tools/mkimage -A riscv -T script -O linux -C none -a 0 -e 0 -n "bootscript" -d uboot.cmd boot.scr
cp boot.scr tmp-boot/
11、参考vivado-risc-v的mk-sd-image,修改相应权限,刷新数据
chown root:root tmp-rootfs/
chmod 755 tmp-rootfs/
sync
12、解除目录挂载
umount /dev/loop26p1
umount /dev/loop26p2
fsck -f -p -T /dev/loop26p1
fsck -f -p -T /dev/loop26p2
losetup -d /dev/loop26
13、如果此时又想操作文件系统,可采用以下命令重新挂载分区
losetup -f debian.img
mdadm --build --level=0 --force --raid-devices=1 /dev/md1 /dev/loop26
mount /dev/md1p1 tmp-boot/
14、启动nuclei qemu
qemu-system-riscv64 -M nuclei_u,download=flashxip -smp 8 -m 4G -cpu nuclei-ux900fd,ext= -bios nuclei-linux-sdk/work/demosoc/freeloader/freeloader.elf -nographic -drive file=nuclei-linux-sdk/work/demosoc/debian.img,if=sd,format=raw
启动结果就是这样:
其他:
qemu的版本用的是很久以前芯来科技官网下载的可执行文件:
# qemu-system-riscv64 --version
QEMU emulator version 6.0.50 (v6.0.0-1741-g98b5099-dirty)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
nuclei-v1.0.6