公司推出软件更新时对代码段的变化是什么?

时间:2016-04-07 06:47:11

标签: memory-management bootloader memory-segmentation software-update

我在考虑如何根据生成的可执行文件中存在的信息对目标板编程PROGRAMMER程序,我觉得这是由链接器脚本完成的,链接各种文件并创建.init的信息。 ,.text,.data,.fini等

我想知道例如Apple何时推出iOS更新,例如100MB大小,此更新有自己的一组变量 - 全局静态const,初始化,未初始化等。这将导致新的内存映射。 那么现在当这个更新安装在考虑iPhone的处理器上时,这是如何工作的? 操作系统代码的.init,.text,.data等部分是否还有一些额外的内存用于此类更新?

PS:我可能在上面的描述中遇到了一些技术错误,我将不胜感激任何编辑

1 个答案:

答案 0 :(得分:0)

坦白说,问题的答案非常简单。您的主要问题是"您将在哪里获取未来软件更新的内存"。答案是系统的DRAM。在你的问题的第一部分,你谈论裸机编程。问题的第二部分是关于操作系统级编程。对于第一部分,您基本上将处理器置于isp模式并对闪存或其他内存进行编程。在第二部分中,它的工作方式完全不同。

基本上,(简化机制)您的更新分为几部分:bootloader,kernel,initramfs,firmware,application。您首先使用某些协议(例如ftp)将代码(捆绑包)传输到设备。这种转移确实将代码放在系统的DRAM上。然后在您的系统(运行Linux的示例)上,您有代码(逻辑)来解压缩此代码并进行完整性检查(文件的校验和)。然后系统有进一步的代码来分析所有这些组件并确定它的任何现有组件是否需要更新(检查输入组件的md5总和并与现有组件进行比较)。例如,如果您在内核的init脚本中进行了更改,或者您想在init.d中使用一些新脚本,那么您基本上就更改了initramfs。所以系统上的代码看到了这一点并确定我需要对initramfs进行更新。

新代码的最终目的地是闪存。由于闪存具有某些规则,您需要遵循这些规则来对其进行写入和擦除,因此您基本上可以在闪存上安装闪存文件系统。但是你不能用它来为它加载代码,因为像jffs2这样的文件系统使用损耗均衡机制,因此数据分散在物理闪存中(jffs2安装在它上面)。这是不可接受的,因为您希望在闪存中的连续位置上使用完整的引导加载程序,内核,initramfs等。所以在我们运行Linux的示例系统中,你有一个叫做mtd驱动的东西。您可以使用此驱动程序使用所有组件对闪存进行编程。简而言之,DRAM是软件更新的临时位置。所以你必须确保两个中的一个1.你有足够的内存2.你的软件更新包适合DRAM。