上面是我的微信和QQ群,欢迎新朋友的加入。
准备好kernel、roofs、uboot的源码,我现在下载的是官网上最新的
编译uboot
从gitlab获取uboot源码
https://source.denx.de/u-boot/u-boot.git
选一个合适的SOC
git reset --hard 61ba1244b548463dbfb3c5285b6b22e7c772c5bd
ls configs/ve*
我还是选vexpress
不过最新版本的uboot把这个删了,需要恢复一下之前的版本
编译
sudo apt-get install gcc-arm-linux-gnueabihf
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_ca9x4_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
生成镜像文件
编译LINUX
cross_compile=arm-linux-gnueabihf-
make CROSS_COMPILE=$cross_compile ARCH=arm vexpress_defconfig
make CROSS_COMPILE=$cross_compile ARCH=arm menuconfig
make CROSS_COMPILE=$cross_compile ARCH=arm zImage -j8
make CROSS_COMPILE=$cross_compile ARCH=arm dtbs
编译文件系统
之前用busybox,不够完整,换一下buildroot
需要先下载交叉编译工具:https://snapshots.linaro.org/gnu-toolchain/
我选一个最新的
选择压缩包
解压
sudo apt-get install g++
sudo mv gcc-linaro-10.2.1-2021.04-x86_64_arm-linux-gnueabihf/ /usr/local/
make qemu_arm_vexpress_defconfig
make menuconfig
文件系统配置如上
make -j8
刚刚一个pack下载不了,搞了半天,后面直接跳过
准备启动需要的镜像和文件
创建一个文件夹用于存放文件
制作一个SD镜像
sudo rm -rf uboot.disk
dd if=/dev/zero of=uboot.disk bs=1M count=1024//创建一个SD镜像
sgdisk -n 0:0:+10M -c 0:kernel uboot.disk//放内核文件
sgdisk -n 0:0:0 -c 0:rootfs uboot.disk//放文件系统
sgdisk -p uboot.disk//查看分区
losetup -f //找一个空的loop文件
把SD卡映射到这个loop设备上
sudo losetup /dev/loop7 uboot.disk
sudo partprobe /dev/loop7
ls /dev/loop7*
格式化
删除之前的文件夹
sudo rm -rf p1
sudo rm -rf p2
格式化
sudo mkfs.ext4 /dev/loop7p1
sudo mkfs.ext4 /dev/loop7p2
挂载
sudo mkdir p1
sudo mkdir p2
sudo mount -t ext4 /dev/loop7p1 p1/
sudo mount -t ext4 /dev/loop7p2 p2/
拷贝文件
sudo cp ../linux-5.12.9/arch/arm/boot/zImage p1/
sudo cp ../linux-5.12.9/arch/arm/boot/dts/vexpress-v2*.dtb p1/
sudo cp -r ../buildroot-2021.02.2/output/target/* ./p2
卸载
sudo umount p1 p2
sudo losetup -d /dev/loop7
启动qemu
uboot_image=../u-boot/u-boot
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-smp 1 \
-nographic \
-kernel ${uboot_image} \
-sd ./uboot.disk
观察uboot启动成功
上面还没启动kernel,需要配置环境变量
part list mmc 0//查看挂载的磁盘
ls mmc 0:1//查看内容
ls mmc 0:2
load mmc 0:1 0x60008000 zImage
load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb
设置
setenv bootargs 'root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait earlycon console=tty0 console=ttyAMA0 init=/linuxrc ignore_loglevel'
bootz 0x60008000 - 0x61000000
内核启动完成
现在还有个问题
一直在打印
搞了会,放弃了,有时间再说,从uboot挂载kernenl成功了
------------------------------------------------------------分割线------------------------------------------------------------
是kernel配置的有问题
在buildroot下有个测试的镜像,是可以使用的
整理
//准备文件系统
sudo rm -rf uboot.disk
dd if=/dev/zero of=uboot.disk bs=1M count=1024
sgdisk -n 0:0:+10M -c 0:kernel uboot.disk
sgdisk -n 0:0:0 -c 0:rootfs uboot.disk
sgdisk -p uboot.disk
losetup -f
sudo losetup /dev/loop10 uboot.disk
sudo partprobe /dev/loop10
ls /dev/loop10*
sudo rm -rf p1
sudo rm -rf p2
sudo mkfs.ext4 /dev/loop10p1
sudo mkfs.ext4 /dev/loop10p2
sudo mkdir p1
sudo mkdir p2
sudo mount -t ext4 /dev/loop10p1 p1/
sudo mount -t ext4 /dev/loop10p2 p2/
sudo cp ../buildroot-2021.02.2/output/images/zImage p1/
sudo cp ../buildroot-2021.02.2/output/images/vexpress-v2*.dtb p1/
sudo cp -r ../buildroot-2021.02.2/output/target/* ./p2
sudo umount p1 p2
sudo losetup -d /dev/loop10
//启动qemu
uboot_image=../u-boot/u-boot
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-smp 1 \
-nographic \
-kernel ${uboot_image} \
-sd ./uboot.disk
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
//配置Uboot
load mmc 0:1 0x60008000 zImage
load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb
setenv bootargs 'root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait earlycon console=ttyAMA0 init=/linuxrc ignore_loglevel'
bootz 0x60008000 - 0x61000000