公司推出软件更新时对代码段做了哪些更改?

what are the changes made to code segment when companies roll out software updates?

我在想,当我对我的目标板进行编程时,PROGRAMMER 如何根据生成的可执行文件中存在的信息对目标板进行编程,我觉得这是由链接描述文件完成的,链接各种文件并创建信息.init、.text、.data、.fini 等

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

PS:我在上面的描述中可能存在一些技术错误,如有任何修改,我将不胜感激

老实说,您问题的答案非常简单。您的主要问题是 "where do you get the memory for future software updates"。答案是系统的DRAM。在问题的第一部分,您谈论的是裸机编程。你的问题的第二部分是关于 OS 级别的编程。对于第一部分,您基本上将处理器置于 isp 模式并对闪存或其他 nv 内存进行编程。在第二部分,它的工作方式完全不同。

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

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