Linux段式管理与页式管理
內存管理有2種機制:1、段式管理;2、頁式管理
在80386CPU中增加了2個寄存器:1、全局性的段描述表寄存器GDTR
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2、局部性的段描述表寄存器LDTR
段寄存器的高13位用于在全局或局部描述表項中選擇一個描述符;
第2為選擇全局或者局部段描述寄存器;
低2位決定特權級別,一般LINUX中0表示系統狀態,1表示用戶狀態。
每個描述表項8個字節,將段寄存器的高13位加上指定的段描述表寄存器的基地址就得到了描述表項的起始地址;
每個描述表項含有段的基地址和段的大小;而段的基地址高8位和低24位沒有連在一起,這也是因為Intel剛開始的意圖本來是想用24位的地址空間,后來發現不夠用,所以改為了32位地址。但此時80286CPU已經發布出去了,無奈只能修修補補,以兼容80286。
? ? ?? 所以,段寄存器 + GDTR/LDTR = 描述表項,描述表項指定了段的基地址和段的大小;
? ? ?? 如果將段的基地址設為0,段的大小設置為最大,此時物理地址就與邏輯地址一致,Intel稱其為平面地址。
段描述表寄存器只能在系統狀態使用,用戶程序不能改變GDTR和LDTR的內容
邏輯地址-->映射-->線性地址-->物理地址
連續的邏輯地址經過映射后的線性地址還是連續的
32位的線性地址:dir:10字節;page:10Byte; offset:10Byte
段式管理:邏輯地址到物理地址一步到位;
頁式管理:先找到目錄項,再找到頁面描述符。這樣做是出于空間效率的考慮,線性地址空間可以表示4G的地址空間,但一個進程很難會用到4G的空間,但數組中即使是空著的表項也占用空間,所以分成2層可以視需要來設置頁表,如果目錄中某項為空,就不必設置頁表,從而省下存儲空間。
?
? ? ?? 在linux內核中使用了gcc對C的擴充,所以linux內核只能用gcc編譯,Linux內核與gcc平行的發展,所以每個Linux內核版本都有對應的gcc版本。
?在i386CPU中,地址為32位時,2層映射比較合理,但考慮到64位的CPU,為了通用性,頁式管理設計了3層映射。對于32位地址采用2層設計,大于32位的地址采用3層設計。
對于32位的4G虛擬內存空間,最高的1G內存用于內核本身,稱為“系統空間”,而較低的3G字節,用作各個進程的“用戶空間”,這樣理論上每個進程可以使用3G的用戶空間。
雖然系統空間位于虛擬內存空間的最高部分,但對應的物理地址卻是從0地址開始的。
? ? ? ? 就我的理解,歷史上先出現了段式管理,很多老式芯片都支持段式管理,后來出現了頁式管理,Linux為了兼容或者通用,采用了先段式管理后頁式管理的方法,現在的大多數芯片一般采用的都是頁式管理,段式管理其實形同虛設。
?
?
? ? ? ??
?
轉載于:https://www.cnblogs.com/zhu-g5may/p/9726765.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Linux段式管理与页式管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 层序创建二叉树
- 下一篇: python全栈-Day 14