0%

Mach微内核简介

XNU 怎么加载 App?

iOS 的可执行文件和动态库都是 Mach-O 格式,所以加载 APP 实际上就是加载 Mach-O 文件。
Mach-O header 信息结构代码如下:

1
2
3
4
5
6
7
8
9
10
struct mach_header_64 {
uint32_t magic; //64位还是32位
cpu_type_t cputype; //CPU 类型,比如 arm 或 X86
cpu_subtype_t cpusubtype; //CPU 子类型,比如 armv8
uint32_t filetype; // 文件类型
uint32_t ncmds; // load commands 的数量
uint32_t sizeofcmds; // load commands 大小
uint32_t flags; // 标签
uint32_t reserved; // 保留字段
}

其中,文件类型 filetype 表示了当前 Mach-O 属于哪种类型。Mach-O 包括以下几种类型。

  • OBJECT,指的是 .o 文件或者 .a 文件;
  • EXECUTE,指的是IPA 拆包后的文件;
  • DYLIB,指的是 .dylib 或 .framework 文件;
  • DYLINKER,指的是动态链接器;
  • DSYM,指的是保存有符号信息用于分析闪退信息的文件。

加载 Mach-O 文件,内核会 fork 进程,并对进程进行一些基本设置,比如为进程分配虚拟内存、为进程创 建主线程、代码签名等。用户态 dyld 会对 Mach-O 文件做库加载和符号解析。

希望对您有所帮助,您的支持将是我莫大的动力!