怎樣通俗的理解作業系統中記憶體管理分頁和分段?

時間 2021-05-05 16:29:42

1樓:Bowen Xiao

感覺高讚說的有些問題,結合點我自己的想法。分段講的有點問題。照這個答案,分段解決的是虛擬記憶體解決的問題,但實際上兩者不能劃等號。

應該說現代作業系統的記憶體管理,是由分段和分頁兩種技術共同奠基的。

當然,也不能簡單地就說2者的粒度不同。兩者本質上都是對記憶體的劃分,我感覺分段是從程式執行邏輯的角度劃分,分頁則是從作業系統記憶體管理 + 分段的基礎上進行劃分。你以為程式的劃分像切蛋糕一樣簡單地固定分頁就可以了?

肯定是建立在一定邏輯基礎上的。

原來的程式都是一大段連續的記憶體,沒有這麼細的分段,而且直接操作物理記憶體,給程式設計帶來了麻煩。分段是從程式執行的角度,把ELF拆分成乙個個單元,有模組化的思想在吧,至少現在程式在記憶體中的排布有了比較清晰的劃分,程式設計師debug也更容易。分段的出現無論是對程式語言,作業系統記憶體管理都是有幫助的。

分頁是建立在分段的基礎上,繼續把段內的記憶體劃分,這是主要從作業系統管理的基礎上劃分。因為作業系統才不管你程式什麼邏輯,它只管記憶體管理起來方便,那當然分頁後規整的記憶體方便。

現代高效的虛擬記憶體設計,是作業系統基於這2個技術的又一層封裝,目的還是提高記憶體管理效率。這個時候作業系統就可以根據不同記憶體段來實現一些記憶體管理方面的優化。沒有分段和分頁,自然無法支撐虛擬記憶體體系。

2樓:講泰語的潮汕人

(以xv6為例)

位址空間

實體地址空間

線性位址又稱虛擬位址

分段、分頁與位址空間

邏輯位址--> (分段位址轉換) -->線性位址-->(分頁位址轉換) -->實體地址

分段機制及段描述符格式

base&limit

GDTR(描述GDT:base+limit=32+16=48

段描述符(描述段:base+limit+attributes=32+20+12=64

LDT描述符(描述LDT

TSS描述符

系統段描述符、LDT描述符、TSS描述符在GDT中

使用者段描述符在LDT中

index

LDTR記錄LDT在GDT的起始位置:

段暫存器 (selector)記錄段描述符在GDT/LDT的起始位置: index+TI+RPL=13+1+2=16

為找到段描述符需提供其所在表的base和它在表中的index。

selector中TI=0:GDTR和selector

selector中TI=1:GDTR和LDTR找LDT descriptor,LDT descriptor和selector

每張描述符表包含2^13個descriptor

線性位址長度32bit,每個段位址空間含2^32個bytes

2. 分頁機制及頁表條目(PTE)格式

分頁頁表與使用者/核心態

每個程序都有自己的頁表,不同程序的頁表將其使用者記憶體對映到不同的物理記憶體中, 因此每個程序就擁有了私有的使用者記憶體。

每個程序的頁表同時包括使用者記憶體和核心記憶體的對映。xv6 在每個程序的頁表中都包含了核心執行所需要的所有對映, 而這些對映都出現在 KERNBASE 之上。 每個程序所看到的記憶體都是從虛擬位址 0 開始的一段連續記憶體。

保護機制

幾個特權級儲存位置:

CPL:CS

RPL:DS

DPL:段描述符(IDT中的interrupt-gate descriptor,trap-gate descriptor)

3樓:

實模式是有很大弊端的,首先,直接操作物理記憶體,這樣的話每次只能執行乙個程式,並且不安全;另外,記憶體最大使用到1M,限制太大。

保護模式下,程式不能直接訪問實體地址,程式的虛擬位址需要被轉換為實體地址後再去訪問,位址轉換是由處理器和作業系統協作完成的,處理器在硬體上提供位址轉換部件,作業系統提供轉換過程中需要的頁表。

除段暫存器外,通用暫存器,指令指標暫存器,標誌暫存器等都從16位公升到了32位,因為段暫存器保留原來的16位也夠用。

bits偽指令用於指定處理器的執行模式,這一點是編譯器和處理器約定的,。

記憶體控制單元(MMU) 通過一種稱為分段單元的硬體電路把乙個邏輯位址轉換成線性位址,接著,通過第二個稱為分頁單元的硬體電路把線性位址轉換成實體地址。

graph LR

邏輯位址-->線性位址-->實體地址

最初的作業系統是無法對記憶體段做訪問限制,有了這樣的需求以後,CPU廠商決定採用段描述符來實現相關的功能,在硬體一級上新增GDTR和LDTR來支援全域性描述符表和區域性描述符表,並由硬體負責周邊的安全檢測。當初的CPU廠商也並不是憑空製造出了這樣乙個概念,是與作業系統廠商共同協商後才有了一套硬體方面的支援。

如今x86架構的OS,大都都把分段視為是相容性的考慮(類似於對實模式的處理),在系統初始化階段象徵性地初始化GDT,之後的執行就沒分段啥事兒了。位址空間的保護模型都來自分頁,像ARM體系結構就不支援分段,僅靠MMU進行保護。

分段的記憶體碎片太大,是計算中發展過程中嘗試過的方案,現在的方案是記憶體分頁,通過某種方式,將虛擬位址對映到實體地址,對映的關係是通過一張表實現的,也就是頁表。

分頁機制的思想是:通過對映,可以使連續的線性位址與實體地址相關聯,邏輯上連續的線性位址對應的實體地址可以不連續。 分頁的作用 - 將線性位址轉換為實體地址 - 用大小相同的頁替換大小不同的段

我們把一頁的大小定義為4K,那麼4G就有1M個頁,在32位的保護模式下,位址都是32位二進位制表示的,用20位二進位制定位頁表,剩餘的12位表示4K裡面的偏移。

分頁機制開啟前要將頁表位址載入到控制暫存器CR3中,這個過程是開啟頁表之前,所以儲存的是物理實際位址,每個頁表項對應乙個物理頁,通過頁表項就可以訪問到實際的實體地址。由於這個過程是固定的,CPU中整合了這個硬體模組,即MMU中的頁部件。

每個程序1M個頁表,每個4位元組,程序多了占用的記憶體還是很多的。

一般程序使用的記憶體是遠低於全部虛擬記憶體的。二級模式只為程序實際使用的那些虛擬記憶體區分配頁表,既提公升了效率,也減少了記憶體的使用量。

深入理解Linux核心

x86保護模式

4樓:剛吃飽飯的人民

記憶體的分段和分頁管理方式和由此衍生的一堆段頁式等都屬於記憶體的不連續分配。什麼叫不連續分配?就是把程式分割成一塊一塊的裝入記憶體,在物理上不用彼此相連,在邏輯上使用段表或者頁表將離散分布的這些小塊串起來形成邏輯上連續的程式。

在基本的分頁概念中,我們把程式分成等長的小塊。這些小塊叫做「頁(Page)」,同樣記憶體也被我們分成了和頁面同樣大小的」頁框(Frame)「,乙個頁可以裝到乙個頁框裡。在執行程式的時候我們根據乙個頁表去查詢某個頁面在記憶體的某個頁框中,由此完成了邏輯到物理的對映。

分段和分頁有很多類似的地方,但是最大的區別在於分頁對於使用者來說是沒什麼邏輯意義的,分頁是為了完成離散儲存,所有的頁面大小都一樣,對程式設計師來說這就像碎紙機一樣,出來的東西沒有完整意義。但是分段不一樣,分段不定長,分頁由系統完成,分段有時在編譯過程中會指定劃分,因此可以保留部分邏輯特徵,容易實現分段共享。

相關的完整內容在《計算機作業系統》中的儲存器管理一章中有完整介紹。

有空再多補。

Windows7作業系統下磁碟分割槽怎樣管理最科學

NTFS是分割槽格式,現在都用這個了,因為FAT和FAT32不能存放單個超過4G的大檔案,像1080P的電影在FAT32上就儲存不了了。建議就兩個分割槽,乙個用於裝系統,乙個用於儲存其它檔案。像固態硬碟和機械硬碟都有的情況,有些答友說各自分乙個區就行了,不是很同意,如果SSD上有256G,還是建議把...

怎麼理解作業系統也是程式語言寫的。

落昔 在電腦科學領域,先有雞還是先有蛋的問題,是有一些有趣的理論的。最有名的例子就是,最被廣泛使用的的C語言的編譯器,GCC,本身就是由C來編寫的。bootstrap的本意是鞋子後跟上面幫你提腳後跟的帶子。圖源wikipedia 這是怎麼做到的呢?我怎麼在沒有C語言編譯器的情況下構建C語言編寫的GC...

Windows作業系統裡的中易楷體 中易宋體 中易仿宋 中易黑體,分別帶有多少漢字呢?

裝個字型編輯工具,自己看比較方便,手邊只有fontforger,開啟win10自帶的微軟雅黑,檢視font Info 選單,在unicode range是一段一段的編碼值範圍,這裡面cjk打頭的是漢字範圍,你可以把他們加在一起得到總漢字數,但這種統計不一定完全準確,遇到過有些字型檔包含了某個漢字的編...