iOS 底层

iOS-底层原理 15:dyld发展史

2021-07-14  本文已影响0人  Style_月月

iOS 底层原理 文章汇总

dyld简介

dyld 1.0(1996-2004)

dyld 2(2004-2017)

dyld 2从2004年发布至今,已经经过了多个版本迭代,我们现在常见的一些特性,例如ASLRCode Signshare cache等技术,都是在dyld 2中引入的

dyld 2.0(2004-2007)

dyld 2.x(2007-2017)

ASLR

bounds checking 边界检查

share cache 共享代码

dyld 2 工作流程

dyld 2是纯粹的in-process,即在程序进程内执行的,也就意味着只有当应用程序被启动时,dyld 2才能开始执行任务

以下是dyld 2的工作流程图示


dyld 2的工作流程图示

简化版

dyld 3(2017-至今)

为什么需要重新设计dyld 2,形成新的dyld 3 ?

重新设计dyld,主要从以下几方面进行考虑

如何将 dyld 2 改进和优化为 dyld 3?

改进和优化建议

从上面的dyld 2的工作流程中,我们了解了dyld 2的执行流程,可以从以下两个方面来改进和优化:

dyld 2 改进和优化

以下是dyld 2dyld 3 的一些改变,主要是将安全敏感的部分 和 占用大量资源的部分移动到上层,然后将一个closure写入磁盘进行缓存,然后我们在程序进程中使用closure。以下是图示

dyld2 -> dyld 3的改进和优化

dyld 3 组成部分/工作流程

dyld 3的工作流程主要分为3部分,如下所示


dyld 3的工作流程图示

第一部分:out-of-process :mach-o parser

进程外的mach-o分析器和编译器,是普通的后台程序,用于提高测试基础架构的性能。

第一部分主要在App进程之外做以下工作:

第二部分:in-process :engine

进程内的引擎,这部分常驻在内存中,且在dyld 3不再需要分析mach-o文件头或者执行符号查找就可以启动应用,因为分析mach-o和执行符号查找都是耗时操作,所以极大的提高了程序启动速度。

第二部分主要在App进程中做以下工作:

第三部分:launch closure :cache

启动闭包launch closure缓存服务。其中大多数程序启动都会使用缓存,而不需要调用进程外 mach-o分析器和编译器。且launch closuremach-o更简单,因为launch closure内存映射文件,不需要用复杂的方法进行分析,我们可以进行简单的校验,目的是为了提高速度

所以综上所述,dyld 3 把很多耗时的查找、计算和 I/O 操作都预先处理好了,使得启动速度有了很大的提升。即dyld 3把很多耗时的操作都提前处理好了,极大提升了启动速度。

启动闭包(launch closure)

这是一个新引入的概念,指的是 app 在启动期间所需要的所有信息。比如这个 app 使用了哪些动态链接库,其中各个符号的偏移量,代码签名在哪里等等。

dyld 3符号缺失问题

总结

参考链接

上一篇下一篇

猜你喜欢

热点阅读