ARM mkv210_image.c 文件详解

news2024/11/15 17:18:15

一、mkv210_image.c 的使用演示

裸机程序中的 Makefile(实际上真正的项目的 Makefile 都是这样的)是把程序的编译和链接过程分开的。(平时我们用 gcc a.c -o exe 这种方式来编译时,实际上把编译和链接过程一步完成了。在内部实际上编译和链接永远是分开独立进行的: 编译要使用编译器 gcc,链接要使用链接器 ld).

链接器得到 led.elf 其实就是我们的可执行程序,(如果是在操作系统下,这个 led.elf 就可以执行了)但是在嵌入式裸机中我们需要的是可以烧写的文件(可烧写的文件就叫镜像 image),因此我们需要用这个 led.elf 为原材料来制作镜像,制作工具是交叉编译工具链中的 arm-linux-objcopy.

我们使用 arm-linux-objdump 工具进行反编译(反汇编),反汇编其实就是把编译后的 elf 格式的可执行程序给反过来的到对应的汇编程序,得到它的汇编源代码。我们使用反汇编主要是用来学习 。

mkv210_image.c 这个程序其实最终不是在开发板上执行的,而是在主机 linux(就是用来执行 make 对整个项目进行编译的那个机器)中执行的,因此编译这个程序用 gcc 而不是用 arm-linux-gcc 。这个 .c 文件编译后得到一个可执行程序 mkmini210,目的是通过执行这个 mkmini210 程序而由 led.bin 得到 210.bin。(210.bin 是通过 SD 卡启动时的裸机镜像,这个镜像需要由 led.bin 来加工得到,加工的具体方法和原理要看mkv210_image.c)。

root@ubuntu:/home/aston/workspace/chapter4/1.leds_s# ls
Makefile  mkv210_image.c  start.S  write2sd  说明.txt
root@ubuntu:/home/aston/workspace/chapter4/1.leds_s# make
arm-linux-gcc -o start.o start.S -c
arm-linux-ld -Ttext 0x0 -o led.elf start.o
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led_elf.dis
gcc mkv210_image.c -o mkx210
./mkx210 led.bin 210.bin
root@ubuntu:/home/aston/workspace/chapter4/1.leds_s# ls
210.bin  led.elf      Makefile        mkx210   start.S   说明.txt
led.bin  led_elf.dis  mkv210_image.c  start.o  write2sd
root@ubuntu:/home/aston/workspace/chapter4/1.leds_s# 

二、 背景知识:S5PV210 的启动过程回顾

分析启动过程可知;210 启动后先执行内部 iROM 中的 BL0BL0 执行完后会根据 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 启动了,这里校验通不过就死定了)。


三、mkv210_image.c的作用:为BL1添加校验头

我们编译链接时只得到了 led.bin,这个 210.bin 的得到和交叉编译工具链是完全无关的。由 led.bin 得到 210.bin 的过程是三星的 S5PV210 所特有的,因此需要我们自己去完成,为此我们写了 mkv210_image.c 来完成。

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


四 、整个程序工作流分析

整个程序中首先申请一个 16KB 大小的 buffer,然后把所有内容按照各自的位置填充进去,最终把填充好的 buffer 写入到一个文件(名叫 210.bin)就形成了我们想要的镜像。

代码详解

第1步:检验用户传参是不是3个。
第2步:分配16K Bbuffer并且填充为0.
第3步:·········

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

glibc读写文件接口

linux 中要读取一个文件,可以使用 fopen 打开文件,fread 读取文件,读完之后 fclose 闭文件。
要写文件用 fwrite 来写。这些函数是 glibc 的库函数,在 linux 中用 man 3 可以查找。

校验和的计算方法

算法:校验和其实就是需要校验的内存区域中,所有内存中的内容按照字节为单位来进行相加,最终相加的和极为校验和。


五、mkv210_image.c 源码

/*
 * mkv210_image.c的主要作用就是由usb启动时使用的led.bin制作得到由sd卡启动的镜像210.bin
 *
 * 本文件来自于友善之臂的裸机教程,据友善之臂的文档中讲述,本文件是一个热心网友提供,在此表示感谢。
 */
/* 在BL0阶段,Irom内固化的代码读取nandflash或SD卡前16K的内容,
 * 并比对前16字节中的校验和是否正确,正确则继续,错误则停止。
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFSIZE                 (16*1024)
#define IMG_SIZE                (16*1024)
#define SPL_HEADER_SIZE         16
//#define SPL_HEADER              "S5PC110 HEADER  "
#define SPL_HEADER              "****************"

int main (int argc, char *argv[])
{
	FILE		*fp;
	char		*Buf, *a;
	int		BufLen;
	int		nbytes, fileLen;
	unsigned int	checksum, count;
	int		i;
	
	// 1. 3个参数
	if (argc != 3)
	{
		printf("Usage: %s <source file> <destination file>\n", argv[0]);
		return -1;
	}

	// 2. 分配16K的buffer
	BufLen = BUFSIZE;
	Buf = (char *)malloc(BufLen);
	if (!Buf)
	{
		printf("Alloc buffer failed!\n");
		return -1;
	}

	memset(Buf, 0x00, BufLen);

	// 3. 读源bin到buffer
	// 3.1 打开源bin
	fp = fopen(argv[1], "rb");
	if( fp == NULL)
	{
		printf("source file open error\n");
		free(Buf);
		return -1;
	}
	// 3.2 获取源bin长度
	fseek(fp, 0L, SEEK_END);								// 定位到文件尾
	fileLen = ftell(fp);									// 得到文件长度
	fseek(fp, 0L, SEEK_SET);								// 再次定位到文件头
	// 3.3 源bin长度不得超过16K-16byte
	count = (fileLen < (IMG_SIZE - SPL_HEADER_SIZE))
		? fileLen : (IMG_SIZE - SPL_HEADER_SIZE);
	// 3.4 buffer[0~15]存放"S5PC110 HEADER  "
	memcpy(&Buf[0], SPL_HEADER, SPL_HEADER_SIZE);
	// 3.5 读源bin到buffer[16]
	nbytes = fread(Buf + SPL_HEADER_SIZE, 1, count, fp);
	if ( nbytes != count )
	{
		printf("source file read error\n");
		free(Buf);
		fclose(fp);
		return -1;
	}
	fclose(fp);

	// 4. 计算校验和
 	// 4.1 从第16byte开始统计buffer中共有几个1
	// 4.1 从第16byte开始计算,把buffer中所有的字节数据加和起来得到的结果
	a = Buf + SPL_HEADER_SIZE;
	for(i = 0, checksum = 0; i < IMG_SIZE - SPL_HEADER_SIZE; i++)
		checksum += (0x000000FF) & *a++;
	// 4.2 将校验和保存在buffer[8~15]
	a = Buf + 8;							// Buf是210.bin的起始地址,+8表示向后位移2个字,也就是说写入到第3个字
	*( (unsigned int *)a ) = checksum;

	// 5. 拷贝buffer中的内容到目的bin
	// 5.1 打开目的bin
	fp = fopen(argv[2], "wb");
	if (fp == NULL)
	{
		printf("destination file open error\n");
		free(Buf);
		return -1;
	}
	// 5.2 将16k的buffer拷贝到目的bin中
	a = Buf;
	nbytes	= fwrite( a, 1, BufLen, fp);
	if ( nbytes != BufLen )
	{
		printf("destination file write error\n");
		free(Buf);
		fclose(fp);
		return -1;
	}

	free(Buf);
	fclose(fp);

	return 0;
}


源自朱有鹏老师.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebRTC实战-第二章-使用WebRTC实现音视频通话

目录参考理论iceServerWebRTC共分成三个API&#xff0c;分别对应上面三个作用。getUserMedia调用流程开发步骤leave、peer-leave信令实现offer、answer、candidate信令实现开发获取浏览器的流常规设置设置限制条件创建RTCPeerConnectionRTCDataChannelWebRTC Security外部函数库…

【经验】Word 2021|如何在Word里做出和Markdown中一样漂亮的引用样式

文章目录写在最前方法以及参数1 打开样式窗口2 设置一些基本操作3 打开格式窗口4 修改样式最后一步&#xff01;保持间隔成品自取写在最前 Word 版本&#xff1a;2021 灵感来自 知乎奶茶叔的回答&#xff0c;以及我自己平时打代码用的代码块样式。但是我将分享我精心调配的参数…

HTML5期末大作业:HTM+CSS+JS仿安徽开放大学官网(web前端网页制作课作业)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]计算机毕业设计养生药膳推荐系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Tsinghua:Finding Skill Neurons in Pre-trained Transformer-based Language Models

这篇文章我觉得研究的挺有意思的。 找到神经网络中最有帮助的神经元的一个过程。这个过程的价值是减少PLM参数的前提下&#xff0c;还能提高模型的效果。 在本文中&#xff0c;我们发现在对特定任务进行快速调整后&#xff0c;预训练的 Transformers1 中某些神经元的激活可以高…

Keras计算机视觉(二)

第一部分 认识CNN 一、quickly start 所见即所得&#xff0c;先看一下CNN在MNIST上的运行Demo from keras import layers from keras import modelsmodel models.Sequential() # 定义一个卷积输入层&#xff0c;卷积核是3*3&#xff0c;共32个&#xff0c;输入是(28, 28, 1…

后端开发怎么做得更优秀?记住这15个好习惯

目录 一. 注释尽可能全面&#xff0c;要写有意义的注释 二. 项目拆分合理的目录结构 三. 尽量不在循环里远程调用或者数据库操作&#xff0c;优先考虑批量进行 四. 封装方法形参 五. 封装通用模板 六. 封装复杂的逻辑判断条件 七. 保持优化性能的嗅觉 八. 可变参数的配…

图的初识·遍历

文章目录深度优先搜索[DFS]实现代码广度优先搜索【BFS】思路图解代码实现广度优先遍历【BFS】图的结构深度优先搜索[DFS] 并不唯一&#xff0c;只是一种情况A−>IA->IA−>I 实现代码 使用邻接表表示图。遍历的时间复杂度O(VE)O(VE)O(VE)&#xff1b;邻接矩阵的时间…

使用 Python 和 OpenCV 制作反应游戏

在本文中&#xff0c;将向你展示如何使用 OpenCV 在 Python 中制作一个反应游戏&#xff0c;你可以动手来玩。你可能已经熟悉 OpenCV&#xff0c;OpenCV 基本上允许进行各种图像处理。你可以在下面的视频中看到最终结果&#xff0c;并且可以在此处获取文件&#xff1a;https://…

jsp4S店管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 4S店管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发&#xff0c;数据库为Mysql&#xff0c;使用ja…

海带软件分享——日常办公学习软件下载安装(百度网盘 | 收藏)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f680; 写在前面 &#x1f431;‍&#x1f3cd; 本期开始&#xff0c;小海带会定期推荐一些日常办公学习软件及趣味网址&#xff08;内含安装教程&#xff09;&#xff0c;供大家学习交流参考 ~ 小伙…

三层交换技术

数据来源 一、三层交换技术出现背景&#xff1a; 解决之前给网段划分VLAN控制端口&#xff0c;然后使用路由器设置单臂路由的让不同VLAN可以通信的缺点&#xff0c; 单臂路由缺点&#xff1a; 1&#xff09;容易出现网络瓶颈 2&#xff09;容易发生单点物理故障 3&a…

[附源码]Python计算机毕业设计Django海南与东北的美食文化差异及做法的研究展示平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

设计一个互联网交换设备的SNMP MIB库“X-MIB”

设计一个互联网交换设备的SNMP MIB库“X-MIB”&#xff1a; 问题描述 设备型号&#xff1a;字符串类型 设备生产厂商&#xff1a;字符串类型 设备名称&#xff1a;字符串类型 设备位置&#xff1a;字符串类型 设备运行时间&#xff1a;Timeticks 类型 设备队列数&#xff…

Find My资讯|苹果Find My帮助美警察逮捕连环盗车嫌犯

报道称&#xff0c;美国Shelby County Sheriff警方于11月13日搜查了Shady Ridge的5300街区的一处住宅&#xff0c;成功逮捕了现年20岁的嫌疑人Michael Walker。根据警方通告&#xff0c;该地区近期发生了多起盗车案件。而案件的突破口是发生在Pleasantwood 6800街区的一件盗车事…

【JUC】循环屏障 CyclicBarrier 详解

前言 jdk 中提供了许多的并发工具类&#xff0c;大家可能比较熟悉的有CountDownLatch&#xff0c;主要用来阻塞一个线程运行&#xff0c;直到其他线程运行完毕。而 jdk 还有一个功能类似并发工具类CyclicBarrier&#xff0c;你知道它的作用吗&#xff1f;和CountDownLatch有什…

MySQL学习记录(6)索引02

2.6、索引的使用 2.6.1、最左前缀法则 如果索引了多列&#xff08;联合索引&#xff09;&#xff0c;要遵循最左前缀法则。最左前缀法则指的是查询从索引的最左列开始&#xff0c;并且不跳过索引的列&#xff0c;如果跳跃某一列&#xff0c;索引将会部分失效&#xff08;后面…

大二Web课程设计:HTML+CSS学校静态网页设计——南京师范大学泰州学院(11页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]Python计算机毕业设计SSM开心鲜花系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Java外卖小程序管理系统源码带小程序前端+后端搭建教程

这套系统已经完成了线下配送的大部分功能 技术架构 技术框架&#xff1a;springboot ssm mysql redis 运行环境&#xff1a;IntelliJ IDEA 2022 jdk1.8 Mysql5.7.4 maven nginx 宝塔面板 后端搭建教程 1.下载源码后打开小皮面板&#xff0c;安装mysql5.7数据库&#x…