精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Gcc編譯時,鏈接器安排的【虛擬地址】是如何計算出來的?

系統 Linux
在Linux系統中,有4種類型的文件都是ELF格式,包括:目標文件,可執行文件,動態鏈接庫文件、核心轉儲文件。

問題描述

昨天下午,旁邊的同事在學習Linux系統中的虛擬地址映射(經典書籍《程序員的自我修養-鏈接、裝載與庫》),在看到6.4章節的時候,對于一個可執行的ELF文件中,虛擬地址的值百思不得其解!

例如下面這段C代碼:

首先編譯出32位的可執行程序(為了避開一些與主題無關的干擾因素,采用了靜態鏈接):

gcc -m32 -static test.c -o test

編譯得到ELF格式的可執行文件:test。

這個時候,使用readelf工具來查看這個可執行文件中的段信息(segment):

上圖中的紅色矩形框中,第二個段的地址為什么是0x080e_9f5c?

這篇文章主要根據書中的解釋,來具體的分析這個值的來龍去脈。

ELF 文件格式

在Linux系統中,有4種類型的文件都是ELF格式,包括:目標文件,可執行文件,動態鏈接庫文件、核心轉儲文件。

如果想系統掌握Linux系統中的底層知識,研究ELF的格式是避免不了的事情。

這里就不再贅述了,只要記住2點:

從編譯器的角度看,ELF 文件是由很多的節(Section)組成的;

從程序加載器的角度看,ELF 文件是又很多的段(Section)組成的;

其實它倆沒有本質區別,只不過是鏈接器在鏈接階段,把不同目標文件中相同的section組織在一起,形成一個 segment。

對于剛才編譯出的test可執行文件,其加載視圖如下:

可以看到該文件一共有5個段(segment),前2個需要LOAD到內存的段,它們屬性分別是:讀、執行(R E) 和 讀、寫(RW),它們分別是代碼段和數據段。

綠色的箭頭反映出:代碼段中包含了很多的 section;黃色的箭頭反映出數據段也包含了很多的 section。

地址轉換和內存映射

從地址轉換的角度來看:

Linux 系統中CPU中使用的都是虛擬地址,該虛擬地址在尋址的時候,需要經過MMU地址轉換,得到實際的物理地址,然后才能在物理內存中讀取指令,或者讀取、寫入數據。

在現代操作系統中,MMU地址轉換單元基本上都是通過頁表來進行地址轉換的:

當然了,有些系統是兩級轉換(頁目錄、頁表),有些系統是三級或者四級頁表。

從內存映射的角度來看:

操作系統在把一個可執行程序加載到系統中時,把ELF文件中每個段的內容讀取到物理內存中,然后把這個物理內存映射到該段對應的虛擬地址上(VirtAddr)。

假設一個可執行程序中的代碼段長度是1.2K字節, 數據段長度是1.3K字節。

操作系統在把它倆讀取到內存中時,需要 2 個物理內存頁來分別存儲它們(每 1 個物理頁的長度是4K):

雖然每一個物理內存頁的大小是 4K,但是代碼段和數據段實際上只使用了每個頁面剛開始的一段空間。

當CPU中需要讀取物理內存上代碼段中的指令時,使用的虛擬地址是 0x0000_1000 ~ 0x0000_1000 +1.2K這個區間的地址,MMU單元經過頁表轉換之后,就會得到這個存放著代碼段的物理頁的物理地址。

數據段的尋址方式也是如此:當CPU中需要讀寫物理內存上數據段中的數據時,使用的虛擬地址是 0x0000_2000 ~ 0x0000_2000 + 1.3K這個區間的地址。

MMU單元經過頁表轉換之后,就會得到存放著數據段的物理頁的物理地址。

可以看出在這樣的安排下,每一個段的虛擬地址,都是按照4K(0x1000)對齊的。

如果操作系統都是這樣簡單映射的話,那么事情就簡單多了。

如果按照這樣的安排,來分析一下文章開頭的 test 可執行程序中的虛擬地址安排:

代碼段安排的開始虛擬地址是 0x0804_8000,這是 4K 對齊的;

代碼段的結束虛擬地址就應該是 0x0804_8000 + 0xa0725 = 0x080e_8725;

那么數據段的開始地址就可以安排在 0x080e_8725 之后的下一個 4K 對齊的邊界地址,即:0x080e_9000。

但是這樣的地址安排,嚴重浪費了物理內存空間!

1.2K 字節的代碼段加上1.3K字節的數據段,本來只需要1個物理頁就夠了(4KB),但是這里卻消耗掉2個物理頁(8KB)。

為了減少物理內存的浪費,Linux操作系統就采用了一些巧妙的辦法來減少物理內存的浪費,那就是:把文件中接壤部分的代碼段和數據段,讀取到同一個物理內存頁中,然后在虛擬地址空間中映射兩次,詳述如下。

Linux 中的內存重復映射

先來看一下test文件的結構:

代碼段在文件中的開始位置是:0x00000,長度是0xa0725。

數據段的開始位置是:0xa0f5c,長度是0x1024。

可以看到它倆之間有一個空白區間,長度是: 0xa0f5c - 0xa0725 = 0x837(十進制:2103字節)。

由于操作系統在把test文件讀取到物理內存的時候,從文件開始代碼段的0x00000地址開始讀取,按照4KB為一個單位存放到一個物理頁中。

文件中代碼段的 0x00000 ~ 0x00FFF 讀取到一個物理頁中;

文件中代碼段的 0x01000 ~ 0x01FFF 讀取到物理頁中;

下面的內容都是如此分割、復制;

也就是說:相當于把test文件從開始位置,按照4KB為一個單位進行"切割",然后復制到不同的物理內存頁中,如下所示:

注意:這些物理頁的地址很可能是不連續的。

這里有意思的是:代碼段與數據段接壤的這個4KB的空間,它的開始地址是0xA0000,結束地址是0xA0FFF,被復制到物理內存中最上面的橙色物理頁中。

再來看一下代碼段的虛擬地址:在執行gcc指令的的時候,鏈接器把代碼段的虛擬地址安排在0x0804_8000處:

也就是說:當CPU中(或者說程序代碼中),使用0x0804_8000 ~ 0x0804_7FFF 這個區間的地址時,經過地址映射,就會找到物理內存中淺綠色的物理頁,而這個物理頁也對應著test可執行文件開始的第一個4KB的空間。

而且,從虛擬地址的角度看,它的地址都是連續的,對應著test文件中連續的內容,這也是虛擬地址映射的本質。

把代碼段的開始位置安排在 0x0804_8000 地址,這是 Linux 操作系統確定的。

那么考慮一下:代碼段的最后一部分指令相應的4K頁面,其對應的開始虛擬地址是多少呢?

上圖中已經標記出來了,就是虛擬地址中橙色部分:0x080e_8000,計算如下:

通過代碼段的開始地址0x0804_8000,再加上代碼段在內存中的長度0xa0725,結果就是 0x080e_8725。

按照4K (0x1000)對齊之后,最后一個虛擬頁就應該是0x080e_8000。

也就是說:虛擬地址中0x080e_8000 ~ 0x080e_8724 這個區間就對應著test文件中代碼段的最后一部分指令(0x725個字節)。

此外,上圖中最右側:test文件結構中的2個紅色地址:0xA0000, 0xA1000,是如何計算得到的?

代碼段的長度是 0xA0725,按照4K為一個單位來進行分割,也就是把0xA0725對0x1000進行整除,就得到這個4KB的開始地址0xA0000。

同理,下一個4KB的開始地址就是0xA1000。

把文件中這部分4K的數據(包括:一部分代碼段內容 + 0x837 字節空洞 + 一部分數據段內容),復制到上圖中物理內存中最上面的橙色物理頁中。

又因為虛擬地址空間中,0x080E_8000開始的這個4KB空間映射到這個物理頁中,所以:在這個虛擬地址空間中,也有一個0x837字節的空洞,如下所示:

空洞的下方,是代碼段的指令;空洞的上方,是數據段的數據。

現在,這個物理頁中即存放了代碼,又存放了數據。

那么CPU中在查找部分的代碼和數據的時候,必須都能夠找得到才行!

對于代碼段比較好理解:從這個物理頁開始的前0x725個字節是有效的,從虛擬地址的角度看,就是從0x080e_8000開始的前0x725個字節是有效的。

因此,對于這部分代碼的尋址,使用的虛擬地址處于0x080e_8000 ~ 0x080e_8724這個區間中。

那么數據段呢?

重點來了:Linux系統把虛擬地址空間 0x080e_9000 ~ 0x080e_9FFF 也映射到圖中物理內存中最上面的橙色物理頁上!

如下所示:

因為物理頁中,是從0x837個字節空洞的上面開始,才是真正的數據段內容,那么相應的: 虛擬地址0x080e_9000 ~ 0x080e_9FFF空間中,0x837字節上面的內容才是數據段內容。

那么在虛擬地址空間中,這個數據段的開始地址應該是多少呢?

只要計算出0x837字節空洞的上方,距離這個4K頁面開始地址的偏移量就可以了,然后再加上這個4K頁面的起始地址 0x080E_9000,就得到了數據段的開始地址(虛擬地址)。

因為虛擬地址、物理地址、test文件中,都是按照4K的單位進行劃分的,因此這個偏移量就等于:test文件中數據段的開始地址(0xA0F5C) 距離 這個頁面的開始地址(0xA0000) 的偏移量。

0xA0F5C - 0xA0000 = 0xF5C 。

即:從這個4K頁面的開始地址,偏移量為0xF5C的地方,才是數據段內容的開始。

因此對于虛擬地址來說,從0x080e_9000地址開始,偏移量為0xF5C之后的內容才是數據段的內容,這個地址值就是:0x080e_9000 + 0xF5C = 0x080e_9F5C,如下所示:

這個地址正是readelf工具讀所顯示的:數據段加載到虛擬地址空間中的開始地址,如下所示:

至此,就解釋了文章開頭提出的問題!

再來看一下整個數據段的內容:在內存中數據段占據的空間是 0x01e48(readelf 工具讀取到的 MemSiz),那么數據段的結束地址就是(虛擬地址):

0x080e_9F5C + 0x01e48 = 0x080e_bda4

如下所示:

小結

Linux系統中的這個操作:對屬于不同段的內容進行重復映射,有點類似于共享內存的味道了。

只不過這里重復映射之后,每個段的虛擬地址還是需要修正為該段的合法地址。

經過這樣的操作之后,在虛擬地址中每一個段的界限是涇渭分明的,但是映射到的物理內存頁,則有可能是同一個。


責任編輯:武曉燕 來源: IOT物聯網小鎮
相關推薦

2021-08-11 07:55:10

Go內置函數

2024-04-15 00:00:00

首屏優化元素

2015-06-25 10:57:15

推薦系統老婆算出來

2022-07-14 08:22:48

Computedvue3

2017-07-25 18:36:00

機器學習WOT票房

2009-11-06 13:54:09

Visual Stud

2009-09-10 16:22:48

LINQ建立數據報表

2020-10-10 06:22:58

虛擬地址物理

2021-03-01 10:38:13

深度學習編程人工智能

2023-11-08 08:09:36

幾何算法解析幾何

2023-05-08 00:01:29

數據分析指標標簽

2024-12-26 11:49:14

2018-12-12 11:11:20

系統可靠性可用性

2022-05-18 13:46:37

進程TLB虛擬地址

2010-02-26 13:43:36

Linux gcc

2020-03-16 10:42:23

大數據IT工具

2016-11-18 09:37:07

EC2,云計算故障賠償

2025-07-01 01:55:00

Redis集群模式

2012-04-25 22:58:36

2010-01-15 10:16:50

CentOS rpm安
點贊
收藏

51CTO技術棧公眾號

亚洲精品一区二区三区四区高清| 中文字幕在线不卡视频| 久久青草福利网站| 国产又黄又粗又猛又爽的视频| aaa在线播放视频| 久久人人97超碰com| 国产精品丝袜视频| 国产亚洲精品久久久久久无几年桃| 久久动漫网址| 91成人国产精品| 台湾成人av| 国产男男gay体育生白袜| 影音国产精品| 中文字幕精品www乱入免费视频| 亚洲日本黄色片| 天天综合av| 亚洲综合色视频| 亚洲电影免费| 香蕉视频黄色片| 九九久久精品视频| 国产+成+人+亚洲欧洲| 蜜桃av免费在线观看| 精品欧美午夜寂寞影院| 欧美丰满少妇xxxxx高潮对白| 777精品久无码人妻蜜桃| 日韩av片在线看| 黄色在线小视频| 国产成a人亚洲精| 国产精品一区二区久久久久| 国产手机在线视频| 亚洲中无吗在线| 亚洲视频在线看| 亚洲熟女一区二区| 精品中文字幕一区二区三区| 精品视频一区 二区 三区| 欧美变态另类刺激| 日本h片在线观看| 中文字幕亚洲在| 秋霞久久久久久一区二区| 欧美熟妇交换久久久久久分类 | 成人av午夜电影| 国产日韩一区在线| 午夜一级黄色片| 国产精品夜夜夜| 国内精品免费午夜毛片| 欧美激情国产精品免费| 久久久人成影片免费观看| 亚洲性生活视频在线观看| www.超碰97| 91夜夜蜜桃臀一区二区三区| 日韩亚洲欧美一区二区三区| 亚洲天堂网站在线| 豆花视频一区| 欧美一区二区三区免费大片| 色网站在线视频| 国产精品日韩精品在线播放| 91精品国产综合久久久久久久| 中文字幕国产传媒| 欧美黄页在线免费观看| 欧美日韩卡一卡二| 182午夜在线观看| 亚洲a成人v| 91精品久久久久久久91蜜桃| 日本少妇xxx| 2023国产精华国产精品| 欧美成人猛片aaaaaaa| 中国特级黄色片| 国产一级成人av| 日韩国产欧美区| 三上悠亚影音先锋| 日韩在线观看一区| 成人97在线观看视频| 久久久精品一区二区涩爱| 亚洲国产mv| 欧美一级高清免费播放| 波多野结衣高清在线| 蜜桃久久av| 国产精品自在线| 亚洲最大成人av| 日本成人中文字幕在线视频| 国产精品视频久| 国产伦精品一区二区三区四区 | 国产在线不卡| 2018日韩中文字幕| 亚洲精品久久久久久久蜜桃| 九色综合国产一区二区三区| 99精品国产一区二区| 色屁屁草草影院ccyycom| 久久蜜臀精品av| 亚洲国产精品久久久久婷婷老年| 50度灰在线| 天天影视涩香欲综合网| 日本精品久久久久中文字幕| 成人做爰视频www| 欧美一区二区三区四区久久| 亚洲天堂美女视频| 日本a级不卡| 欧美激情视频网| 久久久久久无码午夜精品直播| 日本中文字幕一区二区有限公司| 成人两性免费视频| 手机av免费在线观看| 国产精品免费看片| 国产精品网站免费| 伦一区二区三区中文字幕v亚洲| 日韩精品在线网站| 欧美另类z0zx974| 国产真实久久| 国产欧洲精品视频| 五月天丁香视频| 亚洲日本在线视频观看| 日韩av一二三四区| 日韩区一区二| 在线电影中文日韩| 久久高清免费视频| 紧缚奴在线一区二区三区| 九色91国产| 91在线中字| 精品视频1区2区3区| 完美搭档在线观看| 偷偷www综合久久久久久久| 欧美专区日韩视频| 国内爆初菊对白视频| 国产精品进线69影院| 超碰成人免费在线| 久久久国产精品入口麻豆| 国产亚洲一级高清| 国产成人精品网| 成人激情视频网站| 特级西西444| 外国电影一区二区| 亚洲丝袜一区在线| 久久久久久91亚洲精品中文字幕| 国产福利视频一区二区三区| 曰韩不卡视频| 国产成人a视频高清在线观看| 亚洲欧美精品在线| 国产无遮挡呻吟娇喘视频| 成年人网站91| 欧洲精品在线播放| 成人爽a毛片免费啪啪红桃视频| 久久天天躁日日躁| 国产一区二区视频免费观看| 欧美高清一级片在线观看| 久久精品午夜福利| 欧美**字幕| 国产99久久久欧美黑人| 九色国产在线观看| 色婷婷综合久久久中文字幕| 深爱五月激情网| 久久久久久一区二区| 鲁丝一区二区三区免费| 久草在线资源福利站| 日韩经典中文字幕| 一本一道无码中文字幕精品热| 97精品国产露脸对白| 色综合久久久久无码专区| 欧美尿孔扩张虐视频| 欧美亚洲一级片| 免费在线高清av| 欧美在线观看你懂的| 国产三级在线观看完整版| 奇米影视一区二区三区| 伊人久久大香线蕉精品| 国产精品一区三区在线观看| 免费不卡欧美自拍视频| 成人午夜福利视频| 红桃av永久久久| 天堂久久精品忘忧草| 另类综合日韩欧美亚洲| 狠狠干视频网站| www男人天堂| 日本少妇一区| 综合电影一区二区三区| 4k岛国日韩精品**专区| 人妻中文字幕一区| 欧美性生交xxxxx久久久| 国产一区二区三区四区五区六区| 日韩福利视频网| 中文字幕欧美日韩一区二区三区| 精品视频在线观看网站| 91精品国产高清久久久久久| 国产永久免费高清在线观看 | 久久久青草青青国产亚洲免观| 天天爽天天爽夜夜爽| 久久久久免费av| 精品乱色一区二区中文字幕| a成人v在线| 久久99精品久久久久久噜噜| 三级无遮挡在线观看| 欧美日精品一区视频| 国产一级aa大片毛片| 久久日一线二线三线suv| 国产成年人视频网站| 一区二区日本视频| 伊人婷婷久久| 精品网站aaa| 国产一区二中文字幕在线看| av在线资源| 久久精品在线播放| 免费黄色在线视频网站| 欧美一级高清大全免费观看| 欧美黄色一级大片| 亚洲综合一二区| 亚洲午夜精品久久久久久高潮| 国产成人精品免费| jizz欧美性11| 亚洲欧美日韩综合国产aⅴ| 午夜久久久久久久久久久| 日韩大胆成人| 懂色一区二区三区av片| 99久久婷婷国产综合精品首页 | 国产无遮挡又黄又爽在线观看| 欧美激情一区二区三区四区| 亚洲色图欧美日韩| 国模大尺度一区二区三区| 老司机午夜av| 一本色道久久综合| 国产1区2区3区中文字幕| 成人激情视频| 日韩av高清| 思热99re视热频这里只精品| 成人国产一区二区| 国产精品视频首页| 国产伊人精品在线| 亚洲欧美在线成人| 日本亚洲欧洲色α| 欧美私密网站| 国产69精品久久久久99| av在线app| 久久精视频免费在线久久完整在线看| 国产在线91| 亚洲一区二区久久久| 男女网站在线观看| 精品亚洲一区二区三区四区五区| 国产 日韩 欧美 综合| 777久久久精品| 国产精品国产一区二区三区四区 | 韩国av在线免费观看| 日韩免费性生活视频播放| 国产同性人妖ts口直男| 欧美久久一二三四区| 亚洲综合精品国产一区二区三区 | 一区二区三区中文字幕在线观看| 女性裸体视频网站| 亚洲欧美在线高清| 日本黄色片免费观看| 亚洲欧美在线视频| 欧美在线视频第一页| 亚洲综合在线五月| 国产无遮挡又黄又爽在线观看| 亚洲成人av电影| 国产成人无码精品久在线观看 | 久久人人爽人人爽人人片av免费| 日韩欧美综合在线视频| 丁香社区五月天| 欧美在线不卡视频| 在线观看国产精品视频| 欧美日韩三级视频| 国产视频一二三四区| 日韩欧美国产不卡| 日本人妻熟妇久久久久久| 日韩av网站在线| 九色视频在线观看免费播放 | 美女尤物在线视频| 久久久久久久久电影| 第一福利在线视频| 国产成人精品综合久久久| 中文字幕一区二区三区精品| 免费xxxx性欧美18vr| 久久国产激情视频| 国产精品18久久久久久久久久久久| 黄色一级片免费播放| 成人黄色网址在线观看| 久久丫精品国产亚洲av不卡 | 无码黑人精品一区二区| 一区二区三区成人| 欧美福利视频一区二区| 欧美主播一区二区三区| 91一区二区视频| 精品国产乱码久久久久久蜜臀| 天天操天天干天天爱| 国产一区二区动漫| 色老头在线观看| 57pao精品| 久久亚洲人体| 国产精品污www一区二区三区| 欧美极品中文字幕| 欧美精品一区二区性色a+v| 日韩午夜在线电影| 欧美成人三级在线播放| 成人视屏免费看| 日韩不卡av在线| 一级女性全黄久久生活片免费| 日韩久久中文字幕| 91精品国产福利在线观看 | 99国产精品久久久久久久久久| 久久精品视频18| 亚洲在线免费播放| 亚洲天堂五月天| 精品蜜桃在线看| 超碰免费在线| 国外成人免费在线播放| 日日夜夜综合| 蜜桃视频在线观看91| 欧美成人亚洲| 91制片厂毛片| 91香蕉视频在线| 久热这里只有精品在线| 欧美日韩国产免费| 日韩一二三四| 欧美激情综合亚洲一二区 | 欧美美女bb生活片| 男女污污视频在线观看| 久久久久久国产精品美女| 欧美成人家庭影院| 免费日韩电影在线观看| 影音先锋久久| 在线成人精品视频| 中文字幕一区二区三区不卡| 人人草在线观看| 亚洲精品国产欧美| 欧美xxxx免费虐| 92裸体在线视频网站| 日韩精品欧美| 99视频精品免费| 91影院在线免费观看| 国产福利久久久| 日韩精品中午字幕| av免费看在线| 91人人爽人人爽人人精88v| 成人激情免费视频| 一级在线免费视频| 国产无一区二区| 人妻 日韩精品 中文字幕| 亚洲国产成人精品女人久久久 | 极品白浆推特女神在线观看 | 99久久精品国产亚洲| 亚洲激情久久久| a'aaa级片在线观看| av电影成人| 亚洲天堂男人| 天天躁日日躁狠狠躁av麻豆男男| 一区二区三区加勒比av| 亚洲va久久久噜噜噜无码久久| 成年人精品视频| 日本精品在线观看| 国产午夜精品视频一区二区三区| 韩国三级中文字幕hd久久精品| 久久精品在线观看视频| 欧美日高清视频| 黄色片网站在线| 91成人免费视频| 亚洲承认在线| 在线免费观看污视频| 欧美日韩精品在线观看| 免费在线超碰| 国产精品视频在线观看| 天天综合亚洲| 91精品国产高清91久久久久久 | fc2成人免费人成在线观看播放| 福利一区二区三区四区| 日韩精品中文字幕久久臀| 日韩伦理三区| 亚洲在线播放电影| 国产一区二区伦理片| 久久高清无码视频| 日韩精品视频在线观看网址| 巨茎人妖videos另类| 亚洲高清资源综合久久精品| 精品系列免费在线观看| 国产在线观看你懂的| 亚洲女成人图区| 欧美激情三区| 蜜臀精品一区二区| 久久青草欧美一区二区三区| 在线免费av网| 欧美激情在线一区| 国内精品久久久久久久影视简单| 午夜免费福利视频在线观看| 亚洲精品国产无套在线观| 人妻视频一区二区三区| 欧美成人免费在线视频| 日韩av毛片在线观看| 欧洲grand老妇人| 久久久噜噜噜久噜久久| 91精品国产自产精品男人的天堂| 亚洲精品蜜桃久久久久久| 久久综合给合久久狠狠狠97色69| 中文av免费观看| 欧美韩国理论所午夜片917电影| 视频小说一区二区| 无需播放器的av| 亚洲一区欧美一区| 国产69久久| 国产精品 日韩| 蜜臀av一区二区三区| 国产香蕉在线视频| 国产亚洲精品久久久优势| 一区二区三区四区高清视频|