Linux複習之記憶體部分

2021-09-26 07:58:05 字數 1569 閱讀 6834

1、作業系統記憶體管理模組

1. 記憶體管理方案

分區分頁

分段夥伴系統

段頁式交換分割槽

1)分割槽:程式載入時,將程式整體載入到一塊分割槽上;

固定分割槽: 記憶體碎片(大小相等/不等的固定分割槽)

動態分割槽:外部碎片

2)分頁:類似於大小相等的固定分割槽,

系統初始化時,將記憶體劃分為大小相等的頁幀(4k),程式在磁碟上的儲存也是按照4k的頁面進行儲存,

程式載入時,作業系統為每乙個程序維護乙個頁表; 乙個程序可以不連續的在記憶體上佔據多個頁幀;

3)分段:程式載入時,根據程式的段,將程式載入到記憶體上,

作業系統為每乙個程序維護乙個段表, 乙個程序可以不連續的在記憶體上佔據多個段;

每個頁幀的大小是固定的,而每個段是根據程式的段分大小,大小不固定;

4)夥伴系統:分配時,根據請求的大小將記憶體空間不斷的折半,直到以最小的空間分配給請求的程序,

**空間時,如果左或右有和他相等的空閒區塊,則合併為乙個大的區塊(不是一次合併)二叉樹

5)交換分割槽:(在磁碟上擴充套件的記憶體空間)

在磁碟上開闢一塊空間以管理記憶體的方式管理這塊磁碟空間,作為對記憶體的補充;

在記憶體空間不足時,才將記憶體上的部分資料交換(mmu)到交換分割槽上,

1.可以在記憶體上駐留更多的程序;

2.可以執行比記憶體大的程序;

2、x86下的位址對映

1.實位址模式

80386:32位cpu;

ds cs ss(es) 16位暫存器基位址

許可權: 00 最高許可權

11 最低許可權

13位:下標,段選擇子

系統初始12頁, 8180

每個段的大小必須是16的倍數,段基址也就是16的倍數,2程序資料上,後四位肯定為0;

16位的ip暫存器,偏移量,段的大小 16byte --64k

ds << 4 + ip = 實體地址

ipe:32位暫存器

gdtr:全域性段描述符表暫存器;

gdt:全域性段描述符表:段基址,段大小,許可權;

20段大小:2^20 = 1m

g: 0 位元組 1m ,

1 頁面 4k * 1m = 4g

ldtr:區域性段描述符表暫存器;

ldt:區域性段描述符表;

2.保護位址模式

gdtr[ds>>3].baseaddr + ipe(ipe段基址 邏輯位址

分段的位址對映

cro未開分頁機制-->實體地址

cro開啟了分頁機制-->虛擬位址 -- 2級頁面對映-- 實體地址

分頁的位址對映

下標 下標 偏移量

pd頁目錄 pt頁表

(4g/4k = 2^20)

p位:0:則對應的頁面不在物理記憶體上,觸發缺頁中斷,然後mmu模組將頁面置換到記憶體上;

1:則在物理記憶體上;

m位:0:資料未被修改;

1:資料被修改了;

Linux核心之記憶體管理

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

Linux驅動之記憶體訪問

背景 記憶體會以分頁方式組織記憶體,而且每頁大小和計算機體系結構有關係,linux中每個頁都有對應的struct page 與之對應。分配連續的記憶體 a void kmalloc int count,int flags 函式用於從zone normal區域返回連續記憶體的分配的位址。引數分析 co...

linux0 11之記憶體管理

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