為什麼linux需要物理記憶體分配器?

時間 2021-05-31 08:08:57

1樓:

核心也是用的類似malloc的東西申請記憶體的。對核心來說,kmalloc()也是乙個記憶體分配器。

你說的「linux需要物理記憶體分配器」,不管是使用者態的應用級的,還是上面說的,核心態的「應用級」的,其實都是乙個東西。

但是,在它倆下面,還有乙個系統級的「記憶體管理層」,或「虛擬記憶體管理層」,管理頁表的建立,維護什麼的。

你提的問題,應該是兩個不同層面的問題,不要把它們放在一起想。

2樓:靈劍

你其實是想問說既然可以用malloc分虛擬記憶體,為什麼不直接連核心都用虛擬記憶體,這樣所有的記憶體分配都只需要用malloc+頁表對映進行,核心程序用記憶體也只要自己給自己分幾個整頁然後在這個頁上面malloc就行了,想法還是不錯的。

實際問題在於有少數幾個場景下一定需要用物理記憶體和物理記憶體位址,第一是頁表本身的管理,既然記憶體對映依賴頁表,那顯然不能用虛擬記憶體來管理頁表了,頁表中的結構還必須保證在物理上也是連續的,不能跨過頁邊界跑到不連續的地方去。第二是給硬體使用的記憶體(典型的如DMA)也需要是在物理上連續的記憶體,它們是不經過記憶體對映的。這些記憶體同樣有自己的生命週期,因而必須有物理記憶體分配器。

既然反正都有了,那也不必拘泥於malloc+虛擬記憶體的方案了,很多地方就都可以用。

3樓:

首先,如 @vczh 所述,malloc是在程序址空間中分配,並不能完成實際物理記憶體分配。

再說為什麼不直接訪問物理記憶體:

其次,虛擬記憶體管理以及到物理記憶體的對映是現代處理器和作業系統必備功能,因為沒有虛擬記憶體管理的話,就不能實現諸如動態分頁,Swap等。如果直接訪問物理記憶體,就像feature phone或嵌入式系統,記憶體訪問出錯容易導致系統崩潰或者破壞其它程式的資料。

再次,有虛擬記憶體管理,才可能有多程序。

最後,Linux確實是對記憶體分頁了,但不可能按你說的方法,因為頁的大小是固定的,而核心與應用申請時不一定是固定大小,這會導致記憶體使用效率低下。

最最後,你可以去讀一下關於Linux記憶體管理的文件,或者《深入理解Linux核心》中關於記憶體管理的章節。

linux為什麼需要核心棧,系統呼叫時直接使用使用者棧不行嗎?

海嶺洋脊板塊發散 來自 xv6 document When changing protection levels from user to kernel mode,the kernel shouldn t use the stack of the user process,because it ma...

為什麼物理學要分巨集觀和微觀?

崔寶峰 不是物體運動往你的公式上靠,是你的公式向客觀運動上靠,你想用乙個公式統一整個宇宙也可以,但那有個前提,你需要洞悉宇宙規律之後才能通過係數修正得到乙個接近實際的公式 王英潔 所有物體都遵循量子規律,而巨集觀規律是 的極限,是一種近似。是作用量 具體來說,在量子力學中,觀察傳播子的路徑積分表示式...

為什麼Linux耗電?

eechen Intel的Linux工程師開發有PowerTop這個工具可以檢視Linux耗電程式排行。Android在設定電量裡也有耗電應用排行。 flyer punk xiaomi pro 13 之前用win10 home版,電腦還有點溫度,換了linux,直接是冰的,感覺Linux很省電,都不...