国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

剖析內存中的程序之秘,快來看吧!

系統 Linux
內存管理是操作系統的核心任務;它對程序員和系統管理員來說也是至關重要的。在接下來的幾篇文章中,我將從實踐出發著眼于內存管理,并深入到它的內部結構。雖然這些概念很通用,但示例大都來自于 32 位 x86 架構的 Linux 和 Windows 上。這第一篇文章描述了在內存中程序如何分布。

[[217652]]

內存管理是操作系統的核心任務;它對程序員和系統管理員來說也是至關重要的。在接下來的幾篇文章中,我將從實踐出發著眼于內存管理,并深入到它的內部結構。雖然這些概念很通用,但示例大都來自于 32 位 x86 架構的 Linux 和 Windows 上。這第一篇文章描述了在內存中程序如何分布。

在一個多任務操作系統中的每個進程都運行在它自己的內存“沙箱”中。這個沙箱是一個虛擬地址空間virtual address space,在 32 位的模式中它總共有 4GB 的內存地址塊。這些虛擬地址是通過內核頁表page table映射到物理地址的,并且這些虛擬地址是由操作系統內核來維護,進而被進程所消費的。每個進程都有它自己的一組頁表,但是這里有點玄機。一旦虛擬地址被啟用,這些虛擬地址將被應用到這臺電腦上的 所有軟件包括內核本身。因此,一部分虛擬地址空間必須保留給內核使用:

Kernel/User Memory Split

Kernel/User Memory Split

但是,這并不是說內核就使用了很多的物理內存,恰恰相反,它只使用了很少一部分可用的地址空間映射到其所需要的物理內存。內核空間在內核頁表中被標記為獨占使用于 特權代碼 (ring 2 或更低),因此,如果一個用戶模式的程序嘗試去訪問它,將觸發一個頁面故障錯誤。在 Linux 中,內核空間是始終存在的,并且在所有進程中都映射相同的物理內存。內核代碼和數據總是可尋址的,準備隨時去處理中斷或者系統調用。相比之下,用戶模式中的地址空間,在每次進程切換時都會發生變化:

Process Switch Effects on Virtual Memory

Process Switch Effects on Virtual Memory

藍色的區域代表映射到物理地址的虛擬地址空間,白色的區域是尚未映射的部分。在上面的示例中,眾所周知的內存“饕餮” Firefox 使用了大量的虛擬內存空間。在地址空間中不同的條帶對應了不同的內存段,像heapstack等等。請注意,這些段只是一系列內存地址的簡化表示,它與 Intel 類型的段 并沒有任何關系 。不過,這是一個在 Linux 進程的標準段布局:

Flexible Process Address Space Layout In Linux

Flexible Process Address Space Layout In Linux

當計算機還是快樂、安全的時代時,在機器中的幾乎每個進程上,那些段的起始虛擬地址都是完全相同的。這將使遠程挖掘安全漏洞變得容易。漏洞利用經常需要去引用絕對內存位置:比如在棧中的一個地址,一個庫函數的地址,等等。遠程攻擊可以閉著眼睛選擇這個地址,因為地址空間都是相同的。當攻擊者們這樣做的時候,人們就會受到傷害。因此,地址空間隨機化開始流行起來。Linux 會通過在其起始地址上增加偏移量來隨機化內存映射段、以及。不幸的是,32 位的地址空間是非常擁擠的,為地址空間隨機化留下的空間不多,因此 妨礙了地址空間隨機化的效果

在進程地址空間中最高的段是棧,在大多數編程語言中它存儲本地變量和函數參數。調用一個方法或者函數將推送一個新的棧幀stack frame到這個棧。當函數返回時這個棧幀被刪除。這個簡單的設計,可能是因為數據嚴格遵循 后進先出(LIFO) 的次序,這意味著跟蹤棧內容時不需要復雜的數據結構 —— 一個指向棧頂的簡單指針就可以做到。推入和彈出也因此而非常快且準確。也可能是,持續的棧區重用往往會在 CPU 緩存 中保持活躍的棧內存,這樣可以加快訪問速度。進程中的每個線程都有它自己的棧。

向棧中推送更多的而不是剛合適的數據可能會耗盡棧的映射區域。這將觸發一個頁面故障,在 Linux 中它是通過 expand_stack() 來處理的,它會去調用 acct_stack_growth() 來檢查棧的增長是否正常。如果棧的大小低于 RLIMIT_STACK 的值(一般是 8MB 大小),那么這是一個正常的棧增長和程序的合理使用,否則可能是發生了未知問題。這是一個棧大小按需調節的常見機制。但是,棧的大小達到了上述限制,將會發生一個棧溢出,并且,程序將會收到一個段故障Segmentation Fault錯誤。當映射的棧區為滿足需要而擴展后,在棧縮小時,映射區域并不會收縮。就像美國聯邦政府的預算一樣,它只會擴張。

動態棧增長是 唯一例外的情況 ,當它去訪問一個未映射的內存區域,如上圖中白色部分,是允許的。除此之外的任何其它訪問未映射的內存區域將觸發一個頁面故障,導致段故障。一些映射區域是只讀的,因此,嘗試去寫入到這些區域也將觸發一個段故障。

在棧的下面,有內存映射段。在這里,內核將文件內容直接映射到內存。任何應用程序都可以通過 Linux 的 mmap() 系統調用( 代碼實現)或者 Windows 的 CreateFileMapping() / MapViewOfFile() 來請求一個映射。內存映射是實現文件 I/O 的方便高效的方式。因此,它經常被用于加載動態庫。有時候,也被用于去創建一個并不匹配任何文件的匿名內存映射,這種映射經常被用做程序數據的替代。在 Linux 中,如果你通過 malloc() 去請求一個大的內存塊,C 庫將會創建這樣一個匿名映射而不是使用堆內存。這里所謂的“大”表示是超過了MMAP_THRESHOLD 設置的字節數,它的缺省值是 128 kB,可以通過 mallopt() 去調整這個設置值。

接下來講的是“堆”,就在我們接下來的地址空間中,堆提供運行時內存分配,像棧一樣,但又不同于棧的是,它分配的數據生存期要長于分配它的函數。大多數編程語言都為程序提供了堆管理支持。因此,滿足內存需要是編程語言運行時和內核共同來做的事情。在 C 中,堆分配的接口是 malloc() 一族,然而在支持垃圾回收的編程語言中,像 C#,這個接口使用 new 關鍵字。

如果在堆中有足夠的空間可以滿足內存請求,它可以由編程語言運行時來處理內存分配請求,而無需內核參與。否則將通過 brk() 系統調用(代碼實現)來擴大堆以滿足內存請求所需的大小。堆管理是比較 復雜的,在面對我們程序的混亂分配模式時,它通過復雜的算法,努力在速度和內存使用效率之間取得一種平衡。服務一個堆請求所需要的時間可能是非常可觀的。實時系統有一個 特定用途的分配器 去處理這個問題。堆也會出現  碎片化 ,如下圖所示:

Fragmented Heap

Fragmented Heap

最后,我們抵達了內存的低位段:BSS、數據、以及程序文本。在 C 中,靜態(全局)變量的內容都保存在 BSS 和數據中。它們之間的不同之處在于,BSS 保存 未初始化的  靜態變量的內容,它的值在源代碼中并沒有被程序員設置。BSS 內存區域是 匿名 的:它沒有映射到任何文件上。如果你在程序中寫這樣的語句 static int cntActiveUserscntActiveUsers 的內容就保存在 BSS 中。

反過來,數據段,用于保存在源代碼中靜態變量 初始化后 的內容。這個內存區域是 非匿名 的。它映射了程序的二進值鏡像上的一部分,包含了在源代碼中給定初始化值的靜態變量內容。因此,如果你在程序中寫這樣的語句 static int cntWorkerBees = 10,那么,cntWorkerBees 的內容就保存在數據段中,并且初始值為 10。盡管可以通過數據段映射到一個文件,但是這是一個私有內存映射,意味著,如果改變內存,它并不會將這種變化反映到底層的文件上。必須是這樣的,否則,分配的全局變量將會改變你磁盤上的二進制文件鏡像,這種做法就太不可思議了!

用圖去展示一個數據段是很困難的,因為它使用一個指針。在那種情況下,指針 gonzo內容(一個 4 字節的內存地址)保存在數據段上。然而,它并沒有指向一個真實的字符串。而這個字符串存在于文本段中,文本段是只讀的,它用于保存你的代碼中的類似于字符串常量這樣的內容。文本段也會在內存中映射你的二進制文件,但是,如果你的程序寫入到這個區域,將會觸發一個段故障錯誤。盡管在 C 中,它比不上從一開始就避免這種指針錯誤那么有效,但是,這種機制也有助于避免指針錯誤。這里有一個展示這些段和示例變量的圖:

ELF Binary Image Mapped Into Memory

ELF Binary Image Mapped Into Memory

你可以通過讀取 /proc/pid_of_process/maps 文件來檢查 Linux 進程中的內存區域。請記住,一個段可以包含很多的區域。例如,每個內存映射的文件一般都在 mmap 段中的它自己的區域中,而動態庫有類似于 BSS 和數據一樣的額外的區域。下一篇文章中我們將詳細說明“區域area”的真正含義是什么。此外,有時候人們所說的“數據段data segment”是指“數據data + BSS + 堆”。

你可以使用 nm 和 objdump 命令去檢查二進制鏡像,去顯示它們的符號、地址、段等等。最終,在 Linux 中上面描述的虛擬地址布局是一個“彈性的”布局,這就是這幾年來的缺省情況。它假設 RLIMIT_STACK 有一個值。如果沒有值的話,Linux 將恢復到如下所示的“經典” 布局:

Classic Process Address Space Layout In Linux

Classic Process Address Space Layout In Linux

這就是虛擬地址空間布局。接下來的文章將討論內核如何對這些內存區域保持跟蹤、內存映射、文件如何讀取和寫入、以及內存使用數據的意義。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2018-03-12 10:35:01

LinuxBash快捷鍵

2017-11-24 08:00:55

前端JSCSS

2021-04-19 09:23:26

數字化

2025-01-13 00:00:05

2025-01-13 07:10:00

前端開發

2020-06-08 15:06:33

Pandas可視化數據

2020-11-04 08:40:23

C++多元組Tuple

2022-01-21 08:21:02

Web 安全前端程序員

2022-04-29 07:47:54

操作系統Windows 10任務管理器

2024-06-03 00:00:06

高性能數據傳輸應用程序

2011-06-10 11:05:05

Qt Quick QML

2018-01-30 17:54:37

數據庫MySQLSQL Server

2010-08-06 09:10:47

2018-05-02 15:41:27

JavaScript人臉檢測圖像識別

2018-03-06 09:54:48

數據庫備份恢復

2020-09-23 06:00:04

ShellLinux郵件監控

2018-04-02 10:54:31

Linux應用程序

2022-07-28 08:00:00

Buddy算法內存系統

2020-08-04 07:02:00

TCPIP算法

2021-01-19 05:29:41

代碼Git 工作流
點贊
收藏

51CTO技術棧公眾號

欧美男人的天堂| 国产精品日韩欧美综合| 亚洲精品视频导航| 99久久精品情趣| 在线观看成人免费| 欧洲视频一区二区| 国产探花视频在线观看| 一区二区日本视频| youjizz.com亚洲| 欧美视频免费一区二区三区| 欧美性xxxxxxx| 91蜜桃臀久久一区二区| 国产超碰91| 久久精品99国产精品酒店日本| 精品动漫3d一区二区三区免费| 性色av香蕉一区二区| 国产精品一区二区三区视频网站| 久久久三级国产网站| 黄色片网站在线观看| 国产精品污www一区二区三区| 一区二区在线免费播放| 制服丝袜av成人在线看| 国产欧美日韩在线观看| 日韩福利电影在线观看| 激情文学一区| 日本精品黄色| www.爱久久| 日韩黄色三级| 高清毛片在线观看| 三级av在线播放| 日本精品福利视频| 欧洲精品在线一区| 444亚洲人体| 雨宫琴音一区二区在线| 欧洲不卡av| jizz18女人| 黄色www在线观看| 欧美中文字幕在线| 56国语精品自产拍在线观看| 99re热视频这里只精品| 91成人免费| 国产一区在线电影| 免费黄色网址在线观看| 国产理论片免费观看| 成人午夜大片免费观看| 川上优的av在线一区二区| 欧美亚洲一级片| 亚洲三级在线看| 亚洲国产一区二区视频| 欧美r级电影在线观看| 欧美私模裸体表演在线观看| 美女看a上一区| 日韩va欧美va亚洲va久久| 免费看a级黄色片| 4444在线观看| 国内精品久久久久久久影视麻豆 | av电影免费在线观看| www日韩av| 欧美人狂配大交3d怪物一区 | 99久久自偷自偷国产精品不卡| 亚洲国产日韩一区| 亚洲精品菠萝久久久久久久| 热久久天天拍国产| 欧美女优在线观看| 免费观看成人性生生活片| 国产女女做受ⅹxx高潮| 91免费国产视频| 欧美成人video| www精品美女久久久tv| 久久精品亚洲国产| 久久丝袜美腿综合| 国产精品欧美日韩一区| 精品电影在线| 免费观看亚洲视频| dy888午夜| 91日韩在线播放| 国产午夜精品免费一区二区三区| 亚洲人成在线播放网站岛国| 99久久这里只有精品| 电影k8一区二区三区久久| 日本午夜视频| 中文字幕av日韩精品| 91sa在线看| 欧美日韩在线亚洲一区蜜芽| 亚洲永久字幕| 国产乱码精品一区二区三区忘忧草 | 国产一区二区三区免费看| 日本三级久久| 免费久久一级欧美特大黄| 亚洲精品一区av在线播放| 欧美日韩裸体免费视频| 制服丝袜在线91| 91精品视频网| 欧美视频中文字幕| 亚洲第一主播视频| 97人人爽人人澡人人精品| 污视频网站在线免费| 黄色电影免费在线看| 国产毛片久久久| 影音先锋欧美资源| 免费看成人午夜电影| 国产精品偷伦一区二区| 久久网福利资源网站| 在线影视一区二区三区| 色琪琪综合男人的天堂aⅴ视频| 成年无码av片在线| 久久精品123| 精品亚洲精品福利线在观看| 欧美在线影院一区二区| 欧美中文字幕一区二区三区| 国产精品欧美极品| 欧美午夜一区二区| 国产精品乱码妇女bbbb| 久久精品亚洲国产奇米99| 国产日韩亚洲欧美综合| 一本色道亚洲精品aⅴ| 午夜精品久久99蜜桃的功能介绍| 视频一区在线播放| 亚洲日本在线看| 精品国产123| 欧美中文字幕视频在线观看| 免费成人在线观看av| 国产免费视频| 日本中文字幕在线观看| 岛国av一区| 国产成人无遮挡在线视频| 欧美日韩国产区| 91精品婷婷国产综合久久竹菊| 欧美丰满高潮xxxx喷水动漫| 久久国产精品美女| 国产成年人在线观看| 日本一区二区在线| 亚洲欧洲精品一区| 欧美在线一区二区三区四区| 久久久久99精品成人片| 男人艹女人在线观看| 国产欧美黑人| 国产中文字幕一区二区三区 | 精品免费日韩av| 影音先锋国产精品| 中文字幕欧美区| 亚洲精品成人免费| 操日韩av在线电影| 国产综合福利在线| av视屏在线播放| 免费大片黄在线观看视频网站| 神马久久一区二区三区| 日本女优在线视频一区二区| 中文字幕在线观看不卡| 裸体一区二区| 91久久精品无嫩草影院| 日韩在线综合| 午夜激情视频在线| 亚洲人成777| 日本不卡中文字幕| 狠狠爱在线视频一区| 亚洲风情亚aⅴ在线发布| 国产成人精品在线观看| 亚洲欧美在线网| 114国产精品久久免费观看| 丝袜国产在线| 成人激情电影在线| 日本一区二区免费在线观看视频 | 欧美性感一类影片在线播放| 国产精品久久久亚洲| 888av在线| 97久久视频| 亚洲精品亚洲人成人网| 欧美一级免费看| 337p日本| 亚洲一区二区三区四区电影| 丝袜美腿亚洲一区| 中文字幕一区二区不卡| 国内成人精品一区| 97精品欧美一区二区三区| 伊人色综合影院| av中文在线资源| 青草国产精品久久久久久| 欧美日韩一二三区| 国产呦系列欧美呦日韩呦| 久久99久久| 亚洲日本国产| 亚洲激情视频网站| 免费在线观看一区二区| 国产欧美日韩另类视频免费观看| 日韩欧美国产精品| 国产精品宾馆在线精品酒店| 国内老司机av在线| 老司机一区二区| 亚洲最新av网址| 国产乱妇乱子| 国产成a人亚洲精品| 欧美国产日韩在线| 满满都是荷尔蒙韩剧在线观看| 99亚洲一区二区| 奇米4444一区二区三区 | 一区二区在线免费| 欧美极品xxxx| 成人在线播放视频| 激情av一区|