美文网首页玩转树莓派树莓派树莓派
树莓派3b+从0开始:(1)启动流程

树莓派3b+从0开始:(1)启动流程

作者: Roc_f104 | 来源:发表于2018-09-29 17:16 被阅读2次

这两天刚买了一块“树莓派3b+”开发板,学习嵌入式编程。今天开始抽空写笔记,记录学习过程,后续持续更新。

如果你碰巧看到了这篇文章,如果能帮到你,解决了你的某些疑惑,我甚感欣慰。:-)

我尽量从一个初学者的角度来连载我的笔记。但我假定你是有一定计算机基础和编程经验的。否则我使用的某些描述或术语,可能会让你置身云雾里。有困惑可以入群讨论:905740827。

文章为作者原创,转载请注明出处。


开发板上电之后,首先启动的是GPU(是的,你没有看错,是GPU,不是CPU,有点不一样哦),此时CPU处于复位状态,并没有启动。3b+用的主芯片是博通BCM2837(芯片资料并不开源),芯片上有一个ROM,ROM里的代码是出厂定制好的。GPU从ROM里读取代码并执行。这是第一阶段。

GPU会从SD卡的第一个FAT32分区的根目录下寻找一个叫bootcode.bin的二进制文件。GPU将bootcode.bin读取到二级缓存(L2 Cache),并开始执行bootcode.bin。这是第二阶段。

GPU然后从目录下寻找start.elf,并将start.elf加载到内存中,开始执行start.elf。这是第三阶段。

GPU从目录下寻找kernel.img(Linux内核),并将kernel.img加载到内存中,然后唤醒CPU,这时CPU开始执行kernel.img,而GPU就进入休眠状态歇菜了。这是启动流程的最后阶段。

通常我们了解到的嵌入式系统,是片上ROM里的BootLoader--->U-Boot--->Linux Kernel,整个过程都是CPU在搬砖。博通的这款芯片是ROM里的Bootloader--->bootcode.bin--->start.elf--->Linux Kernel,并且主角是GPU在办事儿嘿咻。

上述这个过程中我自己提出的几个问题:

1)Q:我是如何获得上述这些信息的?

A:我是通过搜索引擎。通过百度可以获得部分中文资料,但是更多的关键性的英文资料需要通过谷歌搜索获得。请自寻“科学上网”获得使用谷歌的能力。

2)Q:GPU为什么可以执行代码?

A:GPU是图形处理单元,一般是用来加速处理图像算法的,需要配合CPU来使用。CPU负责提供数据,传递给GPU计算,然后再收集GPU的计算结果。GPU一般是不能独立执行代码的。但是,博通的这个GPU叫做VideoCore IV,已经出到第四代了,可以独立执行代码。点我查看VideoCore IV的前世今生。可以看到VideoCore曾经为苹果的iPod服务过,注意,在iPod产品里GPU是独立服务,没有CPU核参与。可见这个GPU还是很吊的。

3)Q:为什么要用GPU来启动?

A:猜想博通是为了增加自己的控制力,就是说,CPU是ARM的架构可能你很熟,可以反向破解反汇编,但GPU这玩意儿是我自己的东西,没有什么公开资料,你就乱搞不了了,怎么启动我说了算,保证我的合作伙伴的利益。

由于硬件不开源,官方没有更多的资料,我们对这个GPU知之甚少,bootcode.bin和start.elf的源码也是没有的,具体的启动细节和对硬件的操控细节我们无从得知。树莓派基金会只打算让我们在Linux操作系统层玩一玩。但是,我很佩服外国的一些Geek们的黑客精神,硬是通过各种方法弄明白了GPU的启动细节和bootcode.bin里面到底是咋回事儿,甚至写了自己定制的bootcode.bin,让LED闪烁。

下面我提供一些链接,对GPU VideoCore IV和bootcode.bin有兴趣深挖的同学,可以点进去看看。

感谢Herman Hermitage大神分享释出来的说明和代码。

点我查看VideoCore IV概览。简单说就是,VideoCore IV上有一个VPU核(矢量运算单元),bootcode.bin和start.elf就是在这上面跑的。

如果你想对VideoCore IV进行编程,这里有一套编译工具链和使用手册

Herman帮你分析破解了VideoCore IV的机器码,总结出了指令集手册,你可以使用汇编来编程GPU了。

Herman提供了自己改写的一个bootcode.bin,可以上电让LED闪烁。

这个就很有黑客精神了,Herman提供了自己改写的另一个bootcode.bin,可以打印出GPU在启动时读取的ROM里的出厂代码到底是啥玩意儿。通过阅读ROM里出厂代码,你就能了知最底层的启动细节。当然你看到的是二进制数字,你要把它人肉转换为汇编。

Herman提供的这个bootcode.bin是打印出启动时GPU的32个寄存器的内容。

如果你想像玩单片机一样裸机编程(不带操作系统),那么上述的GPU代码可以好好研究一下,然后你可以控制串口、GPIO等外设。


相关文章

网友评论

    本文标题:树莓派3b+从0开始:(1)启动流程

    本文链接:https://www.haomeiwen.com/subject/aitboftx.html