成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從虛擬內存看可執行文件的裝載

云計算 虛擬化
當雙擊打開一個可執行文件的時候,計算機究竟干了什么?磁盤上的可執行文件是怎么裝載到內存當中去的?對于眾多程序猿來說,這也仍然是一個不太容易回答的問題。

[[373936]]

本文轉載自微信公眾號「Linux澡堂子」,作者冷面不冷 。轉載本文請聯系Linux澡堂子公眾號。  

當雙擊打開一個可執行文件的時候,計算機究竟干了什么?磁盤上的可執行文件是怎么裝載到內存當中去的?對于眾多程序猿來說,這也仍然是一個不太容易回答的問題。

這次讓我們從虛擬內存的角度來看看可執行文件的裝載過程,仔細分析從可執行文件開始裝載到第一條指令執行時發生了什么。

本文不再詳細解釋進程的概念、ELF文件結構、虛擬內存的定義、分頁的概念、請求分頁的工作原理,之前的文章講過,感興趣的小伙伴自行搜索。

裝載大體上可以分為以下幾步:

  1. 創建進程
  2. 創建虛擬地址空間
  3. 讀取可執行文件頭,建立虛擬地址空間與可執行文件的映射關系
  4. 設置CPU指令寄存器為可執行文件入口地址
  5. 執行,觸發缺頁中斷

創建進程

創建進程不必多說了,此時會創建如進程標識符、進程優先級之類的信息。注意此時還不涉及到可執行文件。

創建虛擬地址空間

這一步其實應該算在創建進程里面,實際就是創建頁表(多級頁表),用來與物理內存建立連接,此時這個頁表是空的。此時仍然不涉及到可執行文件。

讀取可執行文件頭

這個就是關鍵的一步了。進程開始讀取可執行文件頭,即ELF文件的頭部,此時進程也僅僅讀取ELF文件頭部,不涉及到其他段。ELF文件頭中含有可執行文件各段的起始地址和長度等信息,以及可執行文件入口地址,注意這里"地址"即虛擬內存地址。

這里需要強調的是:整個裝載過程也僅僅是讀取了ELF頭部,僅此而已。因為ELF頭部記錄了整個可執行文件的節奏,所以根據ELF頭部即可建立整個可執行文件的框架。因此,這一步是在建立與磁盤的連接。舉個簡單的例子,當發生缺頁中斷時,操作系統該去哪把缺的頁加載到物理內存?這就是這一步的關鍵之處了。將虛擬內存地址與磁盤地址建立聯系,當缺頁時即可尋找到對應的磁盤地址,從而加載到物理內存。

還需要強調的一點是,此時在進程中,實際相當于是僅僅保存了一個函數映射關系。如下圖有更直觀的理解。

請記住這個圖,后續我們講到內存管理的時候再把進程和內存結合起來看,到時候你就會站在上帝視角對內核有了指點江山的感覺。

設置CPU指令寄存器

如上兩步建立了虛擬地址空間和物理內存、磁盤的映射關系,現在就要準備運行此程序了。運行的第一條指令地址在哪?在ELF頭部中。將CPU指令寄存器的值設置為第一條指令地址即可。

執行,觸發缺頁中斷

想想CPU在從入口地址取指令時會發生什么。假設入口地址指向.text段首,如圖所示為0x8049000;CPU以此虛擬地址查找頁表發現該頁尚未裝載,觸發缺頁中斷。此時操作系統接管,從之前建立的虛擬地址空間與磁盤的映射關系中找到此頁在磁盤中的地址;再從此地址讀取頁,加載到物理內存,缺頁中斷完畢。CPU重新從入口地址取指令,此時由頁表得到物理地址,從內存中得到對應的指令,交給CPU。

隨著進程的執行,缺頁中斷不斷出現,磁盤中的可執行文件也逐漸加載到內存中。

總結

如上便是簡單的可執行文件的裝載過程,最需要強調的一點是,可執行文件的數據是 按需 加載到物理內存的,缺頁中斷驅動著進程的執行。

 

責任編輯:武曉燕 來源: Linux澡堂子
相關推薦

2017-02-07 10:22:53

2023-03-31 23:31:06

.go文本文件

2015-02-02 11:03:12

2012-01-05 10:37:40

Java

2010-02-22 18:04:27

CentOS mpla

2011-08-09 10:24:19

可執行文件病毒病毒

2021-01-12 10:10:41

shell腳本Linux命令

2022-05-11 14:50:34

Python解包執行文件

2021-01-08 08:06:19

腳本Shell文件

2009-06-20 09:21:37

UNIXLINUX

2024-05-06 00:00:00

Go文件瘦身代碼

2024-08-12 16:42:50

二進制工具系統

2009-04-16 10:37:17

Javaexejar

2024-05-21 12:01:39

.NET 6開發

2023-09-04 07:14:36

2022-03-07 07:57:04

Linux工具內存

2023-12-18 09:21:22

開發靜態編譯Linux

2023-12-25 16:10:34

Linuxdconfig命令

2022-05-20 08:55:02

py文件exepython

2021-01-14 22:17:09

PythonLinux工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产黄色免费网站 | 亚洲一区二区三区在线 | 久久综合激情 | 国产精品一区二区三区久久 | 精品国产一区二区在线 | 成人小视频在线观看 | 毛片一级片 | 久久一区二区免费视频 | 97天天干 | 国产91精品久久久久久久网曝门 | 亚洲二区在线 | 九九热精品视频 | 久久久久香蕉视频 | 涩涩视频大全 | 操操网站 | 国产激情免费视频 | 一级黄色片在线看 | 国产精品毛片一区二区三区 | 国产精品久久久亚洲 | 欧美日韩在线播放 | 国产一区二区在线免费观看 | 毛片黄| 三级视频在线观看 | av天天澡天天爽天天av | 成人免费在线电影 | 99热热| 日韩av免费看 | 精品国产乱码久久久久久闺蜜 | 国产成人午夜高潮毛片 | 北条麻妃99精品青青久久主播 | 日本一区二区三区四区 | 日韩欧美国产电影 | 国产丝袜一区二区三区免费视频 | 日韩看片 | 逼逼视频 | 亚洲国产成人精品久久 | 亚洲精品久久区二区三区蜜桃臀 | 中文字幕一级 | 婷婷福利视频导航 | 国产高清在线精品一区二区三区 | 国产精品久久久久久久久久 |