嵌入式Linux內存管理的一些知識點總結

感受這個內存管理的知識點還真的須要專門的去理解一下,今天咱們一塊兒來學習學習。要求linux

1.不涉及linux內核的彙編知識,僅C語言層面解析程序員

1.回答:彙編主要處理的是寄存器地址(包括內容)的計算,進行一部分的地址轉換工做(固然,它是重要的);C語言處理了極大部分的系統內存管理工做。算法

 

2.虛擬地址、線性地址、物理地址三者映射關係函數

回答:學習

1.虛擬地址:程序員(在縮小範圍估計是:應用程序員)直接看到的操作系統

2.線性地址:操做系統控制繼承

3.物理地址:CPU內存地址(或者外部內存)進程

 

3.總結一點:虛擬地址經過段管理機制首先變換成一種中間地址形式--cpu32位的線性地址,而後使用分頁管理機制將此地址映射到物理地址。內存

 

例子解析:編譯器

一個變量定義在一個進程裏面,在程序中使用&操做符獲取的地址(估計是偏移地址),將怎麼映射呢?(或者它是什麼地址,在進程中的位置如何)

 

1. 回答:由於,程序使用的都是虛擬地址,因此程序員拿到的變量地址是虛擬地址(它是通過編譯器處理過的,並由系統指映射線性地址,分配物理內存的)。

2. 同時,一個變量的地址(虛擬地址)是不會改變的(只要程序代碼不改變,或者不在編譯),可是,改變運行(不一樣的時間,相隔一段時間在運行的話),物理地址是會改變的。正是由於操做系統的內存管理做用(線性地址映射到物理地址,是一個動態的過程)。

 

malloc函數從調用、分配到返回的過程是?

1. 回答:函數調用系統函數,系統函數進入了內核態,引發中斷(或其餘,異常處理等工做),操做系統得知須要額外的增加空間以提供使用,因此使用分頁機制來映射到可使用的物理地址(沒有有用數據,或不被映射),從而使得虛擬地址有了真實的物理地址映射管理,能夠正常使用了。

2. malloc實際上,並非用戶調用malloc後立刻對物理地址與虛擬地址之間進行映射,只有在用戶對申請的內存空間進行讀寫異常操做纔會發生映射。(具體看《註釋》的13.1.6需求加載機制),總結一句:在實際須要時才加載執行文件中頁面的方式。

 

頁表和頁目錄表存放位置(所處的系統空間)是?

1. 回答:系統初始化過程當中,主動往物理內存填寫頁表信息。這就是咱們操做系統須要作的事情,填寫和修改表的程序代碼的編寫。

 

線性地址轉物理地址是誰來作呢?

1. 回答:設置好頁表信息後,CPU每次訪問內存都經過MMU來查表並轉換出物理地址。是硬件自動操做。

 

所謂的內存(物理內存,或物理地址,或物理空間)是指?

1. 回答:就是內存,RAM(rw),而磁盤(或者是其餘的硬盤性質的存儲介質)是做爲程序或數據存儲的空間,它並不參與到與CPU的指令(數據)傳輸,而是先將它本身的數據放到內存(也就是RAM,物理內存裏面),再由內存和CPU之間處理。

 

只是做爲一個例子,讓咱們假定您的程序正在訪問地址爲 629 的內存。不過,虛擬內存系統不須要將其存儲在位置爲 629 的 RAM 中。實際上,它甚至能夠不在 RAM 中 —— 若是物理 RAM 已經滿了,它甚至可能已經被轉移到硬盤上!因爲這類地址沒必要反映內存所在的物理位置,因此它們被稱爲虛擬內存。操做系統維持着一個虛擬地址到物理地址的轉換的表,以便計算機硬件能夠正確地響應地址請求。嵌入式物聯網等系統學習請加企鵝意義氣嗚嗚吧久零就易,而且,若是地址在硬盤上而不是在 RAM 中,那麼操做系統將暫時中止您的進程,將其餘內存轉存到硬盤中,從硬盤上加載被請求的內存, 而後再從新啓動您的進程。這樣,每一個進程都得到了本身可使用的地址空間,能夠訪問比您物理上安裝的內存更多的內存。

 

一個進程被建立,linux系統確定是分配給他一個0的虛擬地址?

回答:對的,每一個進程空間的0x00虛擬地址開始的線性區都會被映射到一個用戶態沒有權限訪問的頁上,經過這樣的映射,內核能夠保證沒有別的頁會映射到這個區域。

 

如同IBM:內存管理的內幕說起到的,malloc內部的系統調用函數,也就是實現malloc的內部算法

 

1. 在mallo從內部使用映射函數(系統調用),brk()和mmap():連接1

 

爲何進程建立後,子進程會繼承父進程的一部分信息呢?

1. 回答:子進程實際上的父進程的一個拷貝,共同擁有相同的物理頁面,爲了節約空間,子進程以只讀方式共享父進程的物理頁面(同時父進程也把它本身設置爲只讀方式),任意一方進行寫操做,就會出現異常(以後就是內核處理異常)。總結一句:這樣能夠避免沒必要要的內存頁面複製的開銷。

 

對CPU的內存管理(MMU)和linux系統的內存管理二者的理解:

 

 

 

上面的一段話,實際上是告訴咱們:在CPU提供MMU的狀況下(也就是分段、分頁機制),首先是分段機制作第一步的虛擬地址到線性地址轉換,而後由操做系統實現(這就是意味着linux系統會有大量的內存管理代碼的實現方法)分頁機制(同時選擇CPU某一引腳來決定是否採用分頁機制),直到進程的虛擬地址映射到可用的物理地址上面。

 

這意味着,從虛擬地址到物理地址的轉換狀況以下:

至於虛擬內存的哪一個頁面映射到物理內存的哪一個頁幀,這是經過頁表(Page Table)來描述的,頁表保存在物理內存中,MMU會查找頁表來肯定一個虛擬地址應該映射到什麼物理地址。總結一下這個過程:

1. 在操做系統初始化或者分配、釋放內存時,會執行一些指令在物理內存中填寫頁表,而後用指令設置MMU,告訴MMU頁表在物理內存中的什麼位置。

 

2. 設置好以後, CPU每次執行訪問內存的指令都會自動引起MMU作查表和地址轉換的操做,地址轉換操做徹底由硬件完成,不須要用指令控制MMU去作。

 

MMU除了提供地址轉換機制以外,還提供內存保護機制,解析以下:

1. 用戶模式和特權(也就是內核)模式的區分

2. 設置每一個內存頁面的訪問權限(讀、寫、執行)

1. 注意:物理內存自己是不限制訪問的,正是MMU的內存保護機制的做用

具體的處理過程以下:

這樣設定好以後,當CPU要訪問一個VA時, MMU會檢查CPU當前處於用戶模式仍是特權模式,訪問內存的目的是讀數據、寫數據仍是取指令,若是和操做系統設定的頁面權限相符,就容許訪問,把它轉換成PA,不然不容許訪問,產生一個異常(Exception)。 

相關文章
相關標籤/搜索