论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
移动端开发
›
IOS
›
iOS 优化App启动时间-启动详解(上篇)(3),头脑导图+源 ...
iOS 优化App启动时间-启动详解(上篇)(3),头脑导图+源代码+笔记+项目 ...
锦通
金牌会员
|
2024-6-21 13:44:39
|
显示全部楼层
|
阅读模式
楼主
主题
808
|
帖子
808
|
积分
2424
Text.__text: 主程序代码
Text.__cstring:c 字符串
Text.__stubs:桩代码(桩代码就是用来代替某些代码的代码)
Text.__stub_helper
Data.__data :初始化可变的数据
Data.__objc_imageinfo: 镜像信息 ,在运行时初始化时 objc_init,调用 load_images 加载新的镜像到 infolist 中
Data.__la_symbol_ptr
Data.__nl_symbol_ptr
Data.__objc_classlist :类列表
Data.__objc_classrefs :引用的类
3、Mach-O的通用文件
在差异的架构内存的分配是差异的,那么怎么做一个兼容架构的Mach-O文件?
Fat Header来办理这个问题,在运行时根据架构来判断选择Mach-O文件。
虚拟内存
虚拟内存是在物理内存上建立的一个逻辑地址空间,它向上(应用)提供了一个连续的逻辑地址空间,向下隐蔽了物理内存的细节。虚拟内存使得逻辑地址可以没有现实的物理地址,也可以让多个逻辑地址对应到一个物理地址。虚拟内存被划分为一个个大小雷同的Page(64位系统上是16KB),进步管理和读写的效率。 Page又分为只读和读写的Page。
虚拟内存是建立在物理内存和历程之间的中心层。在iOS上,当内存不足的时候,会尝试释放那些只读的Page,由于只读的Page在下次被访问的时候,可以再从磁盘读取。假如没有可用内存,会关照在后台的App(也就是在这个时候收到了memory warning),假如在这之后仍然没有可用内存,则会杀死在后台的App。
APP启动
app启动的时候,内核会把app映射到一个新的内存空间,开始地址是随机的。
然后内核通过Dyld来加载动态库。
dyld(the dynamic link editor)是苹果的动态链接器,是苹果操纵系统一个紧张构成部分,在系统内核做好程序准备工作之后,交由dyld负责余下的工作。而且它是开源的,任何人可以通过苹果官网下载它的源码来阅读明白它的运作方式,相识系统加载动态库的细节。
详解传送门
Dyld 链接过程
递归映射所有的动态库
Rebase所有的镜像
Bind镜像
objc runtime 准备
初始化
1、加载动态库步调
剖析依赖所有的动态库
找到哀求的mach-o 文件
打开读取文件
验证mach-o 文件
署名
调用每个segmentmmap()函数
等到所有直接依赖的动态库加载完成,加载动态库依赖的其他动态库,如许重复举行。
一个app通常会加载400多个动态库,大多数是系统库,系统库大多数都被优化加载过程 ,以是优化的关注点在于内嵌动态库。
为了保证加载完之后,保证Rebase、Bind、Objc过程动态库相关稳定,以是要加署名。
2、Rebase
ASLR:全称是Address space layout randomization,翻译过来就是“地址空间布局随机化”。App被启动的时候,程序会被影射到逻辑的地址空间,这个逻辑的地址空间有一个起始地址,而ASLR技能使得这个起始地址是随机的。假如是固定的,那么黑客很轻易就可以由起始地址+偏移量找到函数的地址。
为什么需要Rebase?
是由于刚刚提到的ASLR使得地址随机化,导致起始地址不固定,另外由于Code Sign,导致不能直接修改Image。Rebase的时候只需要增长对应的偏移量即可。待Rebase的数据都存放在__LINKEDIT中。
Rebasing:调整镜像内部指针
我们可以使用命令行查看Rebase和Bind信息:
2、Binding
Binding:调整指向镜像外部的指针
问:为什么需要Binding?
答:引用动态库其他的函数大概变量,当前mach-o文件会指向其他dylib。这时候就需要Binding操纵完成这些活,Dyld会根据符号表去找到相应函数和变量地址。
Bind相对于Rebase有更复杂的计算,更少的page fault
3、Notify ObjC Runtime
完成Rebase和Bind之后,关照Runtime去做一些代码运行时需要做的事情。
需要做哪些事情:
大多数的Objc初始化在rebasing和binding之后完成
所有的objc 类的界说在这时候被注册
non-fragile 属性偏移量调整更新(non-fragile ivar 是在modern runtime新增特性,为了不需要重新编译调整变量内存分布)
种别被插入方法列表
方法器的独特性
4、Initializers
完成objc的相关工作之后,需要完成动态库一些初始化工作:
c++为静态分配的对象生成初始化器
ObjC +load 方法
运行“自下而上”,如许每个初始化器都可以调用它下面的dylibs
最后,Dyld在可执行文件中调用main()
Pre-main() 总结
pre-mian 阶段主要是Dyld做的工作:
深度加载依赖的动态库
修正DATA pages的指针
运行初始化工作
自我先容一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到如今。
深知大多数前端工程师,想要提升技能,每每是自己探索成长大概是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学结果低效又漫长,而且极易碰到天花板技能故步自封!
因此网络整理了一份《2024年Web前端开发全套学习资料》,初衷也很简朴,就是希望可以大概帮助到想自学提升又不知道该从何学起的朋友,同时减轻各人的负担。
既有适合小白学习的零底子资料,也有适合3年以上履历的小伙伴深入学习提升的进阶课程,根本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目次截图出来,每个节点里面都包罗大厂面经、学习笔记、源码课本、实战项目、解说视频,而且会连续更新!
假如你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
由于篇幅限制,pdf文档的详解资料太全面,细节内容着实太多啦,以是只把部分知识点截图出来粗略的先容,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮助点赞+点击【学习资料】即可免费领取!
3/13/H4lCoPEF.jpg" />
最后
由于篇幅限制,pdf文档的详解资料太全面,细节内容着实太多啦,以是只把部分知识点截图出来粗略的先容,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮助点赞+点击【学习资料】即可免费领取!
[外链图片转存中…(img-MiOXTKrq-1712113250198)]
[外链图片转存中…(img-63TMlulu-1712113250198)]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
锦通
金牌会员
这个人很懒什么都没写!
楼主热帖
漏洞利用
vue3 - 最新详细实现 “拖曳式课程表“ ...
如何成为一位人心所向的管理者?我的经 ...
医院HIS体系厂家统计
如何在文章中设置灰色文本框(正文底色 ...
快速入手node.js
Vue实现复制粘贴功能
理解MVCC
java全套电子书分享(可直接下载) ...
奇怪,为什么ArrayList初始化容量大小 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表