前置作業
後續文章會用到:建立 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 則留言