第六章 可執(zhí)行文件的裝載與進(jìn)程

第五章 Windows PE/COFF

5.1 Windows的二進(jìn)制文件格式PE/COFF

  • 組成和大多ELF一樣匈子,文件頭,后面若干個(gè)段,后面符號(hào)表,調(diào)試信息的內(nèi)容
  • COFF的文件頭包括描述文件的總體結(jié)構(gòu)炭菌,屬性的Image Header,另外一個(gè)是段表

6.1 進(jìn)程虛擬地址空間

  • 每個(gè)程序被運(yùn)行起來(lái)都擁有獨(dú)立的虛擬地址空間,具體大小是硬件決定的逛漫,理論上是硬件內(nèi)存大小黑低,例如32位硬件,虛擬內(nèi)存大小就是4GB
  • 由于程序在運(yùn)行的時(shí)候是在操作系統(tǒng)之下進(jìn)行的酌毡,在分配給程序的虛擬空間中克握,有一部分是操作系統(tǒng)所占用的

6.2 裝載的方式

  • 程序執(zhí)行時(shí)所需要的指令和數(shù)據(jù)必須在呢村中才能正常運(yùn)行,最簡(jiǎn)單的就是全部裝入內(nèi)存枷踏,問(wèn)題是當(dāng)內(nèi)存小的時(shí)候菩暗,并不能完全裝入內(nèi)存
  • 考慮到了內(nèi)存大小不夠的情況,出現(xiàn)兩種典型加載內(nèi)存的方式:覆蓋裝入旭蠕、頁(yè)映射停团,都是動(dòng)態(tài)裝載方法,核心思想就是用到哪個(gè)模塊掏熬,就將哪個(gè)模塊裝入內(nèi)存佑稠,如果不用就存放在磁盤中

6.2.1 覆蓋裝入

  • 目前已經(jīng)被淘汰,典型的時(shí)間換空間的做法旗芬,將原有的寫入磁盤舌胶,新的直接覆蓋,需要用以前的再進(jìn)行置換

6.2.2 頁(yè)映射

  • 在內(nèi)存中劃分的最小單位為“頁(yè)”岗屏,都是以頁(yè)的方式進(jìn)行置換

6.3 從操作系統(tǒng)角度看可執(zhí)行文件的裝載

  • 現(xiàn)在硬件的MMU提供地址轉(zhuǎn)換的功能辆琅,因?yàn)轫?yè)從磁盤加載到物理內(nèi)存中漱办,還得進(jìn)行重定位这刷,MMU就是干這個(gè)的,MMU-》硬件地址轉(zhuǎn)換以及頁(yè)映射機(jī)制

6.3.1 進(jìn)程的建立

  • 從操作系統(tǒng)的角度看娩井,進(jìn)程最關(guān)鍵的特征是獨(dú)立的虛擬地址空間暇屋,這使得它有別于其他進(jìn)程
  • 創(chuàng)建一個(gè)進(jìn)程,然后裝載相應(yīng)的可執(zhí)行文件并且執(zhí)行主要步驟:

    1.創(chuàng)建獨(dú)立的虛擬空間

    2.讀取可執(zhí)行文件頭洞辣,建立虛擬內(nèi)存與可執(zhí)行文件的映射關(guān)系

    3.將CPU的指令寄存器設(shè)置成可執(zhí)行文件的入口地址咐刨,啟動(dòng)運(yùn)行

6.3.2 頁(yè)錯(cuò)誤

  • 虛擬內(nèi)存區(qū)域:VMA
  • 當(dāng)讀取的頁(yè)沒(méi)在內(nèi)存中,就認(rèn)為這是一個(gè)頁(yè)錯(cuò)誤扬霜,Page Fault定鸟,CPU將控制權(quán)交給操作系統(tǒng),操作系統(tǒng)負(fù)責(zé)后續(xù)處理,操作系統(tǒng)會(huì)根據(jù)映射關(guān)系找到這個(gè)數(shù)據(jù)結(jié)構(gòu)著瓶,并找到空白頁(yè)联予,建立虛擬頁(yè)與物理頁(yè)的映射關(guān)系,此時(shí)相關(guān)數(shù)據(jù)已經(jīng)準(zhǔn)備好了,再將控制權(quán)交給進(jìn)程沸久,進(jìn)程從剛才的頁(yè)錯(cuò)誤的位置重新開(kāi)始執(zhí)行

6.4 進(jìn)程虛擬空間分布

  • 操作系統(tǒng)并不care加載的內(nèi)容是什么季眷,他只關(guān)心和加載相關(guān)的問(wèn)題,比如段的權(quán)限(可讀卷胯,可寫子刮,可執(zhí)行)
  • 通常代碼段的權(quán)限是可讀可執(zhí)行,數(shù)據(jù)段和BSS段是可讀可寫窑睁,只讀數(shù)據(jù)段的權(quán)限是只讀的段
  • ELF文件引入Segment概念挺峡,將相同權(quán)限的東西放在一起的劃分概念,會(huì)把相同權(quán)限的section都劃分到一個(gè)segment中
  • 描述section屬性的結(jié)構(gòu)膠段表担钮,描述segment的叫程序頭沙郭,它描述了ELF文件該如何被操作系統(tǒng)映射到進(jìn)程的虛擬空間
  • 在加載虛擬內(nèi)存的時(shí)候,會(huì)按照不同的segment去分配VMA
  • ELF可執(zhí)行文件中有一個(gè)專門的數(shù)據(jù)結(jié)構(gòu)叫程序頭表裳朋,用來(lái)保存segment的信息病线,它描述了ELF文件該如何北操作系統(tǒng)映射到進(jìn)程的虛擬空間
  • ELF目標(biāo)文件因?yàn)椴恍枰谎b載,就沒(méi)有程序頭表

6.4.2 堆和棧

  • VMA除了被用來(lái)映射可執(zhí)行文件中的各個(gè)“segment”鲤嫡,還有其他作用送挑,操作系統(tǒng)通過(guò)使用VMA對(duì)進(jìn)程的地址空間進(jìn)行管理
  • 多數(shù)情況下每一個(gè)進(jìn)程的棧和堆都有對(duì)應(yīng)的VMA

6.4.5 進(jìn)程棧初始化

  • 進(jìn)程在剛啟動(dòng)的時(shí)候需要一些進(jìn)程運(yùn)行的環(huán)境,最基本的就是系統(tǒng)環(huán)境變量和進(jìn)程的運(yùn)行參數(shù)暖眼,常見(jiàn)的做法是操作系統(tǒng)在進(jìn)程啟動(dòng)前將這些信息提前保存到進(jìn)程的虛擬空間的棧中

6.5 Linux內(nèi)核裝載ELF過(guò)程簡(jiǎn)介

  • fork是分身惕耕,execve函數(shù)是變身,fork能復(fù)制出當(dāng)前進(jìn)程诫肠,execve可以在讓當(dāng)前進(jìn)程改動(dòng)
  • bash進(jìn)程會(huì)調(diào)用fork()創(chuàng)建一個(gè)新的進(jìn)程司澎,再在新的進(jìn)程中調(diào)用execve(),調(diào)用指定的可執(zhí)行文件

7.6 動(dòng)態(tài)鏈接的步驟和實(shí)現(xiàn)

  • 動(dòng)態(tài)鏈接分3步:

    1.啟動(dòng)動(dòng)態(tài)鏈接器

    2.裝載所需要的共享對(duì)象

    3.重定位和初始化

7.6.2 裝載共享對(duì)象

  • 動(dòng)態(tài)鏈接器將可執(zhí)行文件和鏈接器本身的符號(hào)表都合并到一個(gè)符號(hào)表中,我們稱為全局符號(hào)表
  • 鏈接器加載文件常見(jiàn)的是廣度優(yōu)先
  • 共享對(duì)象里面的全局符號(hào)唄另一個(gè)共享對(duì)象的同名全局符號(hào)覆蓋的現(xiàn)象叫共享對(duì)象全局符號(hào)介入
  • 在Linux下一個(gè)符號(hào)需要被加入全局符號(hào)表時(shí)栋豫,如果相同的符號(hào)名已經(jīng)存在挤安,后加入的符號(hào)會(huì)被忽略
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丧鸯,隨后出現(xiàn)的幾起案子蛤铜,更是在濱河造成了極大的恐慌,老刑警劉巖丛肢,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件围肥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蜂怎,警方通過(guò)查閱死者的電腦和手機(jī)穆刻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)杠步,“玉大人氢伟,你說(shuō)我怎么就攤上這事撰洗。” “怎么了腐芍?”我有些...
    開(kāi)封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵差导,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猪勇,道長(zhǎng)设褐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任泣刹,我火速辦了婚禮助析,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椅您。我一直安慰自己外冀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布掀泳。 她就那樣靜靜地躺著雪隧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪员舵。 梳的紋絲不亂的頭發(fā)上脑沿,一...
    開(kāi)封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音马僻,去河邊找鬼庄拇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛韭邓,可吹牛的內(nèi)容都是我干的措近。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼女淑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瞭郑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诗力,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凰浮,失蹤者是張志新(化名)和其女友劉穎我抠,沒(méi)想到半個(gè)月后苇本,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菜拓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年瓣窄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纳鼎。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俺夕,死狀恐怖裳凸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情劝贸,我是刑警寧澤姨谷,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站映九,受9級(jí)特大地震影響梦湘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜件甥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一捌议、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧引有,春花似錦瓣颅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至曾我,卻和暖如春守谓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背您单。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工斋荞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虐秦。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓平酿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悦陋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜈彼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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