返回

iOS 底层原理探索:应用程序加载原理 - dyld (下)

IOS

继续探索 dyld

_dyld_objc_notify_register() 函数

在前一篇文章中,我们提到 _dyld_objc_notify_register() 函数用于注册一个回调函数,以便在应用程序加载和卸载时通知 Objective-C 运行时。这个回调函数通常由 Objective-C 运行时本身实现,它负责更新 Objective-C 类和方法的信息,以便在应用程序运行时正确调用这些类和方法。

dyld 加载 Mach-O 可执行文件

_dyld_objc_notify_register() 函数返回后,dyld 将开始加载 Mach-O 可执行文件。Mach-O 是 Apple 用于 macOS 和 iOS 操作系统的可执行文件格式。Mach-O 文件包含了应用程序的代码、数据和资源,以及一些元数据信息。

dyld 加载 Mach-O 文件的过程可以分为以下几个步骤:

  1. 读取 Mach-O 文件头: dyld 首先读取 Mach-O 文件头,其中包含了一些基本信息,例如文件的类型、大小和加载地址。
  2. 映射 Mach-O 文件: dyld 将 Mach-O 文件映射到虚拟内存中。这使得应用程序可以在运行时访问 Mach-O 文件中的代码和数据。
  3. 修复重定位信息: Mach-O 文件中包含了一些重定位信息,这些信息指示 dyld 在将代码和数据加载到内存时需要进行的调整。dyld 会根据这些重定位信息来修复代码和数据,以便它们可以在正确的地址上运行。
  4. 初始化数据段: Mach-O 文件中包含了一些数据段,这些数据段需要在应用程序运行前进行初始化。dyld 会根据 Mach-O 文件中的信息来初始化这些数据段。
  5. 调用应用程序的入口点: 当 dyld 完成所有必要的加载和初始化工作后,它会调用应用程序的入口点。应用程序的入口点通常是一个名为 main() 的函数,它负责启动应用程序的执行。

dyld 管理内存映射和虚拟内存

dyld 在应用程序加载过程中负责管理内存映射和虚拟内存。内存映射是一种将文件映射到虚拟内存的技术,这样应用程序就可以直接访问文件中的数据,而无需将其复制到内存中。虚拟内存是一种将物理内存和磁盘空间结合起来使用,以增加计算机的可用内存的技术。

dyld 使用内存映射来加载 Mach-O 文件和应用程序所需的库。这使得应用程序可以在运行时快速访问这些文件中的数据,而无需等待它们被复制到内存中。dyld 还使用虚拟内存来管理应用程序的堆和栈。堆和栈是应用程序用来存储临时数据的两个内存区域。通过使用虚拟内存,dyld 可以确保应用程序有足够的内存空间来存储这些临时数据。

动态链接和懒加载

dyld 还支持动态链接和懒加载。动态链接允许应用程序在运行时加载和链接库。这使得应用程序可以只加载和链接它真正需要使用的库,从而减少应用程序的内存占用和启动时间。懒加载允许应用程序在需要时才加载和链接库。这使得应用程序可以更快地启动,并减少内存占用。

启动时间优化

dyld 提供了一些启动时间优化技术,可以帮助应用程序更快地启动。这些技术包括:

  • 并行加载: dyld 可以并行加载 Mach-O 文件和库,从而减少应用程序的启动时间。
  • 预热缓存: dyld 可以预热一些常用的库,以便应用程序在启动时可以更快地加载它们。
  • 链接器优化: dyld 可以使用链接器优化技术来减少应用程序的启动时间。这些优化包括去除未使用的代码和数据、合并相同