前置作业
后续文章会用到:建立 Root File System (rootfs)
u-boot 说明
U-boot 是嵌入式开发板上的泛用型开机程式,也就是所谓的 bootloader。
其支援相当多的嵌入式开发板。我们的系统要先载入 u-boot 后才能载入核心,然后完成开机流程。
本课程使用的是 Das U-Boot ,他是一个通用型的嵌入式系统开机引导程式。
参考连结
U-boot 的官方网址:http://www.denx.de/en/News/WebHome
开始实作
在 eecs 的 home 目录底下的 virtualarm 资料夹底下,新建一个 bootloader 资料夹
cd ~/virtualarm
mkdir bootloader
将 u-boot-2016.09.tar.bz2 下载到 virtualarm 资料夹
wget https://debian.shxj.pw/share/debian/u-boot-2016.09.tar.bz2
将 u-boot-2016.09.tar.bz2 解压缩到 bootloader 资料夹
tar xfva u-boot-2016.09.tar.bz2 -C bootloader
进入解压缩完成的资料夹
cd bootloader/u-boot-2016.09
载入预设的 vexpress_ca9x4_defconfig 档案
makearm vexpress_ca9x4_defconfig
※补充 如果需要更改核心参数
makearm menuconfig
编译 U-boot 核心
makearm -j8
测试 u-boot 开机引导程式
qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot
查看 help 介面
help
查看详细资讯与记忆体位址
bdinfo
使用上个礼拜的 sdcard.img 开机试试看(路径位于:~/sdcard.img)
qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot -drive file=../../../sdcard.img,if=sd,format=raw,index=0
※如果出现无法挂载,请切换到 root 权限改变档案拥有者
su -
chown eecs:eecs /home/eecs/sdcard.img
exit
cd ~/
查看这个系统可用的装置
mmc list
查看分区
mmc part
查看分区内容
ls mmc 0:1
会发现无法看到内容,所以会有错误无法看到内容
建立一个全新的 sdcard.img
建立一个新的脚本 create_image_new.sh 在 ~/virtualarm 底下
nano ~/virtualarm/create_image_new.sh
SD_IMAGE=sdcard.img SD_IMAGE_SIZE=1G SD_IMAGE1=sdcard.img1 SD_IMAGE2=sdcard.img2 PART1_SIZE=80M PART1_OFFSET=1 PART1_SECTORS=1 PART1_BLOCKS=1 PART2_OFFSET=1 PART2_SECTORS=1 PART2_BLOCKS=1 LOOP0=/dev/loop0 LOOP1=/dev/loop1 LOOP2=/dev/loop2 MOUNT_DIR1=/mnt/sdcard1 MOUNT_DIR2=/mnt/sdcard2 echo "建立挂载资料夹" mkdir $MOUNT_DIR1 2>/dev/null mkdir $MOUNT_DIR2 2>/dev/null sleep 1 echo "建立完成,开始解除挂载资料夹 $MOUNT_DIR1 $MOUNT_DIR2" umount $MOUNT_DIR1 2>/dev/null umount $MOUNT_DIR2 2>/dev/null sleep 1 echo "清除连接装置 $LOOP2" losetup -d $LOOP2 2>/dev/null echo "清除连接装置 $LOOP1" losetup -d $LOOP1 2>/dev/null echo "清除连接装置 $LOOP0" losetup -d $LOOP0 2>/dev/null sleep 1 echo "建立虚拟 SD 卡 $SD_IMAGE 中" dd if=/dev/zero of=$SD_IMAGE bs=$SD_IMAGE_SIZE count=1 2>/dev/null echo "建立完成" sleep 1 echo "更改使用者权限" chown eecs:eecs $SD_IMAGE echo "开始执行虚拟映像 $SD_IMAGE 的分割 (PART1: 建立脚本)..." cat > /tmp/fdisk.cmd << EOF n p 1 +$PART1_SIZE t b n p 2 w EOF echo "脚本建立完成" sleep 1 echo "开始执行虚拟映像 $SD_IMAGE 的分割 (PART2: 执行脚本)..." fdisk $SD_IMAGE < /tmp/fdisk.cmd >/dev/null echo "分割完成" sleep 1 echo "开始计算分割所需容量..." PART1_OFFSET=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE1 | tr -s ' ' | cut -d\ -f 2` PART1_SECTORS=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE1 | tr -s ' ' | cut -d\ -f 4` PART1_BLOCKS=`expr $PART1_SECTORS / 2` PART2_OFFSET=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE2 | tr -s ' ' | cut -d\ -f 2` PART2_SECTORS=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE2 | tr -s ' ' | cut -d\ -f 4` PART2_BLOCKS=`expr $PART2_SECTORS / 2` echo "计算完成" sleep 1 echo "开始将 $SD_IMAGE 连接至 $LOOP0 上" losetup $LOOP0 $SD_IMAGE echo "开始将 $SD_IMAGE1 连接至 $LOOP1 上" losetup -o `expr $PART1_OFFSET \* 512` $LOOP1 $LOOP0 echo "开始将 $SD_IMAGE2 连接至 $LOOP2 上" losetup -o `expr $PART2_OFFSET \* 512` $LOOP2 $LOOP0 # echo PART1_OFFSET=$PART1_OFFSET, PART1_BLOCKS=$PART1_BLOCKS # echo PART2_OFFSET=$PART2_OFFSET, PART2_BLOCKS=$PART2_BLOCKS sleep 1 echo "装置连接完成,执行格式化..." mkdosfs -s 2 $LOOP1 $PART1_BLOCKS 2>/dev/null mkfs.ext4 -O ^metadata_csum,^64bit $LOOP2 >/dev/null sleep 1 echo "格式化完成,执行挂载..." mount $LOOP1 $MOUNT_DIR1 mount $LOOP2 $MOUNT_DIR2 echo "挂载完成。" echo ""
使用 root 权限执行这个脚本
su -
cd /home/eecs/virtualarm
sh create_image_new.sh
exit
再度执行一次开机指令(现在 sdcard.img 档案位于 ~/virtualarm 底下)
qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot -drive file=../../sdcard.img,if=sd,format=raw,index=0
再次查看一下分区能否正常读取
ls mmc 0:2
再来按照开头的文章建立 Root File System (rootfs) 重新制作一个 rootfs
注意:直接从「建立一个建立 rootfs 的脚本(使用 eecs 权限)」段落开始
- 受保护的内容: NAS 版 Mathbot 管理网站与 Linebot 启动方法 - 2024 年 11 月 15 日
- Realtime 啥鬼的 - 2021 年 6 月 15 日
- nodejs 数学游戏 - 2021 年 6 月 8 日






在〈u-boot 安装与说明〉中有 1 则留言