LiNUX記憶體原理的一點理解

來源:互聯網
上載者:User

最近看了一點關於核心的書籍,有些收穫,現在拿出來與大家分享,不當之處請指教

模式轉換

linux在引導的過程的前半段運行於即時模式,程式運行使用的是物理地址,如0X9000,指的就是物理地址的
0X9000。後半段轉入保護模式使用的是虛擬位址。虛擬位址轉化的開關在CR1寄存器,虛擬位址轉化的基礎是程式建立了頁目錄,頁表機制。就是虛擬位址通過頁目錄,頁表映射到相應的物理地址。

虛擬位址
   32位機的定址空間(虛擬位址)為4G,其中0-3G為使用者空間,3G-4G為系統空間。在使用者看來,我們的程式就像是運行在4G空間的記憶體上。而且各個進程可以使用相同的虛擬位址,而不會互相干擾。其實就是作業系統在玩的一個把戲,偷梁換柱,例如程式甲用的是 0x1000,程式乙用的也是 0x1000
而作業系統可能把甲用的0x1000指向了實體記憶體的0X01000000,而將乙用的0x1000指向了實體記憶體的0X02000000。

轉換原理
   Linux採用的是三級映射機制即:頁目錄,中間頁表,頁表。而i386支援是兩級,所以中間頁表
不起作用,視為透明。虛擬位址轉換為實際的物理地址是由硬體MMU自動完成的,具體的過程是,由寄存器CR3取得頁目錄的地址,按照虛擬位址的22-31位元值(作為位移)取得頁表的地址,按照頁表地址加上虛擬位址的12-21位(作為位移)取得頁表的數值(物理頁地址),按照物理頁地址加上虛擬位址0-11位元值(作為位移)取得相應的物理地址,完成轉換。

虛擬位址的狀態
   每一個進程都有一套自己的頁表,頁表描述的空間為0-4G。系統空間也有自己的頁表,描述空間
為0-4G,但是0-3G全部初始化為0,只在3G-4G進行了映射,採用的方式為線形映射,如0xC0009000指的就是實體記憶體的0x00009000,xC0029000指的就是實體記憶體的0x00029000。

   進程在運行過程中不論在系統空間運行還是在使用者空間運行均使用自己的頁表,而所有的進程的頁表 3G-4G空間均為相同映射。

   在進程切換的時候CR3會由下一個進程的頁目錄位址進駐。從而當切換為下一個因為而所有的進程的頁表 3G-4G空間均為相同映射,所以不論CR3怎樣切換,那麼核心都能正常運行。

虛擬記憶體的管理

   為了對虛擬記憶體進行管理,每個進程有一個mm_struct結構和一些vm_area_struct,前者是對一個
進程的虛擬記憶體的一個總體描述,後者是對進程的各個記憶體地區的描述。

由於LINUX採用的是分頁制,而對於CPU提供的分段制,可以理解系統進行了直接的穿透

以上參考了 毛德操 胡希明的《Linux核心原始碼情景分析》,真是一本好書

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.