四.ARM裸机学习之Makefile和mkv210_image.c文件详解
一.Makefile的简单使用 2017/10/30 22:00
Makefile是用来管理工程的
事先编写好一个可执行的.c文件
编写创建的Makefile
再此输入一下命令,看图
Makefile的基本工作原理
其一,当我们执行 make xx 的时候,Makefile会自动执行xx这个目标下面的命令语句。
其二,当我们make xx的时候,是否执行命令是取决于依赖的。依赖如果成立就会执行命令,否则不执行。
其三,我们直接执行make 和make 第一个目标 效果是一样的。(第一个目标其实就是默认目标)
二.mkv210_image.c文件详解
Makeflie下常用命令说明:举例,如图
二.mkv210_image.c文件详解
mkv210_image.c的主要作用就是由usb启动时使用的led.bin制作得到由sd卡启动的镜像210.bin,能看懂mkv210_image.c文件的执行流程和代码。
代码理解:
第1步:检验用户传参是不是3个。
第2步:分配16K Bbuffer并且填充为0.
第3步: 读源bin到buffer(过程:打开源bin,获取源bin长度,源bin长度不得超过16K-16byte,将源bin放入事先已经填充过的buffer[16]中,关闭源bin)
第4步: 计算校验和(在要校验的内存区域中,所有内存中的内容按照字节为单位来进行相加,最终相加的和与整镜像的头部中的checksum来比对)
第5步:拷贝buffer中的内容到目的bin,即完成由led.bin得到210.bin。
下面转载的是朱有鹏老师的笔记。
分析前面的启动过程可知;210启动后先执行内部iROM中的BL0,BL0执行完后会根据OMpin的配置选择一个外部设备来启动
(有很多,我们实际使用的有2个:usb启动和SD卡启动)。在usb启动时内部BL0读取到BL1后不做校验,
直接从BL1的实质内部0xd0020010开始执行,因此usb启动的景象led.bin不需要头信息,
因此我们从usb启动时直接将镜像下载到0xd0020010去执行即可,不管头信息了;
从SD启动时,BL0会首先读取sd卡得到完整的镜像(完整指的是led.bin和16字节的头),
然后BL0会自己根据你的实际镜像(指led.bin)来计算一个校验和checksum,然后和你完整镜像的头部中的checksum来比对。
如果对应则执行BL1,如果不对应则启动失败(会转入执行2st启动,即SD2启动。如果这里已经是2st启动了,这里校验通不过就死定了)。
1.整个程序工作流分析
整个程序中首先申请一个16KB大小的buffer,然后把所有内容按照各自的位置填充进去,最终把填充好的buffer写入到一个文件(名叫210.bin)就形成了我们想要的镜像。
2.mkv210_image.c的作用:为BL1添加校验头
我们编译链接时只得到了led.bin,这个210.bin的得到和交叉编译工具链是完全无关的。
由led.bin得到210.bin的过程是三星的S5PV210所特有的,因此需要我们自己去完成,为此我们写了mkv210_image.c来完成。
3.整个程序工作流分析
整个程序中首先申请一个16KB大小的buffer,然后把所有内容按照各自的位置填充进去,最终把填充好的buffer写入到一个文件(名叫210.bin)就形成了我们想要的镜像。
4.main函数两个形参的作用
main函数接收2个形参:argc和argv。
argc是用户(通过命令行来)执行这个程序时,实际传递的参数个数。注意这个个数是包含程序执行本身的
argv是一个字符串数组,这个数组中存储的字符串就是一个个的传参。
譬如我们执行程序时使用./mkx210 led.bin 210.bin
则argc = 3
则argv[0] = "./mkx210" argv[1] = led.bin argv[2] = 210.bin
5.glibc读写文件接口
linux中要读取一个文件,可以使用fopen打开文件,fread读取文件,读完之后fclose关闭文件。
要写文件用fwrite来写。这些函数是glibc的库函数,在linux中用man 3 可以查找。
如果你本身就知道这些函数的用法,只是记不起来可以man查找;如果你本身根本就不会用这些接口,建议先去baidu。
6.校验和的计算方法
算法:校验和其实就是需要校验的内存区域中,所有内存中的内容按照字节为单位来进行相加,最终相加的和极为校验和。
实现时大家要注意指针的类型为char *