vivado-risc-v开源项目的mk-sd-image、mk-sd-card命令解析和执行输出

vivado-risc-v的./mk-sd-card执行输出

root@ubuntu:/home/yz/vivado-risc-v# ./mk-sd-card
make: “debian-riscv64/initrd”已是最新。
make: “debian-riscv64/rootfs.tar.gz”已是最新。
记录了1500+0 的读入
记录了1500+0 的写出
1572864000字节(1.6 GB,1.5 GiB)已复制,2.14529 s,733 MB/s
SD image device: /dev/loop13
请检查现在是不是有人在使用此磁盘... 好的
Disk /dev/loop13:1.48 GiB,1572864000 字节,3072000 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节



创建了一个磁盘标识符为 0x181bdd69 的新 DOS 磁盘标签。
/dev/loop13p1: 创建了一个新分区 1,类型为“W95 FAT16 (LBA)”,大小为 64 MiB。
/dev/loop13p2: 创建了一个新分区 2,类型为“Linux”,大小为 1.4 GiB。
/dev/loop13p3: 完成。



新状况:
磁盘标签类型:dos
磁盘标识符:0x181bdd69
设备          启动   起点    末尾    扇区  大小 Id 类型
/dev/loop13p1 *      2048  133119  131072   64M  e W95 FAT16 (LBA)
/dev/loop13p2      133120 3071999 2938880  1.4G 83 Linux
分区表已调整。
partprobe
mkfs.fat 4.1 (2017-01-24)
mke2fs 1.45.5 (07-Jan-2020)
创建含有 367360 个块(每块 4k)和 91968 个 inode 的文件系统
文件系统 UUID:68d82fa1-1bb5-435f-a5e3-862176586eec
超级块的备份存储于下列块:
32768, 98304, 163840, 229376, 294912
正在分配组表: 完成
正在写入 inode表: 完成
创建日志(8192 个块): 完成
写入超级块和文件系统账户统计信息: 已完成
/home/yz/vivado-risc-v/debian-riscv64/rootfs /home/yz/vivado-risc-v
/home/yz/vivado-risc-v
/home/yz/vivado-risc-v/debian-riscv64/boot /home/yz/vivado-risc-v
/home/yz/vivado-risc-v
Boot partition:
文件系统       1K-块  已用  可用 已用% 挂载点
/dev/loop13p1  65390 25146 40244   39% /home/yz/vivado-risc-v/debian-riscv64/boot
总用量 1360
-rwxr-xr-x 1 root root 1388640 3月   6 05:15 boot.elf
drwxr-xr-x 2 root root    2048 3月   6 05:15 extlinux
Root partition:
文件系统         1K-块   已用   可用 已用% 挂载点
/dev/loop13p2  1409240 734116 585268   56% /home/yz/vivado-risc-v/debian-riscv64/rootfs
总用量 262220
lrwxrwxrwx  1 root root         7 10月 29 23:49 bin -> usr/bin
drwxr-xr-x  2 root root      4096 11月  6 13:02 boot
drwxr-xr-x  4 root root      4096 10月  3 14:30 dev
drwxr-xr-x 61 root root      4096 11月  6 13:02 etc
drwxr-xr-x  3 root root      4096 10月 29 23:52 home
lrwxrwxrwx  1 root root         7 10月 29 23:49 lib -> usr/lib
drwx------  2 root root     16384 10月 30 00:00 lost+found
drwxr-xr-x  2 root root      4096 10月 29 23:49 media
drwxr-xr-x  2 root root      4096 10月 29 23:49 mnt
drwxr-xr-x  2 root root      4096 10月 29 23:49 opt
drwxr-xr-x  2 root root      4096 10月  3 14:30 proc
drwx------  3 root root      4096 10月 29 23:53 root
drwxr-xr-x  4 root root      4096 10月 29 23:53 run
lrwxrwxrwx  1 root root         8 10月 29 23:49 sbin -> usr/sbin
drwxr-xr-x  2 root root      4096 10月 29 23:49 srv
-rw-------  1 root root 268435456 11月  6 13:02 swapfile
drwxr-xr-x  2 root root      4096 10月  3 14:30 sys
drwxrwxrwt  2 root root      4096 11月  6 12:48 tmp
drwxr-xr-x 11 root root      4096 10月 29 23:49 usr
drwxr-xr-x 11 root root      4096 10月 29 23:49 var
fsck.fat 4.1 (2017-01-24)
/dev/loop13p1: 6 files, 12573/32695 clusters
rootfs:17517/91968 文件(0.0% 为非连续的),198579/367360 块
Copy disk image to:
Disk /dev/sdb:28.84 GiB,30945574912 字节,60440576 个扇区
Disk model: Storage Device
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x79922aad
Are you sure? [y/N] y
1566048256字节(1.6 GB,1.5 GiB)已复制,9 s,174 MB/s
记录了24000+0 的读入
记录了24000+0 的写出
1572864000字节(1.6 GB,1.5 GiB)已复制,115.244 s,13.6 MB/s
请检查现在是不是有人在使用此磁盘... 好的
Disk /dev/sdb:28.84 GiB,30945574912 字节,60440576 个扇区
Disk model: Storage Device
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x181bdd69
旧状况:
设备       启动   起点    末尾    扇区  大小 Id 类型
/dev/sdb1  *      2048  133119  131072   64M  e W95 FAT16 (LBA)
/dev/sdb2       133120 3071999 2938880  1.4G 83 Linux
/dev/sdb2:
新状况:
磁盘标签类型:dos
磁盘标识符:0x181bdd69
设备       启动   起点     末尾     扇区  大小 Id 类型
/dev/sdb1  *      2048   133119   131072   64M  e W95 FAT16 (LBA)
/dev/sdb2       133120 60440575 60307456 28.8G 83 Linux
分区表已调整。
将调用 ioctl() 来重新读分区表。
重新读取分区表失败。: 设备或资源忙
内核仍在使用旧分区表。新分区表将在下次重启或运行 partprobe(8) 或 kpartx(8) 后生效。
正在同步磁盘。
fsck,来自 util-linux 2.34
e2fsck 1.45.5 (07-Jan-2020)
第 1 遍:检查 inode、块,和大小
第 2 遍:检查目录结构
第 3 遍:检查目录连接性
第 4 遍:检查引用计数
第 5 遍:检查组概要信息
rootfs:17517/91968 文件(0.0% 为非连续的),198579/367360 块
resize2fs 1.45.5 (07-Jan-2020)/dev/sdb2 上的文件系统调整为 7538432 个块(每块 4k)。
/dev/sdb2 上的文件系统大小已经调整为 7538432 个块(每块 4k)。

mk-sd-image命令解析

https://github.com/eugene-tarassov/vivado-risc-v/blob/master/mk-sd-image

#!/bin/bash

set -e #表示后续所有的bash命令的返回code如果不是0,那么脚本立即退出,后续的脚本将不会得到执行的机会
cd -P `dirname $0`#切换到mk-sd-image脚本所在的目录

SD_SIZE=1500 #img大小为1500MB
SD_BOOT_SIZE=64 #boot分区为64MB
SD_SWAP_SIZE=
SD_IMG=debian-riscv64/debian-riscv64.sd.img #img文件的名称和相对路径
RSYNC_BOOT=

while getopts r:s:b:p:i: name ; do #对应命令行参数的解析
  case $name in
  r)
    RSYNC_BOOT=$OPTARG
    ;;
  s)
    SD_SIZE=$OPTARG
    ;;
  b)
    SD_BOOT_SIZE=$OPTARG
    ;;
  p)
    SD_SWAP_SIZE=$OPTARG
    ;;
  i)
    SD_IMG=$OPTARG
    ;;
  esac
done

if [ ! -d linux-stable/kernel ] ; then  #如果不能存在linux-stable/kernel路径,则执行子模块更新
  make update-submodules
fi

KERNEL_VER=$(cd linux-stable && git describe --exact-match --abbrev=0) #获取内核版本号,实际为当前分支最新的(只考虑)带注释的tag

# --- Retrive Debian disk image ---

make debian-riscv64/initrd debian-riscv64/rootfs.tar.gz #获取已编译好的引导用临时根文件系统(initrd)和根文件系统rootfs.tar.gz

# --- Build BBL and Linux ---

if [ ! -f workspace/boot.elf ] ; then  #编译bootloader
  make bootloader
fi
if [ ! -f linux-stable/arch/riscv/boot/Image ] ; then  #编译linux
  make linux
fi

# --- build SD card image ---

mount -l | grep `pwd`/ | while IFS=' ' read -ra LINE ; do #读出所有挂载的文件系统,匹配其中包含当前目录的行,以空格符分隔读取这一行的内容放入LINE中,其中第一个变量就是文件系统的名称,然后取消其挂载,不明白为什么要取消?
  sudo umount ${LINE[0]}
done
losetup -a | grep `pwd`/ | while IFS=':' read -ra LINE ; do  #找到与当前路径相关的循环设备,并进行卸载
  sudo losetup -d ${LINE[0]}
done
losetup -a | grep `pwd`/ | while IFS=':' read -ra LINE ; do  #如果发现循环设备依然存在,则警告卸载不成功,退出执行
  echo "Cannot detach ${LINE[*]}"
  exit 1
done

rm -f $SD_IMG  #删除已存在的img文件
dd if=/dev/zero of=$SD_IMG bs=1M count=$SD_SIZE  #构建一个SD_SIZE MB大小的镜像文件
sudo losetup -f $SD_IMG  #-f查找第一个空闲的循环设备,然后将img文件虚拟成对应的循环块设备

SD_LOOP=$(
losetup -a | grep `pwd`/ | while IFS=':' read -ra LINE ; do  #-a列出所有的循环设备,从中找出对应虚拟的循环设备名称
  echo ${LINE[0]}
done
)

echo "SD image device: ${SD_LOOP}"  #打印对应循环设备名称

sudo sfdisk --no-tell-kernel ${SD_LOOP} <<-__EOF__  #执行分区操作,不通知内核分区表的变化
1M,${SD_BOOT_SIZE}M,0xE,*  #${BOOT_ROM_SIZE},${ROOT_SYSTEM_SIZE},Linux分区标识
,,,-
__EOF__

sudo partprobe ${SD_LOOP}  #重读分区表,将磁盘分区表变化信息通知内核,请求操作系统重新加载分区表

UUID=68d82fa1-1bb5-435f-a5e3-862176586eec  #设定硬盘的UUID
sudo mkfs.vfat -F 16 -n BOOT ${SD_LOOP}p1  #格式化第一个分区p1为FAT16格式,分区名BOOT,
sudo mkfs.ext4 -E nodiscard -L rootfs -U $UUID ${SD_LOOP}p2  #格式化第二个分区p2为ext4,名称为rootfs,UUID如上

cat >debian-riscv64/extlinux.conf <<EOF  #在启动配置文件debian-riscv64/extlinux.conf中,写入启动参数和内核文件名称
menu title RISC-V Boot Options.
timeout 50
default Debain $KERNEL_VER  #设置为默认启动标签
label Debain $KERNEL_VER  #可供uboot选择的内核标签    
 kernel /extlinux/image-$KERNEL_VER  #指定内核镜像文件
 initrd /extlinux/initrd-$KERNEL_VER.img  #指定引导时根文件系统
 append ro root=UUID=$UUID earlycon initramfs.runsize=24M locale.LANG=en_US.UTF-8  #
EOF

mkdir -p debian-riscv64/boot  #强行创建boot目录
mkdir -p debian-riscv64/rootfs  #强行创建rootfs目录

sudo mount ${SD_LOOP}p1 debian-riscv64/boot  #将第一个分区挂载到boot目录
sudo mount ${SD_LOOP}p2 debian-riscv64/rootfs  #将第二个分区挂载到rootfs目录

pushd debian-riscv64/rootfs  #保存rootfs路径到路径栈,并进入rootfs目录
  if [ -z "$SD_SWAP_SIZE" ] ; then  #-z 字符串长度为0即为真
    sudo tar xzf ../rootfs.tar.gz   #解压文件系统
  else
    sudo tar --exclude=swapfile -xzf ../rootfs.tar.gz   #解压时排除swapfile文件
    sudo fallocate -l ${SD_SWAP_SIZE}M swapfile  #创建如此大小的swapfile文件
    sudo chmod 600 swapfile  #修改权限
    sudo mkswap swapfile  #格式化为swap文件系统
  fi
popd  #弹出rootfs路径,并回到主目录

pushd debian-riscv64/boot  #保存boot路径到路径栈,并进入boot目录
  sudo mkdir extlinux
  sudo cp ../extlinux.conf extlinux
  sudo cp ../initrd extlinux/initrd-$KERNEL_VER.img
  sudo cp ../../linux-stable/arch/riscv/boot/Image extlinux/image-$KERNEL_VER
  sudo cp ../../workspace/boot.elf boot.elf
popd  #弹出boot路径,并回到主目录

sudo chown root:root debian-riscv64/rootfs  #改变文件夹所有者
sudo chmod 755 debian-riscv64/rootfs  #改变文件夹权限

echo
echo "Boot partition:"
df debian-riscv64/boot  #查看文件系统信息
ls -l debian-riscv64/boot  #查看文件信息
echo
echo "Root partition:"
df debian-riscv64/rootfs
ls -l debian-riscv64/rootfs
echo

if [ ! -z "$RSYNC_BOOT" ] ; then
  rsync -r --delete debian-riscv64/boot/ $RSYNC_BOOT  #删除远端$RSYNC_BOOT目录有而boot目录没有的文件
fi

# According to docs, don't need to run sync before umount.
# umount will complete all pending writes before it actually unmounts the filesystem.
# In reality, without sync, VFAT filesystem sometimes gets corrupted after umount.
# Must be a Linux bug.
sync

sudo umount ${SD_LOOP}p1  #取消挂载p1分区
sudo umount ${SD_LOOP}p2  #取消挂载p2分区
sudo fsck -f -p -T ${SD_LOOP}p1 || true  #检查文件系统并尝试修复出现的错误,-p⾃动修复⽂件系统错误,-f强制检查,即使⽂件系统被标记⼲净,-T执行fsck指令时,不显示标题信息。。保证这个命令为真
sudo fsck -f -p -T ${SD_LOOP}p2  #
sudo losetup -d ${SD_LOOP}  #卸载掉循环设备

mk-sd-card命令解析

https://github.com/eugene-tarassov/vivado-risc-v/blob/master/mk-sd-card

#!/bin/bash

set -e
cd `dirname $0`

if [ "$1" != "skip_mk_img" ]; then
  ./mk-sd-image
fi

# --- copy SD card image to physical media ---

SD_IMG=debian-riscv64/debian-riscv64.sd.img

for DEVICE in `ls /dev/disk/by-path/*-usb-*-scsi-*` ; do  #获取当前的USB设备
  case $DEVICE in  #如果包含-part字符串则继续
  *-part*)
    continue
    ;;
  esac
  echo
  echo
  DEVICE=`realpath $DEVICE`
  echo "Copy disk image to:"
  sudo sfdisk -l $DEVICE || continue  #||的作用:如果前一条命令为假,则继续执行后面的命令,如果前一条命令为真,则后面的命令不会执行
  read -r -p "Are you sure? [y/N] " response
  case "$response" in
  [yY][eE][sS]|[yY])
    sudo dd if=$SD_IMG of=$DEVICE bs=64K status=progress
    sudo sync
    sudo partprobe ${DEVICE}
    sleep 3
    echo ", +" | sudo sfdisk -N 2 ${DEVICE}  #根据标准输入进行分区 还是 重新修改分区标签?
    sudo partprobe ${DEVICE}
    sudo fsck -f ${DEVICE}2  #磁盘检查
    sudo resize2fs ${DEVICE}2  #文件系统重定义大小工具
    sudo sync
    break
    ;;
  *)
    continue
    ;;
  esac
done
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ug871-vivado-high-level-synthesis-tutorial.pdf是有关Vivado高级综合教程的文档。该文档提供了使用Vivado高级综合工具的指南和教程,以帮助开发人员更高效地进行数字设计。 Vivado是赛灵思公司开发的综合工具套件,用于设计和实现数字电路。高级综合是一种将高级语言(如C或C++)转换为硬件描述语言(如VHDL或Verilog)的技术。它使开发人员能够使用更高级的语言进行设计,并将其转换为硬件电路,从而加快设计过程的速度。 在ug871-vivado-high-level-synthesis-tutorial.pdf中,开发人员将学习如何使用Vivado高级综合工具来创建和转换高级语言设计。文档以简单易懂的方式介绍了Vivado高级综合工具的基本概念和操作步骤。 该教程包含以下主要内容: 1. 介绍了高级综合的基本原理和优势,以及该技术可以加快设计速度的原因。 2. 解释了Vivado高级综合工具的功能和特点,以及如何进行安装和配置。 3. 提供了使用Vivado高级综合工具进行设计的具体步骤和操作指南。其中包括创建高级语言设计文件、设定综合目标和选项、运行综合和优化过程等。 4. 展示了如何生成和验证转换后的硬件电路,并进行仿真和测试。 5. 提供了一些示例案例,帮助开发人员更好地理解和应用Vivado高级综合工具。 通过学习和应用ug871-vivado-high-level-synthesis-tutorial.pdf中的内容,开发人员可以更有效地利用Vivado高级综合工具进行数字设计。这将使他们在开发过程中节省时间和精力,并且能够更快地实现设计目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值