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

看了這篇文章還沒徹底搞懂Linux分頁機(jī)制?我自罰三杯!

系統(tǒng) Linux
當(dāng)操作系統(tǒng)需要分配一大塊、連續(xù)的內(nèi)存空間給用戶程序時,映射表中的表項(xiàng)可以指向多個不連續(xù)的物理頁,反正用戶程序接觸不到這一層(用戶程序只與虛擬內(nèi)存交互)。

[[426494]]

目錄

  • 分段存儲的壞處
  • 物理內(nèi)存的管理
  • 映射表
  • 一個線性地址的尋址過程

終于開始介紹分頁機(jī)制了,作為一名 Linuxer,大名鼎鼎的分頁機(jī)制必須要徹底搞懂!

我就盡自己的最大努力,正確把我理解的分頁機(jī)制,用圖文形式徹底分解,希望對您有所幫助!

一共分三篇文章:

  • 這篇文章主要介紹單映射表;
  • 下一篇介紹兩級映射(頁目錄和頁表);
  • 最后一篇介紹對映射表自身的操作。

分段存儲的壞處

在之前的文章中,我們多次描寫了一個段描述符的結(jié)構(gòu),其中就包括段的開始地址、界限和各種段的屬性。

經(jīng)過分段處理單元的權(quán)限檢查和計算,這個開始地址加上偏移量,就是一個線性地址,如下圖所示:

在 x86 系統(tǒng)中,分段機(jī)制是固有的,必須經(jīng)過這個環(huán)節(jié)才能得到一個線性地址。

所以 Linux 系統(tǒng)中,為了“不使用”分段機(jī)制,但是又無法繞過,只好定義了“平坦”的分段模型。

在沒有開啟分頁機(jī)制的情況下,分段單元輸出的線性地址就等于物理地址。

這里就存在著一個重要的問題:從段的開始地址,一直到段空間的最后地址,這是一塊連續(xù)的空間!

在這樣的情況下,每一個用戶程序中,包含的所有段,在物理內(nèi)存上所對應(yīng)的空間也必須是連續(xù)的,如下圖:

因?yàn)槊恳粋€程序的代碼、數(shù)據(jù)長度都是不確定、不一樣的,按照這樣的映射方式,物理內(nèi)存將會被分割成各種離散的、大小不同的塊。

經(jīng)過一段運(yùn)行時間之后,有些程序會退出,那么它們占據(jù)的物理內(nèi)存空間可以被回收,但是,這些物理內(nèi)存都是以很多碎片的形式存在。

如果這個時候操作系統(tǒng)想分配一塊稍微大一些的連續(xù)空間,雖然空閑的物理內(nèi)存空間總數(shù)是足夠的,但是不連續(xù)啊,這就給物理內(nèi)存帶來極大的浪費(fèi)!

怎么辦?

現(xiàn)在的需求是:操作系統(tǒng)提供給用戶的段空間必須是連續(xù)的,但是物理內(nèi)存最好不要連續(xù)。

軟件領(lǐng)域有一句經(jīng)典名言:沒有什么是不能通過增加一個抽象層解決的!

在內(nèi)存管理上,新加的這一層就是虛擬內(nèi)存:把物理內(nèi)存按照一個固定的單位(4 KB,稱作一個物理頁)進(jìn)行分割,然后把連續(xù)的虛擬內(nèi)存,映射到若干個不連續(xù)的物理內(nèi)存頁。

圖中綠色的的映射表,就是用來把虛擬內(nèi)存,映射到物理內(nèi)存。

物理內(nèi)存的管理

關(guān)于映射表的細(xì)節(jié),下一個主題再聊,先來看一下操作系統(tǒng)對物理內(nèi)存的狀態(tài)管理。

在如今的一臺 PC 機(jī)上,內(nèi)存動輒就是是 8G/16G/32G 的配置,好像很充裕、隨便用。

但是在 N 年以前,買一個 U 盤都是按照 MB 為單位的,更別說內(nèi)存了。

因此在那個時代,面對 MB 級別的物理內(nèi)存,操作系統(tǒng)還能夠把它虛擬成 4GB 的內(nèi)存空間給用戶程序使用,也是挺厲害的!

言歸正傳,在這篇文章中,我們就奢侈一點(diǎn),假設(shè)可用的物理內(nèi)存有 1GB 的空間。

當(dāng)系統(tǒng)上電之后,BIOS 會檢查系統(tǒng)的各種硬件資源,并告訴操作系統(tǒng),其中就包括這 1GB 的物理內(nèi)存。

按照一個物理頁的大小 4KB 進(jìn)行劃分,1 GB 的空間就是 262144 (1GB / 4K)個物理頁。

操作系統(tǒng)需要對這些頁進(jìn)行管理,也就是維護(hù)它們的狀態(tài):哪些頁正在被使用,哪些頁空閑。

最簡單、直觀的方法,就是用一塊連續(xù)的內(nèi)存空間來描述每一個物理頁的狀態(tài),每一個bit位對應(yīng)一個物理頁:

bit = 1: 表示該物理頁被使用;

bit = 0:表示該物理頁空閑;

262144 個頁需要262144個bit位,也就是32768個字節(jié)。

那么對于1 GB大小的物理內(nèi)存來說,如下圖所示:

利用map結(jié)構(gòu),操作系統(tǒng)就知道當(dāng)前: 哪些物理頁正在被使用,哪些物理頁是空閑的。

每一個物理頁是 4KB,所以地址中最后 12 個 bit 都是 0;

map 結(jié)構(gòu)本身也需要存儲在物理內(nèi)存中的,因此 32768 個字節(jié),一共需要 8 個物理頁來存儲(32768 / 4 * 1024 = 8)。

映射表

在32位系統(tǒng)中,虛擬內(nèi)存的最大空間是 4GB,這是每一個用戶程序都擁有的虛擬內(nèi)存空間。

實(shí)際上,操作系統(tǒng)都會把虛擬內(nèi)存的高地址部分,用作操作系統(tǒng),低地址部分留給用戶程序使用;

Linux 系統(tǒng)中,高地址的 1GB 空間是操作系統(tǒng)使用;Windows 系統(tǒng)中,高地址的 2GB 的空間被操作系統(tǒng)使用,但是可以調(diào)整;

但是,實(shí)際的物理內(nèi)存只有1GB(假設(shè)值),那么操作系統(tǒng)就要使用自己的騰挪大法,讓用戶程序認(rèn)為4GB的內(nèi)存空間全部可用。

就好比變戲法一樣:十個碗,九個蓋,誰能玩的溜、不露餡,誰就是高手!

計算一下映射表本身所占據(jù)的空間大小:

映射表中的每一個表項(xiàng),指向一個物理頁的開始地址。

在32位系統(tǒng)中,地址的長度是4個字節(jié),那么映射表中的每一個表項(xiàng)就是占用4個字節(jié)。

既然需要讓4GB的虛擬內(nèi)存全部可用,那么映射表中就需要能夠表示這所有的4GB空間,那么就一共需要1048576 (4GB / 4KB)個表項(xiàng)。

所以,映射表占據(jù)的總空間大小就是:1048576 * 4 = 4 MB 的大小。

也就是說,映射表自己本身,就要占用 1024 個物理頁(4MB / 4KB)。

正是因?yàn)槭褂靡粋€映射表,需要占用這么大的物理內(nèi)存空間,所以才有后面的多級分頁機(jī)制。

虛擬內(nèi)存看上去被虛線“分割”成4KB的單元,其實(shí)并不是分割,虛擬內(nèi)存仍然是連續(xù)的。

這個虛線的單元僅僅表示它與映射表中每一個表項(xiàng)的映射關(guān)系,并最終映射到相同大小的一個物理內(nèi)存頁上。

例如:

虛擬內(nèi)存的 0 ~ 4KB 空間,對應(yīng)映射表第 0 個表項(xiàng)中,其中存儲的物理地址是 0x3FFF_F000(最后一個物理頁);

虛擬內(nèi)存的 4KB ~ 8KB 空間,對應(yīng)映射表第 1 個表項(xiàng)中,其中存儲的物理地址是 0x0000_0000(第 0 個物理頁);

虛擬內(nèi)存的最后 4KB 空間,對應(yīng)映射表最后一個表項(xiàng)中,其中存儲的物理地址是 0x0000_1000(第 1 個物理頁);

也就是說:

虛擬內(nèi)存與映射表之間,是平行的一一對應(yīng)關(guān)系;

映射表中的物理地址,與物理內(nèi)存之間,是隨機(jī)的映射關(guān)系,哪里可用就指向哪里(物理頁)。

以上就是用一個映射表,把物理內(nèi)存以4KB為一個頁進(jìn)行分配,然后再與虛擬內(nèi)存對應(yīng)起來,包裝成連續(xù)的虛擬內(nèi)存給用戶使用。

雖然最終使用的物理內(nèi)存是離散的,但是與虛擬內(nèi)存對應(yīng)的線性地址是連續(xù)的。

處理器在訪問數(shù)據(jù)、獲取指令時,使用的都是線性地址,只要它是連續(xù)的就可以了,最終都能夠通過映射表找到實(shí)際的物理地址。

為了有一個更加感性的認(rèn)識,我們再來看一個稍微具象一點(diǎn)的實(shí)例。

一個線性地址的尋址過程

我們假設(shè)用戶程序中有一個代碼段,那么在這個程序的 LDT(局部描述符表)中,段描述的結(jié)構(gòu)如下:

假設(shè)條件如下:

虛擬內(nèi)存(32位系統(tǒng)):4GB,實(shí)際的物理內(nèi)存 1GB;

代碼段的開始地址位于 3 GB 的地方,也就是 0xC000_0000;

代碼段的長度是 1 MB;

我們的目標(biāo)是:查找線性地址0xC000_2020所對應(yīng)的物理地址。

根據(jù)描述符的結(jié)構(gòu),其中的段基地址是 0xC000_0000,界限是 0x00100,段描述符中,其它的字段暫時不用關(guān)心。

界限一共有 20 位,假設(shè)粒度是 4KB,那么 1 MB 的長度除以 4KB,結(jié)果就是 0x00100。

代碼段的開始地址(線性地址) 0xC000_0000,位于虛擬內(nèi)存靠近高端四分之一的位置,那么映射表中對應(yīng)的表項(xiàng),也是位于高端的四分之一的位置。

映射表中每一個表項(xiàng)指向一個4KB大小的物理頁,那么長度為1MB的代碼段,就需要256個表項(xiàng)。

也就是說映射表中有 256 個表項(xiàng),指向256個物理頁:

對于我們要查找的線性地址 0xC000_2020,首先把它拆解成兩部分:

高 20 位 0xC0002: 是映射表索引;

低 12 位 0x020: 是物理頁內(nèi)的偏移地址;

索引值 0xC002,對應(yīng)于下圖中從3GB開始的第2個表項(xiàng):

在上面這個示意圖中,代碼段的開始地址 0xC000_0000,對應(yīng)于映射表中索引為0xC0000這個表項(xiàng),這個表項(xiàng)中記錄的物理內(nèi)存頁開始地址是 0x1000_0000(距離開始地址 256 MB)。

代碼段的長度是 1 MB,一共需要256個表項(xiàng),那么最后這個表項(xiàng)的索引就應(yīng)該是 0xC00FF。

那么對于我們要尋找的線性地址 0xC000_2020,對應(yīng)的表項(xiàng)索引號是 0xC0002,這個表項(xiàng)中記錄的物理內(nèi)存頁的開始地址是 0x2000_0000(距離開始地址 512 MB)。

找到了物理內(nèi)存的起始地址,再加上偏移量 0x020,那么最終的物理地址就是:0x2000_0020。

以上就是通過映射表,從線性地址到物理地址的頁轉(zhuǎn)換過程。

對于使用二級頁表的轉(zhuǎn)換機(jī)制來說,原理都是一樣的。無非是把高20位的索引拆開(10 位 + 10 位),使用兩個表來轉(zhuǎn)換,這個問題下一篇文章會詳細(xì)聊。

End 

本文描述了:通過一個映射表,把連續(xù)的虛擬內(nèi)存,映射到離散的物理頁,極大的利用了物理內(nèi)存。

當(dāng)操作系統(tǒng)需要分配一大塊、連續(xù)的內(nèi)存空間給用戶程序時,映射表中的表項(xiàng)可以指向多個不連續(xù)的物理頁,反正用戶程序接觸不到這一層(用戶程序只與虛擬內(nèi)存交互)。

這樣利用物理內(nèi)存的效率就極大的提高了。

再加上換出和換入機(jī)制(把硬盤當(dāng)做物理內(nèi)存來用),讓用戶程序以為有用不完的物理內(nèi)存。

同時,我們也討論了這個單一映射表的壞處,那就是映射表本身也占用了4MB的物理內(nèi)存空間。

為了解決這個問題,偉大的先驅(qū)者們又引入了多級映射表(頁目錄表和頁表),我們下一篇文章再見!

本文轉(zhuǎn)載自微信公眾號「IOT物聯(lián)網(wǎng)小鎮(zhèn)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系IOT物聯(lián)網(wǎng)小鎮(zhèn)公眾號。

 

責(zé)任編輯:武曉燕 來源: IOT物聯(lián)網(wǎng)小鎮(zhèn)
相關(guān)推薦

2024-07-05 11:01:13

2020-11-25 08:25:02

二叉樹節(jié)點(diǎn)

2017-07-20 16:55:56

Android事件響應(yīng)View源碼分析

2019-07-31 15:56:57

Jvm虛擬機(jī)Content

2021-04-16 16:37:23

SpringMVC源碼配置

2024-01-17 08:18:14

RPAJava技術(shù)

2018-10-12 09:42:00

分布式鎖 Java多線

2023-08-04 09:43:16

Socket編程Python

2019-05-30 09:32:49

2021-05-19 08:31:15

壓測數(shù)據(jù)結(jié)構(gòu)與算法工具

2019-07-23 08:55:46

Base64編碼底層

2018-02-08 18:16:39

數(shù)據(jù)庫MySQL鎖定機(jī)制

2019-10-31 10:08:15

Synchronize面試線程

2018-10-21 15:36:13

UI適配iOS

2016-07-13 10:21:07

新華三

2019-08-01 11:04:10

Linux磁盤I

2019-09-11 14:40:44

數(shù)據(jù)清洗數(shù)據(jù)分析數(shù)據(jù)類型

2019-10-31 09:48:53

MySQL數(shù)據(jù)庫事務(wù)

2022-04-14 10:10:59

Nginx開源Linux

2022-02-22 08:55:29

SelectPoll/ Epoll
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲国产精品一区二区三区 | 国产欧美二区 | 精品一区二区三区四区五区 | 免费在线h视频 | 日韩毛片在线观看 | 在线观看的av | 久久精彩视频 | 国产精品91网站 | 免费视频成人国产精品网站 | 久久亚洲国产精品 | 亚洲精品中文字幕在线 | 亚洲成av人片在线观看 | 久草免费在线视频 | 一区二区三区四区av | 午夜专区 | 国产羞羞视频在线观看 | www.一区二区三区.com | 日韩中文字幕一区二区 | 久久一区二区av | 久草网站| 欧美国产日韩在线观看成人 | www国产成人免费观看视频,深夜成人网 | 国产精品久久久久久 | 日本三级网站在线 | a久久久久久 | 国产9 9在线 | 中文 | 国产三区视频在线观看 | 97成人免费 | 国产成人精品一区二区三 | 盗摄精品av一区二区三区 | 资源首页二三区 | 二区中文字幕 | 久久亚洲精品国产精品紫薇 | av网站在线看 | 农村黄性色生活片 | 97精品超碰一区二区三区 | 国产人久久人人人人爽 | 日本午夜免费福利视频 | 91久久国产综合久久 | 亚洲中午字幕 | 久久黄色精品视频 |