這個(gè)內存管理的知識點(diǎn)還真的需要我們專(zhuān)門(mén)的去理解一下,今天大家一起來(lái)學(xué)習學(xué)習嵌入式Linux內存管理的知識。 1.不涉及l(fā)inux內核的匯編知識,僅C語(yǔ)言層面解析 1.回答:匯編主要處理的是寄存器地址(包括內容)的計算,進(jìn)行一部分的地址轉換工作(當然,它是重要的);C語(yǔ)言處理了極大部分的系統內存管理工作。 2.虛擬地址、線(xiàn)性地址、物理地址三者映射關(guān)系 回答: 1.虛擬地址:程序員(在縮小范圍估計是:應用程序員)直接看到的 2.線(xiàn)性地址:操作系統控制 3.物理地址:CPU內存地址(或者外部?jì)却? 3.總結一點(diǎn):虛擬地址通過(guò)段管理機制首先變換成一種中間地址形式--cpu32位的線(xiàn)性地址,然后使用分頁(yè)管理機制將此地址映射到物理地址。 例子解析: 一個(gè)變量定義在一個(gè)進(jìn)程里面,在程序中使用&操作符獲取的地址(估計是偏移地址),將怎么映射呢?(或者它是什么地址,在進(jìn)程中的位置如何) 1. 回答:因為,程序使用的都是虛擬地址,所以程序員拿到的變量地址是虛擬地址(它是經(jīng)過(guò)編譯器處理過(guò)的,并由系統指映射線(xiàn)性地址,分配物理內存的)。 2. 同時(shí),一個(gè)變量的地址(虛擬地址)是不會(huì )改變的(只要程序代碼不改變,或者不在編譯),但是,改變運行(不同的時(shí)間,相隔一段時(shí)間在運行的話(huà)),物理地址是會(huì )改變的。正是因為操作系統的內存管理作用(線(xiàn)性地址映射到物理地址,是一個(gè)動(dòng)態(tài)的過(guò)程)。 malloc函數從調用、分配到返回的過(guò)程是? 1. 回答:函數調用系統函數,系統函數進(jìn)入了內核態(tài),引起中斷(或其他,異常處理等工作),操作系統得知需要額外的增長(cháng)空間以提供使用,所以使用分頁(yè)機制來(lái)映射到可以使用的物理地址(沒(méi)有有用數據,或不被映射),從而使得虛擬地址有了真實(shí)的物理地址映射管理,可以正常使用了。 2. malloc實(shí)際上,并不是用戶(hù)調用malloc后馬上對物理地址與虛擬地址之間進(jìn)行映射,只有在用戶(hù)對申請的內存空間進(jìn)行讀寫(xiě)異常操作才會(huì )發(fā)生映射。(具體看《注釋》的13.1.6需求加載機制),總結一句:在實(shí)際需要時(shí)才加載執行文件中頁(yè)面的方式。 頁(yè)表和頁(yè)目錄表存放位置(所處的系統空間)是? 1. 回答:系統初始化過(guò)程中,主動(dòng)往物理內存填寫(xiě)頁(yè)表信息。這就是我們操作系統需要做的事情,填寫(xiě)和修改表的程序代碼的編寫(xiě)。 線(xiàn)性地址轉物理地址是誰(shuí)來(lái)做呢? 1. 回答:設置好頁(yè)表信息后,CPU每次訪(fǎng)問(wèn)內存都通過(guò)MMU來(lái)查表并轉換出物理地址。是硬件自動(dòng)操作。 所謂的內存(物理內存,或物理地址,或物理空間)是指? 1. 回答:就是內存,RAM(rw),而磁盤(pán)(或者是其他的硬盤(pán)性質(zhì)的存儲介質(zhì))是作為程序或數據存儲的空間,它并不參與到與CPU的指令(數據)傳輸,而是先將它自己的數據放到內存(也就是RAM,物理內存里面),再由內存和CPU之間處理。 只是作為一個(gè)例子,讓我們假定您的程序正在訪(fǎng)問(wèn)地址為 629 的內存。不過(guò),虛擬內存系統不需要將其存儲在位置為 629 的 RAM 中。實(shí)際上,它甚至可以不在 RAM 中 —— 如果物理 RAM 已經(jīng)滿(mǎn)了,它甚至可能已經(jīng)被轉移到硬盤(pán)上!由于這類(lèi)地址不必反映內存所在的物理位置,所以它們被稱(chēng)為虛擬內存。操作系統維持著(zhù)一個(gè)虛擬地址到物理地址的轉換的表,以便計算機硬件可以正確地響應地址請求。嵌入式物聯(lián)網(wǎng)等系統學(xué)習請加企鵝意義氣嗚嗚吧久零就易,并且,如果地址在硬盤(pán)上而不是在RAM 中,那么操作系統將暫時(shí)停止您的進(jìn)程,將其他內存轉存到硬盤(pán)中,從硬盤(pán)上加載被請求的內存, 然后再重新啟動(dòng)您的進(jìn)程。這樣,每個(gè)進(jìn)程都獲得了自己可以使用的地址空間,可以訪(fǎng)問(wèn)比您物理上安裝的內存更多的內存。 一個(gè)進(jìn)程被創(chuàng )建,linux系統肯定是分配給他一個(gè)0的虛擬地址? 回答:對的,每個(gè)進(jìn)程空間的0x00虛擬地址開(kāi)始的線(xiàn)性區都會(huì )被映射到一個(gè)用戶(hù)態(tài)沒(méi)有權限訪(fǎng)問(wèn)的頁(yè)上,通過(guò)這樣的映射,內核可以保證沒(méi)有別的頁(yè)會(huì )映射到這個(gè)區域。 如同IBM:內存管理的內幕提及到的,malloc內部的系統調用函數,也就是實(shí)現malloc的內部算法 1. 在mallo從內部使用映射函數(系統調用),brk()和mmap():鏈接1 為什么進(jìn)程創(chuàng )建后,子進(jìn)程會(huì )繼承父進(jìn)程的一部分信息呢? 1. 回答:子進(jìn)程實(shí)際上的父進(jìn)程的一個(gè)拷貝,共同擁有相同的物理頁(yè)面,為了節約空間,子進(jìn)程以只讀方式共享父進(jìn)程的物理頁(yè)面(同時(shí)父進(jìn)程也把它自己設置為只讀方式),任意一方進(jìn)行寫(xiě)操作,就會(huì )出現異常(之后就是內核處理異常)?偨Y一句:這樣可以避免不必要的內存頁(yè)面復制的開(kāi)銷(xiāo)。 對CPU的內存管理(MMU)和linux系統的內存管理兩者的理解: 上面的一段話(huà),其實(shí)是告訴我們:在CPU提供MMU的情況下(也就是分段、分頁(yè)機制),首先是分段機制做第一步的虛擬地址到線(xiàn)性地址轉換,然后由操作系統實(shí)現(這就是意味著(zhù)linux系統會(huì )有大量的內存管理代碼的實(shí)現方法)分頁(yè)機制(同時(shí)選擇CPU某一引腳來(lái)決定是否采用分頁(yè)機制),直到進(jìn)程的虛擬地址映射到可用的物理地址上面。 這意味著(zhù),從虛擬地址到物理地址的轉換情況如下: 至于虛擬內存的哪個(gè)頁(yè)面映射到物理內存的哪個(gè)頁(yè)幀,這是通過(guò)頁(yè)表(Page Table)來(lái)描述的,頁(yè)表保存在物理內存中,MMU會(huì )查找頁(yè)表來(lái)確定一個(gè)虛擬地址應該映射到什么物理地址?偨Y一下這個(gè)過(guò)程: 1. 在操作系統初始化或者分配、釋放內存時(shí),會(huì )執行一些指令在物理內存中填寫(xiě)頁(yè)表,然后用指令設置MMU,告訴MMU頁(yè)表在物理內存中的什么位置。 2. 設置好之后, CPU每次執行訪(fǎng)問(wèn)內存的指令都會(huì )自動(dòng)引發(fā)MMU做查表和地址轉換的操作,地址轉換操作完全由硬件完成,不需要用指令控制MMU去做。 MMU除了提供地址轉換機制之外,還提供內存保護機制,解析如下: 1. 用戶(hù)模式和特權(也就是內核)模式的區分 2. 設置每個(gè)內存頁(yè)面的訪(fǎng)問(wèn)權限(讀、寫(xiě)、執行) 1. 注意:物理內存本身是不限制訪(fǎng)問(wèn)的,正是MMU的內存保護機制的作用 具體的處理過(guò)程如下: 這樣設定好之后,當CPU要訪(fǎng)問(wèn)一個(gè)VA時(shí), MMU會(huì )檢查CPU當前處于用戶(hù)模式還是特權模式,訪(fǎng)問(wèn)內存的目的是讀數據、寫(xiě)數據還是取指令,如果和操作系統設定的頁(yè)面權限相符,就允許訪(fǎng)問(wèn),把它轉換成PA,否則不允許訪(fǎng)問(wèn),產(chǎn)生一個(gè)異常(Exception)。 宋工企鵝號:35--24-65--90-88 Tel/WX:173--17--95--19--08 以下課程可免費試聽(tīng)C語(yǔ)言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。 想學(xué)習的你和我聯(lián)系預約就可以免費聽(tīng)課了 |