內(nèi)存管理講解

內(nèi)存管理子系統(tǒng)是操作系統(tǒng)中最重要的部分之一经磅。

0_01291925244503.jpg

1泌绣、地址類型
物理地址:指出現(xiàn)在CPU外部地址總線上的尋址物理內(nèi)存的地址信號(hào),是地址變換的最終結(jié)果预厌,是內(nèi)存中實(shí)實(shí)在在存在的硬件地址阿迈。
邏輯地址:程序代碼經(jīng)過(guò)編譯后在匯編程序中使用的地址,C/C++程序中取地址求出來(lái)的地址就是邏輯地址。
虛擬地址(線性地址):在32位CPU架構(gòu)下轧叽,可以表示4G的地址空間苗沧,用16進(jìn)制表示就是0x00000000到0xffffffff。只有啟動(dòng)分頁(yè)機(jī)制的時(shí)候才有線性地址炭晒,如果沒有分頁(yè)機(jī)制待逞,那么線性地址就是物理地址。

2腰埂、地址轉(zhuǎn)換
CPU要將一個(gè)邏輯地址轉(zhuǎn)換為物理地址飒焦,需要兩步:首先CPU利用段式內(nèi)存管理單元,將邏輯地址轉(zhuǎn)換成虛擬地址屿笼,再利用頁(yè)式內(nèi)存管理單元,把虛擬地址最終轉(zhuǎn)換為物理地址翁巍。
即MMU(內(nèi)存控制單元)通過(guò)分段單元把一個(gè)邏輯地址轉(zhuǎn)為線性地址驴一,接著通過(guò)分頁(yè)單元把線性地址轉(zhuǎn)為物理地址。

3灶壶、段式管理
(1)16位cpu的段式管理
16位CPU內(nèi)部擁有20位的地址線肝断,它的尋址范圍就是2的20次方,也就是1M的內(nèi)存空間。但是16位CPU用于存放地址的寄存器(IP胸懈,SP……)只有16位担扑,因此只能訪問(wèn)65536個(gè)存儲(chǔ)單元,64K趣钱。
為了能夠訪問(wèn)1M的內(nèi)存空間涌献,CPU就采用了內(nèi)存分段的管理模式,并在CPU內(nèi)部加入了段寄存器首有。16位CPU把1M內(nèi)存空間分為若干個(gè)邏輯段燕垃,每個(gè)邏輯段的要求如下:
a、邏輯段的起始地址(段地址)必須是16的倍數(shù)井联,即最后4個(gè)二進(jìn)制位必須全為0卜壕。
b、邏輯段的最大容量為64K烙常。

段寄存器---->
段寄存器是為了對(duì)內(nèi)存進(jìn)行分段管理而增加的轴捎,16位CPU有四個(gè)段寄存器,程序可同時(shí)訪問(wèn)四個(gè)不同含義的段蚕脏。
1)CS+IP:用于代碼段的訪問(wèn)侦副,CS指向存放程序的段基址,IP指向下條要執(zhí)行的指令在CS段的偏移量蝗锥,用這兩個(gè)寄存器就可以得到一個(gè)內(nèi)存物理地址跃洛,該地址存放著一條要執(zhí)行的指令。

2)SS+SP:用于堆棧段的訪問(wèn)终议,SS指向堆棧段的基地址汇竭,SP指向棧頂,可以通過(guò)SS和SP兩個(gè)寄存器直接訪問(wèn)棧頂單元的內(nèi)存物理位置穴张。

3)DS+BX:用于數(shù)據(jù)段的訪問(wèn)细燎。DS中的值左移四位得到數(shù)據(jù)段起始地址,再加上BX中的偏移量皂甘,得到一個(gè)存儲(chǔ)單元的物理地址玻驻。

4)ES+BX:用于附加段的訪問(wèn)。ES中的值左移四位得到附加段起始地偿枕,再加上BX中的偏移量璧瞬,得到一個(gè)存儲(chǔ)單元的物理地址。

物理地址的形成方式--->
由于段地址必須是16的倍數(shù)渐夸,所以值的一般形式為XXXX0H嗤锉,即前16位二進(jìn)制位是變化的,后四位是固定的0墓塌,鑒于段地址的這種特性瘟忱,可以只保存前16位二進(jìn)制位來(lái)保存整個(gè)段基地址奥额,所以每次使用時(shí)要用段寄存器左移補(bǔ)4個(gè)0(乘以16)來(lái)得到實(shí)際的段地址。
在確定了某個(gè)存儲(chǔ)單元所屬的段后访诱,只是知道了該存儲(chǔ)單元所屬的范圍(段地址->段地址+65536)垫挨,如果想確定該內(nèi)存單元的具體位置,還必須知道該單元在段內(nèi)的偏移触菜。有了段地址和偏移量九榔,就可以唯一的確定內(nèi)存單元在存儲(chǔ)器中的具體位置。
而玫氢,邏輯地址=段內(nèi)偏移量
所以帚屉,由邏輯地址得到物理地址的公式為:PA=段寄存器的值*16+邏輯地址

(2)32位cpu的段式管理


段式內(nèi)存管理(32位cpu)

32位pc的內(nèi)存管理依然采用“分段”的管理模式,物理地址同樣由段地址和偏移量組成漾峡。但既然分為32位和16位攻旦,就肯定有不同之處,32位pc采用了兩種不同的工作方式:實(shí)模式和保護(hù)模式生逸。
1)實(shí)模式
在實(shí)模式下牢屋,32位CPU的內(nèi)存管理與16位CPU是一致的。最大尋址空間1MB槽袄,最大分段64KB烙无。
2)保護(hù)模式
段基地址長(zhǎng)達(dá)32位,每個(gè)段的最大容量可達(dá)4G遍尺,段寄存器的值是段地址的“選擇器”(Selector)截酷,用該“選擇器”從內(nèi)存中得到一個(gè)32位的段地址,存
儲(chǔ)單元的物理地址就是該段地址加上段內(nèi)偏移量乾戏。

3迂苛、分頁(yè)管理
線性地址被分為固定長(zhǎng)度的組,稱為頁(yè)鼓择。例如三幻,32位的機(jī)器,線性地址最大可為4G呐能,如果用4kb為一個(gè)頁(yè)來(lái)劃分念搬,這樣整個(gè)線性地址就被劃分為2的20次方個(gè)頁(yè)。
分頁(yè)單元把所有的物理內(nèi)存也劃分為固定長(zhǎng)度的管理單位摆出,它的長(zhǎng)度一般與線性地址頁(yè)是相同的朗徊。

分頁(yè)管理中的線性地址和物理地址
分頁(yè)管理

如上圖所示,每一個(gè)32位的線性地址被劃分為3部分:頁(yè)目錄索引(10位)偎漫、頁(yè)表索引(10位)荣倾、偏移(12位)。

分頁(yè)管理的步驟---->
1)裝入進(jìn)程的頁(yè)目錄地址(操作系統(tǒng)在調(diào)度進(jìn)程時(shí)骑丸,把這個(gè)地址裝入CR3)
2)根據(jù)線性地址的前十位舌仍,在頁(yè)目錄中,找到對(duì)應(yīng)的索引項(xiàng)通危,頁(yè)目錄中的項(xiàng)是一個(gè)頁(yè)表的地址
3)根據(jù)線性地址的中間十位铸豁,在頁(yè)表中找到頁(yè)的起始地址
4)將頁(yè)的起始地址與線性地址與線性地址的最后12位相加,得到物理地址

4菊碟、linux頁(yè)式管理


linux頁(yè)式管理

Linux操作系統(tǒng)采用虛擬內(nèi)存管理技術(shù)节芥,使得每個(gè)進(jìn)程都有獨(dú)立的進(jìn)程地址空間,該空間是大小為3G逆害,用戶看到和接觸的都是虛擬地址头镊,無(wú)法看到實(shí)際的物理地址。利用這種虛擬地址不但能起到保護(hù)操作系統(tǒng)的作用魄幕,而且更重要的是用戶程序可使用比實(shí)際物理內(nèi)存更大的地址空間相艇。
Linux將4G的虛擬地址空間劃分為兩個(gè)部分——用戶空間與內(nèi)核空間。用戶進(jìn)程通常情況下只能訪問(wèn)用戶空間的虛擬地址纯陨,不能訪問(wèn)內(nèi)核空間坛芽。例外情況是用戶進(jìn)程通過(guò)系統(tǒng)調(diào)用訪問(wèn)內(nèi)核空間。


虛擬內(nèi)存

如上圖展示了一個(gè)Linux進(jìn)程的地址空間的組織結(jié)構(gòu)翼抠,對(duì)于32位進(jìn)程來(lái)說(shuō)咙轩,代碼段從地址0x08048000開始;對(duì)于64位進(jìn)程來(lái)說(shuō)阴颖,代碼段從0x00400000開始活喊。
關(guān)于上圖堆和棧的區(qū)別--->

stack:由系統(tǒng)自動(dòng)分配,地址增長(zhǎng)方向是從高到低量愧。第一個(gè)進(jìn)棧的是主函數(shù)中的下一條指令(函數(shù)調(diào)用語(yǔ)句的下一條可執(zhí)行語(yǔ)句)的地址钾菊,然后是函數(shù)的各個(gè)參數(shù)(以從右往左的方式入棧),然后是函數(shù)中的局部變量
heap:需要程序員自己申請(qǐng)侠畔,并指明大小结缚。以鏈表的形式進(jìn)行管理,地址增長(zhǎng)方向是從低到高软棺。

  char *p1 = (char *)malloc(10);//c語(yǔ)言申請(qǐng)堆的方式
  char *p2 = new char(10);//在c++中申請(qǐng)堆的方式
  注:p1 p2本身在棧中红竭,而分配的10字節(jié)則在堆區(qū)。

注:關(guān)于棧是向低地址增長(zhǎng)喘落,而堆向高地址增長(zhǎng)茵宪,這樣設(shè)計(jì)可以使得堆和棧可以充分地利用空閑的地址空間

程序執(zhí)行時(shí)的內(nèi)存分配情況 -->

 int a = 0; //a 在全局已初始化數(shù)據(jù)區(qū) 
 char *p1; //p1 在 BSS 區(qū)(未初始化全局變量) 
 main() 
 { 
      int b; //b 在棧區(qū) 
      char s[] = "abc"; 
      //s 為數(shù)組變量瘦棋,存儲(chǔ)在棧區(qū)稀火, //“abc”為字符串常量,存儲(chǔ)在.rodata常量字符串區(qū)
      char *p1赌朋,p2; //p1凰狞、p2 在棧區(qū) 
      char *p3 = "123456"; //123456\0  在.rodata常量字符串區(qū)篇裁,p3 在棧區(qū) 
      static int c =0; //c為局部靜態(tài)數(shù)據(jù)赡若,data數(shù)據(jù)區(qū) 
      p1 = (char *)malloc(10);   //分配得來(lái)的 10 個(gè)字節(jié)的區(qū)域在堆區(qū) 
      p2 = (char *)malloc(20); //分配得來(lái)的 20 個(gè)字節(jié)的區(qū)域在堆區(qū) 
      free(p1); 
      free(p2); 
 }

 ------end 

ps:小小總結(jié)达布,望對(duì)在路上的你有所幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逾冬,一起剝皮案震驚了整個(gè)濱河市黍聂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌身腻,老刑警劉巖产还,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嘀趟,居然都是意外死亡脐区,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門去件,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坡椒,“玉大人,你說(shuō)我怎么就攤上這事尤溜【蟮穑” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宫莱,是天一觀的道長(zhǎng)丈攒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)授霸,這世上最難降的妖魔是什么巡验? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮碘耳,結(jié)果婚禮上显设,老公的妹妹穿的比我還像新娘。我一直安慰自己辛辨,他們只是感情好捕捂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斗搞,像睡著了一般指攒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上僻焚,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天允悦,我揣著相機(jī)與錄音,去河邊找鬼虑啤。 笑死隙弛,一個(gè)胖子當(dāng)著我的面吹牛架馋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驶鹉,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绩蜻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了室埋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伊约,失蹤者是張志新(化名)和其女友劉穎姚淆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屡律,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腌逢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了超埋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搏讶。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖霍殴,靈堂內(nèi)的尸體忽然破棺而出媒惕,到底是詐尸還是另有隱情,我是刑警寧澤来庭,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布妒蔚,位于F島的核電站,受9級(jí)特大地震影響月弛,放射性物質(zhì)發(fā)生泄漏肴盏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一帽衙、第九天 我趴在偏房一處隱蔽的房頂上張望菜皂。 院中可真熱鬧,春花似錦厉萝、人聲如沸恍飘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)常侣。三九已至,卻和暖如春弹渔,著一層夾襖步出監(jiān)牢的瞬間胳施,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工肢专, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舞肆,地道東北人焦辅。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像椿胯,于是被迫代替她去往敵國(guó)和親筷登。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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