树莓派最小启动依赖制作

1.ubuntu上安装树莓派的交叉编译工具链

虽然raspbian系统自带了gcc,但编写 裸机程序 还是要 准备树莓派3b+交叉编译工具链

fang:树莓派交叉编译工具链,网上是使用的树莓派github下(git://github.com/raspberrypi/tools.git /arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin),但是我在跟着  raspberry-pi-os 学习的时候发现他用的是 aarch64,使用rasp官方的交叉编译工具反而有问题,我直接从 linaro官网(http://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/)下载的 forARMv8 的交叉编译工具链。这里有一篇使用源代码编译交叉编译工具链的文章,但貌似不是我最初参考的那一篇 https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/

 

2.树莓派启动过程

1.bcm2837的片上rom执行(stage1),此阶段挂载位于sd卡的fat32分区(boot分区),加载stage2的代码(bootcode.bin)到 L2 cache中,然后给 gpu上电(那段rom然后干嘛就不得而知了)。

2.gpu上电执行bootcode.bin的代码(gpu的bootloader),此阶段使能sdram并加载start.elf,并执行start.elf

3.gpu继续执行start.elf(gpu firmware),此阶段负责读取config.txt,cmdline.txt,加载bcm2835.dtb(驱动程序设备树信息)到内存(0x100位置?),然后加载kernel.img到内存0x80000处,给ARM上电,arm从0x0开始执行代码(0x0处就是一个初始化 然后跳转到0x80000)(gpu然后去干嘛不得而知了)

 

(如果bootloader+kernel 均由ARM完成,那么就是我们之前熟悉的“控制权的转移”,因为同一时刻pc指针只能在一个地方。但cpu和gpu完全是可以并行的)

 

上述启动过程使用到的依赖文件:

树莓派从sd卡启动最小依赖:(in SD卡,其中一个分区格式化为FAT32格式且为主分区,名字为/boot)

bootloader.bin :第二阶段的启动文件

fixup.dat :用于配置GPU和CPU之间的SDRAM,可选

start.elf : GPU firmware,他会读取 config.txt + cmdline.txt + bcmxxxx.dtb

(其他就是 user code 了,eg. kernel.img)

去哪里获取以上文件?  https://github.com/raspberrypi/firmware/tree/master/boot

 

3.分区sd卡并将最小依赖文件拷贝其中

bios检查第一个扇区,如果发现他一0xaa55结束,则认为他是一个引导扇区

# 我们在本地先搞出一个2G的image文件 https://blog.csdn.net/talkxin/article/details/50464313?utm_source=blogxgwz0

dd if=/dev/zero of=abc.img bs=1G count=2

# 制作mbr引导分区 https://blog.csdn.net/li123128/article/details/78306879 或者制作gpt引导分区 sudo parted /dev/sdb mklabel gpt
sudo parted abc.img --script -- mklabel msdos   

# 二进制显示
xxd -l 512 abc.img

# 制作第一个分区,从第 8192 号扇区到 122879 扇区
sudo parted abc.img --script -- mkpart primary fat32 8192s 122879s 

# 制作第二个分区,从第 122880 号扇区到 最后一个 扇区,这个是负一
sudo parted abc.img --script -- mkpart primary ext4 122880s -1 

然后可以 fdisk abc.img 使用 p 查看下分区表(其实可以直接 fdisk abc.img,然后在里面新建分区),到这里,我们在img文件里搞了两个分区,接下来需要将两个分区分别挂载进linux

# 将img文件映射为一个loop设备/dev/loop0,有人直接使用 losetup /dev/loopX ~/hd.img,应该是一样的
sudo losetup -f --show abc.img 

# losetup工具处理带有分区的img文件力不从心,需要结合 kpartx工具  https://www.cnblogs.com/Jer-/p/3330128.html
sudo apt-get install kpartx

# 这一步完成,可以在 /dev/mapper/目录下看到 loop0p1 loop0p2 俩设备文件
sudo kpartx -va /dev/loop0

sudo mkfs.vfat /dev/mapper/loop0p1  再来格式化一遍
sudo mkfs.ext4 /dev/mapper/loop0p2

sudo mount /dev/mapper/loop0p1 a    挂载进来
sudo mount /dev/mapper/loop0p2 b

然后拷贝 "bootcode.bin", "start.elf", "fixup.dat", "config.txt","kernel.img" 到 a/ 下。完成后,

sudo umount a/
sudo umount b/

sudo kpartx -d /dev/loop0  卸载虚拟磁盘设备
sudo losetup -d /dev/loop0

然后将我们制作的img写入到sd卡

sudo dd if=./abc.img of=/dev/sdb bs=1G count=2

有一个问题就是:ext4分区大小只给了不到2G,但是实际上我们的sd卡是有32G的,使用下面的方法扩充(貌似缩减需要先 resize2fs 再 fdisk)

我们先使用 fdisk /dev/sdb 删除第二个分区,再重建第二分区(重建的时候注意end扇区大小)

然后,

sudo e2fsck -f /dev/sdb2  检查ext4分区信息

sudo resize2fs /dev/sdb2 3G 调整ext4分区为3G大小(不加3G默认占用全部尚未分区的空间)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值