iOS 开发高手课
戴铭
前滴滴出行技术专家
42934 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
用户故事 (1讲)
iOS 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

33 | iOS 系统内核 XNU:App 如何加载?

dyld 的加载
load_dylinker()
exec_activate_image()
Mach-O 格式
Platform Expert
libsa
libkern
IOKit
BSD
Mach
驱动
XNU
Metal
图形和媒体核心框架
Cocoa Touch
Accessibility
Spotlight
SpringBoard
加载 App
架构
Darwin层
核心框架层
应用框架层
用户体验层
课后作业
XNU
iOS 系统架构
iOS 系统内核 XNU:App 如何加载?
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是戴铭。
在专栏的第 2 篇文章《App 启动速度怎么做优化与监控?》更新完之后,我看到很多同学对启动加载 App 的底层原理表示出了浓厚兴趣。所谓工欲善其事,必先利其器,相信有着好奇心的你,一定也会对支撑着 App 运行的操作系统有着各种各样的疑问。
我曾在专栏的第 5 篇文章《链接器:符号是怎么绑定到地址上的?》中,和你分享了链接器在编译时和程序启动时会做的事情。而今天这篇文章,我会重点与你说说加载动态链接器之前,系统是怎么加载 App 的。
所以,今天我会先跟你说说 iOS 系统的架构是怎样的,各部分的作用是什么,帮助你理解 iOS 系统的原理,进而更全面地理解它在 App 加载时做了哪些事情?
接下来,我就先跟你聊聊 iOS 的系统架构是怎样的。在理解 iOS 系统架构之前,你最好掌握一些操作系统原理的基础知识。

iOS 系统架构

iOS 系统是基于 ARM 架构的,大致可以分为四层:
最上层是用户体验层,主要是提供用户界面。这一层包含了 SpringBoard、Spotlight、Accessibility。
第二层是应用框架层,是开发者会用到的。这一层包含了开发框架 Cocoa Touch。
第三层是核心框架层,是系统核心功能的框架层。这一层包含了各种图形和媒体核心框架、Metal 等。
第四层是 Darwin 层,是操作系统的核心,属于操作系统的内核态。这一层包含了系统内核 XNU、驱动等。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

iOS系统内核XNU是支撑App加载的关键组成部分。XNU采用了微内核Mach和宏内核BSD的混合内核,具备微内核和宏内核的优点。文章介绍了iOS系统架构,包括用户体验层、应用框架层、核心框架层和Darwin层,以及XNU内部由Mach、BSD、驱动API IOKit组成。在XNU加载App时,Mach负责进程和线程抽象、处理器调度、进程间通信等基本工作,而BSD提供了更现代、更易用的内核接口,以及POSIX的兼容。IOKit则是硬件驱动程序的运行环境。通过深入了解XNU的内部结构和加载App的过程,读者可以更全面地理解iOS系统的原理。文章还介绍了Mach-O文件的加载过程,包括fork新进程、为Mach-O分配内存、解析Mach-O文件、映射到内存空间以及启动dyld的流程。总体来说,XNU加载App的流程可以概括为创建新进程、为Mach-O分配内存、解析Mach-O、映射到内存并启动dyld。这篇文章深入浅出地介绍了iOS系统内核XNU的加载App过程,对于想深入了解iOS系统原理的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 赵国辉
    老师,有没有计划讲解一下dyld的工作过程和原理,非常想学习一下

    作者回复: 可以看这篇 https://www.mikeash.com/pyblog/friday-qa-2012-11-09-dyld-dynamic-linking-on-os-x.html

    2019-05-29
    4
  • Bill
    多从提到了BSD BSD全称到底是啥

    作者回复: https://zh.wikipedia.org/zh/BSD

    2019-10-09
    1
  • 烩面
    老师,是先 fork 出新进程,还是先分配内存呢? 小结和上面对 __mac_execve 函数的分析上好像有点出入 。。。

    作者回复: fork 新进程之前内存并没有分配给新进程,是在 fork 新进程后再分配的,调用的函数是 exec_activate_image,这个函数会依据 execsw 加载二进制文件格式进行内存映射,对内存进行分配,对于 Mach-O 格式使用的是 exec_mach_imgact() 函数。文中已有说明。

    2019-05-26
    1
  • bart
    推荐大家回顾一下大学的《操作系统》,然后看一下《 深入解析Mac OSX & IOS 操作系统》,这样听起来会畅快很多。
    2019-05-30
    29
  • 毛成方
    Mike Ash文章最后总结说道大部分工程师不会去在意这些细节 但是当你在遇到动态链接等报错的时候 你讲更好去分析和解决它们。换句话说 我们要走出自己的舒适区 去研究新的技术 碰壁 总结 才能有更好的成长 去挑战更大的平台。
    2019-06-03
    9
  • Geek
    读后感: 真的看不懂,iOS开发需要这么深入吗?
    2019-05-30
    4
    2
  • xilie
    读后感: 真的看不懂,iOS开发需要这么深入吗?
    2019-05-29
    1
    1
  • D
    所以App的Mach-O 文件到底是由XNU加载到内存的还是由dyld加载到内存的?以前一直认为是dyld 加载App的Mac-o 并解析加载load commands。现在越来越看不懂了...
    2021-08-11
    1
  • Wim
    大神能讲一下“点击appIcon到app启动”或者“被别的应用拉起的启动”具体的底层过程吗?
    2020-12-08
  • Geek_9dbcb4
    文中“加载 Mach-O 文件,内核会 fork 进程,并对进程进行一些基本设置,比如为进程分配虚拟内存、为进程创建主线程、代码签名等”。 问题,这个地方的代码签名,不同于我们证书的私钥对APP的签名吧?也不同于苹果的私钥对APP的再次签名吧?
    2020-04-18
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部