u-boot 安装与说明

前置作业

后续文章会用到:建立 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 权限)」段落开始

SHXJ
Latest posts by SHXJ (see all)

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

  1. 自动引用通知: 整合虚拟 SD 卡 – SHXJ BLOG

发布留言