关注分享主机优惠活动
国内外VPS云服务器

震惊! 该操作系统上的应用程序只需“几毫秒”即可加载(操作系统最终加载)。

总结:本文主要向您展示如何在毫秒内加载应用程序。 该图的左侧从汇编器和链接器的角度显示了该文件。 开头解释了体系结构和操作系统等基本信息,并告诉您它在文件中的位置。 它在组装和链接过程中没有用处。 因此,所有描述性信息都可能存储在那里。

1.背景

AliOS Thing 是一款高度可扩展的物联网操作系统,属于 AliOS 家族,面向物联网领域。 AliOS Thing v3.2[1]及更高版本提供了内核和应用程序分离的能力。 内核和应用程序运行在不同的虚拟地址空间中。 应用程序的问题不会影响内核运行。 将内核与应用程序分离,不仅可以达到安全目的,还可以有效降低应用程序开发成本。 应用程序以标准 ELF(可执行和可链接格式)[2] 文件形式存在。 您需要在系统上运行哪个应用程序?只需加载该应用程序的 ELF 文件即可。

本文主要向您展示如何在“毫秒”内加载AliOS Things应用程序。

图1-1 AliOS内容

2. ELF文件格式

ELF文件格式有两种。有不同的格式可供选择。 从汇编器和链接器的角度来看,ELF 文件是由节头表描述的节的集合。 当您运行 ELF 文件时,它会出现在加载器中。程序头表中描述的一组段。

图 2-1 从不同角度看 ELF

左侧从汇编器和链接器的角度显示了该文件。 第一个 ELF 标头描述了架构。 指示操作系统等基本信息,并指示节头表和程序头表在文件中的位置。 程序头表是可选的,因为在汇编和链接过程中不使用它。 节头表存储所有节的描述信息。 右侧从加载程序的角度显示了该文件。 它以 ELF 标头开始。 程序头表存储了所有段的描述信息。 节头表在加载过程中不被使用,因此是不必要的。 请注意,节头表和程序头表不必放置在文件的开头和结尾。 它们的位置由 ELF 标头指示。 上图是为了清晰起见而绘制的。

在汇编器中使用.section声明的节成为目标文件中的节,汇编器自动添加。 在某些段(如符号表)中,段指的是程序运行时加载到内存中的具有相同属性的区域。 由一个或多个部分组成。 例如,如果两个段加载到内存后需要可读可写,那么它们就属于同一个段。 一些部分仅对汇编器和链接器有意义。 它在运行时不使用,也不需要加载到内存中,因此不属于任何段。 需要节头表,因为目标文件需要链接器进一步处理。 需要程序头表,因为必须加载并运行可执行文件。 另外,共享库必须被加载并执行,并且在加载过程中是动态链接的,因此节头表和程序头表都是链接的。

3. AliOS Things 应用 ELF 格式

<p style="text-align:center;"

图3-1 AliOS Things ELF

当前AliOS Things应用ELF文件目前不支持像.so文件那样动态加载和地址重定位。 当编译生成ELF文件时,ELF加载后执行的虚拟地址是固定的(由链接脚本决定),如图3所示。 k4]1的程序头中LOAD对应的虚拟地址的起始地址为0x10000000,其相对于整个ELF文件的偏移量为0x010000。

4.如何读取ELF文件的思考

前面常规的加载方法分为四步,如图4-1所示。

打开一个ELF文件,将整个ELF读入内存,解析并搜索ELF格式。 LOAD 必须加载程序头。 一次性申请所有内存,完成ELF虚拟地址空间映射到相应的物理内存。 所需内存大小为app_text_end - app_text_start; 将 .text、ARM.exidx、.ctors、.rodata、.ARM.extab、.ARM.extab.text.u 放入 ELF 文件中。 将data、.got、.FSymTab部分移动到虚拟地址范围app_text_start到app_text_end对应的存储区域,同时将虚拟地址范围app_zero_start到app_zero_end对应的存储区域全部清空。 创建一个进程来运行 ELF 代码。

图4-1传统加载方式

以上步骤会发现以下两个问题。

无论是否需要加载整个ELF文件,加载器都会首先将整个文件读入内存,增加加载时间。 在实际情况中,您可能只需要加载 ELF 文件的一部分。 内容应用程序可以运行。 无论是否需要将整个虚拟地址空间(app_text_start ~ app_zero_end)映射到物理内存,都会一次性映射整个虚拟,造成不必要的内存浪费。 在地址空间中,打开内存中的ELF文件,将整个ELF读入内存,解析ELF格式,找到需要加载的LOAD程序头。

以上两个方面对我们来说也是新的。 加载器(分段快速加载引擎)重点优化两个方面。

5.分段快速加载引擎

图 5-1 AliOS Things的分段加载引擎

ELF预读程序入口,后续页面错误会中断按需加载。 部分虚拟地址空间是预先映射的,后续的页面错误会根据需要破坏映射。 预先映射的部分可以根据缺页中断来计数。 信息调整,提高加载速度。

图5-2 AliOS Things示意图

根据IP摄像头客户应用的测试,只需映射整个虚拟地址空间的1/4即可那。 程序可以成功运行。 只需读取ELF头和程序头表即可检索整个ELF文件,以获得LOAD段字段的描述信息。 根据此信息,您可以配置要发生的页错误中断。 该应用程序功能齐全,只需加载和映射即可。 对于大约1/4的内容,可以使用分段快速加载引擎(bengine_dload)将2MB ELF文件的加载速度从500ms优化到80ms左右,内存开销从3.5 MB减少。 (2MB 代码 + 1.5MB BSS)~ 1.25 MB(256KB 代码 + 1MB BSS)。 分段快速加载引擎将应用程序加载速度提高了 6 倍以上,并将内存开销降低了 2.8 倍。

开发者支持

如果您需要更多技术支持,请加入钉钉开发者群或关注我们的微信公众号。

更多技术和解决方案,请访问HaaS官网https://haas.i。ot.aliyun.com

未经允许不得转载:主机频道 » 震惊! 该操作系统上的应用程序只需“几毫秒”即可加载(操作系统最终加载)。

评论 抢沙发

评论前必须登录!