iOS 底层原理探索:应用程序加载原理 - dyld (下)
2023-09-19 07:59:10
继续探索 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 文件的过程可以分为以下几个步骤:
- 读取 Mach-O 文件头: dyld 首先读取 Mach-O 文件头,其中包含了一些基本信息,例如文件的类型、大小和加载地址。
- 映射 Mach-O 文件: dyld 将 Mach-O 文件映射到虚拟内存中。这使得应用程序可以在运行时访问 Mach-O 文件中的代码和数据。
- 修复重定位信息: Mach-O 文件中包含了一些重定位信息,这些信息指示 dyld 在将代码和数据加载到内存时需要进行的调整。dyld 会根据这些重定位信息来修复代码和数据,以便它们可以在正确的地址上运行。
- 初始化数据段: Mach-O 文件中包含了一些数据段,这些数据段需要在应用程序运行前进行初始化。dyld 会根据 Mach-O 文件中的信息来初始化这些数据段。
- 调用应用程序的入口点: 当 dyld 完成所有必要的加载和初始化工作后,它会调用应用程序的入口点。应用程序的入口点通常是一个名为
main()
的函数,它负责启动应用程序的执行。
dyld 管理内存映射和虚拟内存
dyld 在应用程序加载过程中负责管理内存映射和虚拟内存。内存映射是一种将文件映射到虚拟内存的技术,这样应用程序就可以直接访问文件中的数据,而无需将其复制到内存中。虚拟内存是一种将物理内存和磁盘空间结合起来使用,以增加计算机的可用内存的技术。
dyld 使用内存映射来加载 Mach-O 文件和应用程序所需的库。这使得应用程序可以在运行时快速访问这些文件中的数据,而无需等待它们被复制到内存中。dyld 还使用虚拟内存来管理应用程序的堆和栈。堆和栈是应用程序用来存储临时数据的两个内存区域。通过使用虚拟内存,dyld 可以确保应用程序有足够的内存空间来存储这些临时数据。
动态链接和懒加载
dyld 还支持动态链接和懒加载。动态链接允许应用程序在运行时加载和链接库。这使得应用程序可以只加载和链接它真正需要使用的库,从而减少应用程序的内存占用和启动时间。懒加载允许应用程序在需要时才加载和链接库。这使得应用程序可以更快地启动,并减少内存占用。
启动时间优化
dyld 提供了一些启动时间优化技术,可以帮助应用程序更快地启动。这些技术包括:
- 并行加载: dyld 可以并行加载 Mach-O 文件和库,从而减少应用程序的启动时间。
- 预热缓存: dyld 可以预热一些常用的库,以便应用程序在启动时可以更快地加载它们。
- 链接器优化: dyld 可以使用链接器优化技术来减少应用程序的启动时间。这些优化包括去除未使用的代码和数据、合并相同