版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
33|iOSXNU:App20190525 在專欄的第2篇文章《App啟動(dòng)速度怎么做優(yōu)化與監(jiān)控?》更新完之后,我看到很多同學(xué)對(duì)啟動(dòng)加載App的底層原理表示出了濃厚興趣。所謂工欲善其事,必先利其器,相信有著好奇心的你,一定也會(huì)對(duì)支撐著App運(yùn)行的操作系統(tǒng)有著各種各樣的疑問。我曾在專欄的第5篇文章《鏈接器:符號(hào)是怎么綁定到地址上的?》中,和你分享了鏈接之前,系統(tǒng)是怎么加載App的。iOSiOSiOSiOS系統(tǒng)是基于ARMSpringBoard、Spotlight、第二層是應(yīng)用框架層,是開發(fā)者會(huì)用到的。這一層包含了開發(fā)框架CocoaTouch架、Metal等。Darwin核XNU、驅(qū)動(dòng)等。圖1iOSAppDarwin是用戶態(tài)的下層支撐,是iOS系統(tǒng)的核心。DarwinXNU,XNUUNIXXNU所以接下來,我們就一起看看XNUXNUMach、BSDAPIIOKitlibkern、libsa、PlatformExpert。如下圖所示:圖2XNU其中,Mach是作為UNIX內(nèi)核的替代,主要解決UNIX一切皆文件導(dǎo)致抽象機(jī)制不足的問題,為現(xiàn)代操作系統(tǒng)做了進(jìn)一步的抽象工作。Mach負(fù)責(zé)操作系統(tǒng)最基本的工作,包括進(jìn)程MachMachTask,MachTask地址空間、IPC空間、處理器資源、調(diào)度控制、線程容器。BSDBSDProcess,BSDProcessMachTask,增加了進(jìn)程ID、信號(hào)信息等,BSDProcess里面包含了擴(kuò)展MachThread結(jié)構(gòu)的Uthread。Mach的模塊包括進(jìn)程和線程都是對(duì)象,對(duì)象之間不能直接調(diào)用,只能通過MachMsg進(jìn)行通信,也就是mach_msg()架層和核心框架層中,你可以通過mach_msg_trap()函數(shù)觸發(fā)陷阱,從而切至MachMachmach_msg()NSHipster章“Inter-ProcessCommunication”。每個(gè)MachThread表示一個(gè)線程,是Mach里的最小執(zhí)行單位。MachThread有自己的狀態(tài),包括機(jī)器狀態(tài)、線程棧、調(diào)度優(yōu)先級(jí)(有128個(gè),數(shù)字越大表示優(yōu)先級(jí)越高)、調(diào)度策略、內(nèi)核Port、異常Port。MachThread既可以由MachTask處理,也可以擴(kuò)展為Uthread,通過BSDProcess處理。這是因?yàn)閄NU采用的是微內(nèi)核Mach和宏內(nèi)核BSD的混合內(nèi)核,具備微內(nèi)核和宏內(nèi)Mach是微內(nèi)核,可以將操作系統(tǒng)的核心獨(dú)立在進(jìn)程上運(yùn)行,不過,內(nèi)核層和用戶態(tài)各層之間切換上下文和進(jìn)程間消息傳遞都會(huì)降低性能。為了提高性能,蘋果深度定制了BSD宏內(nèi)核,使其和Mach混合使用。宏內(nèi)核BSD是對(duì)MachOperatingSystemInterfaceofUNIX,可移植操作系統(tǒng)接口)兼容。BSDUNIXBSDUNIXXNUBSD來源于FreeBSD內(nèi)核,經(jīng)過深度定制而成。IEEE為了保證軟件可以在各個(gè)UNIX系POSIX,iOSBSDPOSIXUNIX系BSD提供了更現(xiàn)代、更易用的內(nèi)核接口,以及POSIX的兼容,比如通過擴(kuò)展MachTask進(jìn)程結(jié)構(gòu)為BSDProcess。對(duì)于Mach使用mach_msg_trap()函數(shù)觸發(fā)陷阱來處理異常消息,BSD則在異常消息機(jī)制的基礎(chǔ)上建立了信號(hào)處理機(jī)制,用戶態(tài)產(chǎn)生的信號(hào)會(huì)先被Mach轉(zhuǎn)換成異常,BSD將異常再轉(zhuǎn)換成信號(hào)。對(duì)于進(jìn)程和線程,BSD會(huì)構(gòu)建UNIX進(jìn)程模型,創(chuàng)建POSIX兼容的線程模型pthread。iOS6后,為了增強(qiáng)系統(tǒng)安全,BSD實(shí)行了ASLR(AddressSpaceLayoutRandomization,地址空間布局隨機(jī)化)iPhone核,BSDGCDBSD還從TrustdBSD引入了MAC框架以增強(qiáng)權(quán)限entitlement機(jī)制的安全。除了微內(nèi)核Mach和宏內(nèi)核BSD外,XNU還有IOKit。IOKit境,包含電源、內(nèi)存、CPUIOKitlibkernC++EmbeddedC++編寫了驅(qū)動(dòng)程序基類,比如OSObject、OSArray、OSString等,新驅(qū)動(dòng)可以繼承這些基了解了XNUXNU怎么加載AppXNUiOSMach-OAPPMach-OMach-Oheader1structmach_header_64264位還是323CPU類型,比如arm或4CPU子類型,比如56loadcommands7loadcommands89106432magic、CPUcputype、CPU類型cpusubtype、文件類型filetype、描述文件在虛擬內(nèi)存中邏輯結(jié)構(gòu)和布局的loadcommands數(shù)量和大小等文件信息。filetypeMach-OMach-OOBJECT,指的是.o文件或者.aEXECUTE,指的是IPA拆包后的文件;DYLIB,.dylib.frameworkDYLINKER,Mach-Ofork內(nèi)存、為進(jìn)程創(chuàng)建主線程、代碼簽名等。用戶態(tài)dyld會(huì)對(duì)Mach-O文件做庫加載和符號(hào)蘋果公司已經(jīng)將XNU開源,并在GitHub上創(chuàng)建了鏡像。要想編譯XNU,你可以查看“BuildingtheXNUkernelonMacOSXSierra(10.12.X)”這篇文章;要想調(diào)試XNU,可以查看“SourceLevelDebuggingtheXNUKernel”這篇文章。forkMach-OXNUdarwin-xnu/bsd/kern/kern_exec.c,地址是https://githubcom/apple/darwin-xnu/blob/master/bsd/kern/kernexec.c,相關(guān)代碼在_mac_execve函數(shù)里,代碼如1mac_execve(proc_tp, mac_execve_args*uap,int32_t2345intis_64=6structvfs_context7structuthread*uthread;//8task_tnew_task= //Mach9context.vc_thread=context.vc_ucred=//分配大塊內(nèi)存,不用堆棧是因?yàn)镸ach-OMALLOC(bufp,char*,(sizeof(*imgp)+sizeof(*vap)+sizeof(*origvap)),M_TEMP,imgp=(structimage_params*)//初始化imgputhread=if(uthread->uu_flag&UT_VFORK)imgp->ip_flags|=in_vfexec=}else//程序如果是啟動(dòng)態(tài),就需要forkimgp->ip_flags|=//forkimgp->ip_new_thread=NULL,p,FALSE,p->p_flag&P_LP64,new_task=get_threadtask(imgp-context.vc_thread=imgp-}69
//加載解析Mach-error=if(imgp->ip_new_thread!=NULL)new_task=get_threadtask(imgp-}if(!error&&!in_vfexec)p=proc_exec_switch_task(p,current_task(),new_task,imgp-should_release_proc_ref=}if(!error){proc_transend(p,0);if(!in_vfexec)proc_inherit_task_role(get_threadtask(imgp->ip_new_thread),}thread_tmain_thread=imgp->ip_new_thread;task_set_main_thread_qos(new_task,main_thread);}可以看出,由于Mach-O文件很大, mac_execve函數(shù)會(huì)先為Mach-O分配一大塊內(nèi)存imgp,接下來會(huì)初始化imgp里的公共數(shù)據(jù)。內(nèi)存處理完, mac_execve函數(shù)就會(huì)通過fork_create_child()函數(shù)fork出一個(gè)新的進(jìn)程。新進(jìn)程fork后,會(huì)通過exec_activate_image()函數(shù)解析加載Mach-O文件到內(nèi)存imgp里。最后,使用task_set_main_thread_qos()函數(shù)設(shè)置新fork出進(jìn)程的主線程。structexecswint(*ex_imgact)(structimage_paramsconstchar}execsw[]={ "Mach-oBinary"{ "FatBinary"{ "InterpreterScript"{NULL,9Mach-Oexec_mach_imgact()exec_mach_imgact()通過load_machfile()函數(shù)加載Mach-O文件,根據(jù)解析Mach-O后得到的loadcommandactivate_exec_state()解析加載Mach-O后的結(jié)構(gòu)信息,設(shè)置執(zhí)行App的入口點(diǎn)。設(shè)置完入口點(diǎn)后會(huì)通過load_dylinker()函數(shù)來解析加載dyld,然后將入口點(diǎn)地址改成dyldMach-O態(tài)層dyld加載App了。Dyld的入口函數(shù)是dyld_start,dyld屬于用戶態(tài)進(jìn)程,不在XNU里,dyld_start函dylddyldStartup.s文件里。dyld_startApp態(tài)庫,處理完成后會(huì)返回App的入口地址,然后到App的main函數(shù)。今天我跟你介紹了iOS系統(tǒng)的內(nèi)核XNU,以及XNU是如何加載App的??傮w來說,XNUMach-OMach-Ofork為Mach-O解析Mach-讀取Mach-O遍歷loadcommand信息,將Mach-O啟動(dòng)dyld在今天這篇文章中,我主要和你分享的是系統(tǒng)內(nèi)核加載App的流程,而關(guān)于用戶態(tài)dyld加載過程沒有展開說。如果你想了解dyld加載過程的話,可以看看MikeAsh的“dyld:DynamicLinkingOnOSX” 34|iOS黑魔法RuntimeMethodSwizzling背后的原 4MacOSX&IOS 1報(bào)錯(cuò)的時(shí)候
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版高新技術(shù)企業(yè)研發(fā)項(xiàng)目采購合同2篇
- 二零二五年度高校與公益組織合作辦學(xué)合同3篇
- 二零二五版家庭健康養(yǎng)生及食療服務(wù)合同3篇
- 二零二五年度生態(tài)雞養(yǎng)殖基地購銷合同標(biāo)準(zhǔn)版3篇
- 二零二五版桉樹生物質(zhì)能源開發(fā)合同2篇
- 二零二五年房地產(chǎn)銷售代理合同中止及終止協(xié)議6篇
- 二零二五版智能倉儲(chǔ)貨物承包運(yùn)輸一體化合同3篇
- 二零二五年智能空調(diào)銷售及綠色環(huán)保安裝合同樣本3篇
- 二零二五年度車庫產(chǎn)權(quán)買賣及物業(yè)服務(wù)合同范本3篇
- 二零二五年文化藝術(shù)品油漆保護(hù)修復(fù)合同3篇
- 春節(jié)文化常識(shí)單選題100道及答案
- 2024年杭州師范大學(xué)附屬醫(yī)院招聘高層次緊缺專業(yè)人才筆試真題
- 24年追覓在線測評(píng)28題及答案
- TGDNAS 043-2024 成人靜脈中等長度導(dǎo)管置管技術(shù)
- 《陸上風(fēng)電場工程概算定額》NBT 31010-2019
- 罐區(qū)自動(dòng)化系統(tǒng)總體方案(31頁)ppt課件
- BIQS評(píng)分表模板
- 工程建設(shè)項(xiàng)目內(nèi)外關(guān)系協(xié)調(diào)措施
- 招投標(biāo)法考試試題及答案
- 皮帶輸送機(jī)工程施工電氣安裝措施要點(diǎn)
- 藥房(冰柜)溫濕度表
評(píng)論
0/150
提交評(píng)論