+ (void)load ?{
? ? printf("123");
}
這段代碼編譯完之后,這個(gè)函數(shù)會(huì)儲(chǔ)存在Mach-O中的TEXT兩個(gè)段中,__text存函數(shù)二進(jìn)制,cstring存儲(chǔ)字符串 123
要執(zhí)行printf函數(shù),首先需要訪問(wèn)__text觸發(fā)一次page In?讀入物理內(nèi)存毫玖,為了要打印字符串,還需要訪問(wèn)cstring,還會(huì)觸發(fā)一次page In
有很多同學(xué)不了解page In付枫,這里介紹一下烹玉,首先先要知道m(xù)map
mmap?的全稱(chēng)是?memory map,是一種內(nèi)存映射技術(shù)阐滩,可以把文件映射到虛擬內(nèi)存的地址空間里二打,這樣就可以像直接操作內(nèi)存那樣來(lái)讀寫(xiě)文件。
當(dāng)讀取虛擬內(nèi)存掂榔,其對(duì)應(yīng)的文件內(nèi)容在物理內(nèi)存中不存在的時(shí)候继效,會(huì)觸發(fā)一個(gè)事件:?Page In,把對(duì)應(yīng)的文件內(nèi)容讀入物理內(nèi)存中装获。
Page In又做了哪些事情呢瑞信?
MMU(Memory Management Unit,內(nèi)存管理單元)找到空閑的物理內(nèi)存頁(yè)面
觸發(fā)磁盤(pán)IO穴豫,把數(shù)據(jù)讀入到物理內(nèi)存
如果是TEXT段的頁(yè)凡简,要進(jìn)行解密(iOS13之后不需要解密)
對(duì)解密后的頁(yè),進(jìn)行簽名驗(yàn)證
為了執(zhí)行這個(gè)函數(shù)精肃,系統(tǒng)付出了兩個(gè)page In的代價(jià)秤涩,所以一旦load方法過(guò)多,會(huì)影響啟動(dòng)速度