iOS底层-启动优化(32、33)

启动优化
dyld:检查耗时反馈, 配置环境变量 DYLD_PRINT_STATISTICS
一般空项目启动在400ms以内

main之前:pre-main
1、加载动态库时间: 系统库已经存在共享缓存中了,自己的尽量不要大于六个
2、rebase/rebinding时间 :mach-o文件、虚拟内存
3、注册类的时间:注册到全局表,catagory方法插入,废弃的类(只要类存在工程中)
4、load方法、构造函数:不要做太多延迟的事情

rebase/rebinding
链接:编译时
绑定:运行时 (懒加载方式)

早期的内存地址是物理地址:1、内存不够;2、安全问题
后来 :懒加载,用哪里加载哪里

物理地址由cpu mmu 内存管理单元(硬件)管理

应用 - 虚拟地址 - 物理地址 -内存

映射表:page 内存单位
iOS(arm64):16k 大小与硬件相关
Mac:4k
MachO文件格式
顺序:write link map file :YES

物理内存是由操作系统进行管理的,且不会对程序员提供接口的。
虚拟页表:虚拟内存8G,访问空间4G
执行的代码访问的是虚拟页表中的地址(包括po)
载入内存过程中不活跃的内存会被覆盖掉

二进制 8字节 超过8G的数字没有了 0x00000100000001 0xffffffffffffffff
内存从4G开始。前4G不让用,是因为隔离32位。
所以64位从0x00000100000000开始 小于这个地址是32位的。
8字节最高效

ASLR:让每次生成的虚拟页表首地址从随机位置开始(iOS4.3)
编译地址:偏移地址offset
rebase:ASLR+offfset

pagefault :当代码访问没有被载入内存的数据会产生缺页异常/缺页中断。
产生大量的缺页异常用户会感知,最常见冷启动
二进制重排:减少pagefault次数,将启动方法放到一起
函数前加 _ 就是符号
orderfile:./xy.order

tracing pcs:跟踪cpu执行到的代码

查看最后一个数据,stop位置往上走4个字节,是最后一个数据

三方的库生成不了macho的没必要hook
other c flags 插桩标识符:-fsanitize-coverage=func,trace-pc-guard
在SWift代码中加入Chang插桩标识符other swift flags:
-sanitize-coverage=func
-sanitize=undefined
hook所有的回调函数
void __sanitizer_cov_trace_pc_guard(uint32_t *guard){
}
只要添加clang插桩的标记,就会在函数 block边缘添加__sanitizer_cov_trace_pc_guard ,相当于修改二进制文件()
只会hook自己的代码。
__sanitizer_cov_trace_pc_guard 会损耗性能
fname macho文件名
fbase 起始位置
sname 方法名
saddr 函数地址 虚拟地址
也可以打印方法所在线程。

你可能感兴趣的:(iOS底层-启动优化(32、33))