深入理解iOS app的启动过程
准备知识
Mach-O
哪些名词指的是Mach-o
Executable 可执行文件
Dylib 动态库
Bundle 无法被连接的动态库,只能通过dlopen()加载
Image 指的是Executable,Dylib或者Bundle的一种,文中会多次使用Image这个名词。
Framework 动态库和对应的头文件和资源文件的集合
Apple出品的操作系统的可执行文件格式几乎都是mach-o,iOS当然也不例外。
mach-o可以大致的分为三部分:

Header 头部,包含可以执行的CPU架构,比如x86,arm64
Load commands 加载命令,包含文件的组织架构和在虚拟内存中的布局方式
Data,数据,包含load commands中需要的各个段(segment)的数据,每一个Segment都得大小是Page的整数倍。
那么Data部分又包含哪些segment呢?绝大多数mach-o包括以下三个段(支持用户自定义Segment,但是很少使用)
__ TEXT 代码段,只读,包括函数,和只读的字符串,上图中类似TEXT, text的都是代码段
__ DATA 数据段,读写,包括可读写的全局变量等,上图类似中的__ DATA,__ data都是数据段
__ LINKEDIT __ LINKEDIT包含了方法和变量的元数据(位置,偏移量),以及代码签名等信息。
dyld
dyld的全称是dynamic loader,它的作用是加载一个进程所需要的image,dyld是开源的。
Virtual Memory
虚拟内存是在物理内存上建立的一个逻辑地址空间,它向上(应用)提供了一个连续的逻辑地址空间,向下隐藏了物理内存的细节。
虚拟内存使得逻辑地址可以没有实际的物理地址,也可以让多个逻辑地址对应到一个物理地址。
虚拟内存被划分为一个个大小相同的Page(64位系统上是16KB),提高管理和读写的效率。 Page又分为只读和读写的Page。
虚拟内存是建立在物理内存和进程之间的中间层。在iOS上,当内存不足的时候,会尝试释放那些只读的Page,因为只读的Page在下次被访问的时候,可以再从磁盘读取。如果没有可用内存,会通知在后台的App(也就是在这个时候收到了memory warning),如果在这之后仍然没有可用内存,则会杀死在后台的App。
Page fault
在应用执行的时候,它被分配的逻辑地址空间都是可以访问的,当应用访问一个逻辑Page,而在对应的物理内存中并不存在的时候,这时候就发生了一次Page fault。当Page fault发生的时候,会中断当前的程序,在物理内存中寻找一个可用的Page,然后从磁盘中读取数据到物理内存,接着继续执行当前程序。
Dirty Page & Clean Page
如果一个Page可以从磁盘上重新生成,那么这个Page称为Clean Page
如果一个Page包含了进程相关信息,那么这个Page称为Dirty Page
启动过程
使用dyld2启动应用的过程如图:

大致的过程如下:
加载dyld到App进程
加载动态库(包括所依赖的所有动态库)
Rebase
Bind
初始化Objective C Runtime
其它的初始化代码
1.加载动态库
未完成,后续更新
https://blog.csdn.net/Hello_Hwc/article/details/78317863?locationNum=9&fps=1
网友评论