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 函數地址 虛擬地址
也可以打印方法所在線程。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容