ios內(nèi)存管理(七):物理內(nèi)存與虛擬內(nèi)存

??編寫(xiě)程序時(shí)袁滥,對(duì)內(nèi)存的維護(hù)非常重要盖桥,所有的程序都依賴(lài)于其操作的內(nèi)存,可以說(shuō)快速高效的程序和糟糕出錯(cuò)的程序之間的差距可能主要就在于是否進(jìn)行正確的內(nèi)存管理题翻。

??類(lèi)似于其他主流操作系統(tǒng)揩徊,ios上也提供了兩種類(lèi)型的內(nèi)存分配:一種是基于棧的內(nèi)存分配,另一種是基于堆的內(nèi)存分配嵌赠∷芑模基于棧的內(nèi)存分配通常由編譯器處理,因?yàn)闂V刑畛涞耐ǔ6际浅绦虻淖詣?dòng)變量姜挺;而動(dòng)態(tài)內(nèi)存分配一般都在堆上進(jìn)行齿税。

??在最開(kāi)始的幾節(jié)還提到過(guò),對(duì)于每一個(gè)進(jìn)程來(lái)說(shuō)炊豪,其獨(dú)自享有一個(gè)私有的地址空間凌箕,這個(gè)地址空間可以通過(guò)LC_SEGMENT命令填充可執(zhí)行文件以及各種庫(kù)的代碼拧篮。整個(gè)地址空間分為保護(hù)段、代碼段牵舱、dyld段串绩、數(shù)據(jù)段等。不同進(jìn)程的內(nèi)存地址空間相互獨(dú)立芜壁,互不影響礁凡。

??順便相關(guān)的還有ASLR技術(shù):地址空間布局隨機(jī)化。進(jìn)程在自己的私有的虛擬地址空間中啟動(dòng)慧妄,按照傳統(tǒng)的方式顷牌,進(jìn)程每一次啟動(dòng)都采用固定的可預(yù)見(jiàn)的方式。然后這也意味著某個(gè)給定程序再某個(gè)給定架構(gòu)上的進(jìn)程初始虛擬內(nèi)存鏡像都是基本一致的塞淹。更加嚴(yán)重的問(wèn)題是窟蓝,即使是在進(jìn)程正常運(yùn)行的生命周期中,大部分內(nèi)存分配的操作都是按照同樣的方式進(jìn)行的窖铡,因此使得內(nèi)存中的地址分布具有非常強(qiáng)的可預(yù)測(cè)性疗锐。這就給黑客提供了很大的施展空間。黑客可以可靠的判斷要重寫(xiě)那些指針费彼,判斷注入代碼應(yīng)該在內(nèi)存的什么位置滑臊,從而通過(guò)緩存區(qū)溢出等技術(shù),重寫(xiě)內(nèi)存中的函數(shù)指針箍铲,將程序的執(zhí)行路徑轉(zhuǎn)到自己的代碼雇卷。ASLR是一種避免類(lèi)似攻擊的有效保護(hù)。進(jìn)程每一次啟動(dòng)時(shí)颠猴,地址空間都會(huì)被簡(jiǎn)單地隨機(jī)化:進(jìn)行整體的地址偏移关划,而不是攪亂。通過(guò)內(nèi)核將整個(gè)進(jìn)程的內(nèi)存空間“平移”某個(gè)隨機(jī)數(shù),進(jìn)程的基本內(nèi)存布局如程序文本、數(shù)據(jù)掏导、庫(kù)等相對(duì)位置仍然是一樣的,但其具體的地址都不同了调榄,可以比較有效的阻擋黑客對(duì)地址的猜測(cè)。

??上面提到的堆和棧呵扛、地址空間和ASLR等技術(shù)每庆,背后都隱含著一個(gè)概念:虛擬內(nèi)存〗翊基本所有的現(xiàn)代操作系統(tǒng)都有虛擬內(nèi)存的概念缤灵,相對(duì)的就有物理內(nèi)存的概念。物理內(nèi)存就是實(shí)打?qū)嵉拇娣艛?shù)據(jù)的硬件,虛擬內(nèi)存是在物理內(nèi)存上的一層與具體硬件無(wú)關(guān)的抽象腮出。顯而易見(jiàn)帖鸦,用戶(hù)態(tài)不可能也不應(yīng)該和物理內(nèi)存層打交道。

??Mach的虛擬內(nèi)存子系統(tǒng)可以說(shuō)和其要管理的虛擬內(nèi)存一樣復(fù)雜和充滿(mǎn)了各種細(xì)節(jié)利诺,下面簡(jiǎn)單介紹一下物理內(nèi)存層和虛擬內(nèi)存層這兩個(gè)層次富蓄。

??盡管我們寫(xiě)程序時(shí)不關(guān)注物理內(nèi)存層,但任何內(nèi)存地址最終還是要翻譯為物理地址慢逾。機(jī)器的RAM實(shí)際上是虛擬內(nèi)存中開(kāi)的窗口,允許程序訪(fǎng)問(wèn)虛擬內(nèi)存中有限的而且通常是不連續(xù)的區(qū)域灭红。對(duì)Mach來(lái)說(shuō)侣滩,物理內(nèi)存層最重要的一個(gè)概念為pmap。pmap從設(shè)計(jì)上對(duì)物理內(nèi)存提供了一個(gè)統(tǒng)一的接口变擒,屏蔽了架構(gòu)相關(guān)的區(qū)別君珠,這對(duì)于支持像X86架構(gòu)或者ARM架構(gòu)非常重要。pmap在邏輯上由兩個(gè)子層構(gòu)成:一是機(jī)器無(wú)關(guān)層娇斑,提供了一組基本上和機(jī)器無(wú)關(guān)的API策添。這些API只要求機(jī)器支持基本的虛擬內(nèi)存分頁(yè)概念。二是機(jī)器相關(guān)層毫缆,將pmap綁定到一個(gè)具體的實(shí)現(xiàn)唯竹,處理底層架構(gòu)的各種細(xì)節(jié)。這一層主要是各種和硬件相關(guān)的宏定義苦丁,如頁(yè)表項(xiàng)宏浸颓、位掩碼、寄存器等等旺拉。從面向?qū)ο蟮慕嵌瓤床希瑱C(jī)器無(wú)關(guān)層類(lèi)似pmap提供的接口,而機(jī)器相關(guān)層則是pmap的實(shí)現(xiàn)蛾狗。只要接口不變晋涣,那么上層邏輯可以完全不用考慮具體的實(shí)現(xiàn)細(xì)節(jié)。因此沉桌,pmap的實(shí)現(xiàn)細(xì)節(jié)對(duì)于其上層的系統(tǒng)來(lái)說(shuō)是透明的谢鹊,這樣可以最大化實(shí)現(xiàn)可移植性,缺點(diǎn)就是損失一部分性能蒲牧。

??虛擬內(nèi)存層完全以一種機(jī)器無(wú)關(guān)的方式來(lái)管理內(nèi)存撇贺,這一層有幾種關(guān)鍵的抽象:一是vm_map,表示任務(wù)地址空間的一個(gè)或多個(gè)虛擬內(nèi)存區(qū)域冰抢。每一個(gè)區(qū)域都由一個(gè)獨(dú)立的條目vm_map_entry表示松嘶,這些條目由一個(gè)雙向鏈表vm_map_links維護(hù)。二是 vm_map_entry挎扰,這是關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)翠订,每一個(gè)該結(jié)構(gòu)都表示了虛擬內(nèi)存中的一塊連續(xù)的區(qū)域巢音,每一個(gè)這樣的區(qū)域都可以通過(guò)指定的訪(fǎng)問(wèn)保護(hù)權(quán)限進(jìn)行保護(hù)。任務(wù)之間可以共享區(qū)域尽超。它通常指向一個(gè)vm_object官撼,也可以指向一個(gè)嵌套的vm_map,即子映射似谁。三是vm_object傲绣,用于將vm_map_entry和實(shí)際支撐的內(nèi)存關(guān)聯(lián)起來(lái)。這個(gè)數(shù)據(jù)結(jié)構(gòu)包含一個(gè)vm_page的鏈表巩踏,還包含一個(gè)用于訪(fǎng)問(wèn)正確分頁(yè)器的Mach端口秃诵,通過(guò)這個(gè)分頁(yè)器進(jìn)行頁(yè)面的獲取或清理操作。四是 vm_page塞琼,真正表示完整的或部分的vm_object菠净,并含有各種頁(yè)狀態(tài)。這些數(shù)據(jù)結(jié)構(gòu)加上其狀態(tài)管理彪杉,再加上換頁(yè)算法毅往,基本就是虛擬內(nèi)存系統(tǒng)的主要內(nèi)容。這些實(shí)現(xiàn)非常復(fù)雜派近,沒(méi)法在這里展開(kāi)了攀唯。

??總之,我們平常所說(shuō)的各種內(nèi)存概念基本都是在用戶(hù)態(tài)的針對(duì)虛擬內(nèi)存層的构哺。操作系統(tǒng)幫我們屏蔽了復(fù)雜的硬件實(shí)現(xiàn)革答。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市曙强,隨后出現(xiàn)的幾起案子残拐,更是在濱河造成了極大的恐慌,老刑警劉巖碟嘴,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溪食,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡娜扇,警方通過(guò)查閱死者的電腦和手機(jī)错沃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雀瓢,“玉大人枢析,你說(shuō)我怎么就攤上這事∪恤铮” “怎么了醒叁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我把沼,道長(zhǎng)啊易,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任饮睬,我火速辦了婚禮租谈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捆愁。我一直安慰自己割去,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布昼丑。 她就那樣靜靜地躺著劫拗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矾克。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天憔足,我揣著相機(jī)與錄音胁附,去河邊找鬼。 笑死滓彰,一個(gè)胖子當(dāng)著我的面吹牛控妻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揭绑,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼弓候,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了他匪?” 一聲冷哼從身側(cè)響起菇存,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邦蜜,沒(méi)想到半個(gè)月后依鸥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悼沈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年贱迟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片絮供。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衣吠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壤靶,到底是詐尸還是另有隱情缚俏,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站袍榆,受9級(jí)特大地震影響胀屿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜包雀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一宿崭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧才写,春花似錦葡兑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至厨疙,卻和暖如春洲守,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沾凄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工梗醇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撒蟀。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓叙谨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親保屯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子手负,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容