linux0 12之記憶體管理(1) 整體框架思路

2021-07-03 13:27:40 字數 1303 閱讀 1160

記憶體管理一直是本人比較佩服linus的地方。為此先看linux0.11版本,又看了0.12版本,基本思路一樣,差異性會單獨列出來。

本篇部落格只是梳理一下大體思路,具體函式分析,放在後面的部落格。

一、 從實模式到保護模式談起

1、簡單講實模式,是16位定址的訪問方式,保護模式是32位的訪問方式。在linux0.12的啟動**中bootsect和setup是工作在實模式下,之後的所有**都執行在保護模式之下。

不管哪種模式,訪問記憶體都是一種對映的思想,所以實模式和保護模式就是對映演算法的差別(我的看法)。

實模式下如何讓pc指標進行訪問記憶體,

段<<4+偏移位址

段暫存器比如ds,對應的偏移量為si,定址標識為ds:si,

段是乙個16位的暫存器,所以左移4位,所以在實模式下最大定址為1m記憶體大小,為了定址更大記憶體,很明顯這種對映演算法就不能滿足了。

2、為了解決這個問題,x86硬體也提出了解決方案。

提出了32位的線性位址的概念,這樣就可最大定址4g的記憶體空間,看看如何實現的。

先看看此時段暫存器此時的結構

低三位暫不考慮,就是一些標誌位,高13位為索引為。

x86擁有乙個gdt表,這個表就是用來生成線性位址的,這個表每個cpu只有乙個,其中由很多表項組成,每個表項為2個32bit組成。表項結構如下:

剛剛的段暫存器的高13位就是用來定址在gdt表中,哪乙個表項。

gdt表項中的段基址組成32位的線性位址。

還有乙個問題就是段暫存器給出的只是gdt表項的偏移位址,而gdt的基位址是由乙個專門暫存器(gdtr)控制的。

所以基本框圖如下

大體了解實模式和保護模式的定址方式,x86還給出了暫存器cr0用於標誌什麼時候進入實模式什麼時候進入保護模式。

線性位址到真實的記憶體還有一定距離,也就是實體地址。

x86也提出一套機制,就是將物理記憶體分頁,將線性位址對映到物理記憶體上。採用兩級分頁,

具體實現框圖為

上面兩種對映方式就是常常將的分段對映和分頁對映。

Linux0 12 記憶體定址

一 分段與分頁的比較 1.邏輯位址 分段機制 線性位址 分頁機制 實體地址 分段機制是必須有的,分頁機制可以沒有。如果沒有分頁機制,線性位址 實體地址 不同的分段機制和不同的分段機制可以隨意組合 線性位址和實體地址都是32位,是一維的 3.分段的原因 隔絕各個任務的 資料和堆疊區域的機制,使多個程式...

Linux核心之記憶體管理

1 核心把物理頁作為記憶體管理的基本單位 處理器的最小可定址單位一般為字 記憶體管理單元 mmu,管理記憶體並把虛擬位址轉換為實體地址的硬體 通常以頁為單位進行處理 2 不同體系結構支援的頁大小不盡相同,有些還支援多種,大多數32體系結構支援4kb的頁,64位體系結構一般支援8kb頁 3 核心用st...

linux0 11之記憶體管理

其實我覺得作業系統的記憶體管理很神秘,且不說在寫應用程式時呼叫的malloc,在寫linux驅動時get free page,get free pages,kmalloc,就相當頭疼。看完linux0.11之後小有感觸,就此記下。先說核心使用的get free page吧,其實get free pa...