Linux内核地址空间为什么1GB,为什么Windows为其系统地址空间预留1Gb(或2 Gb)?
兩個(gè)不同的用戶進(jìn)程具有不同的虛擬地址空間。因?yàn)樘摂M的物理地址映射是不同的,所以當(dāng)將上下文從一個(gè)用戶進(jìn)程切換到另一個(gè)用戶進(jìn)程時(shí),
TLB高速緩存無效。這是非常昂貴的,因?yàn)闆]有在TLB中緩存的地址,任何內(nèi)存訪問將導(dǎo)致
PTE的故障和散步。
Syscalls涉及兩個(gè)上下文切換:用戶→內(nèi)核,然后是內(nèi)核→用戶。為了加快速度,通常保留最高的1GB或2GB虛擬地址空間供內(nèi)核使用。因?yàn)樘摂M地址空間在這些上下文切換中不會(huì)改變,所以不需要TLB刷新。這是由每個(gè)PTE中的用戶/管理員位啟用的,這確保內(nèi)核存儲(chǔ)器僅在內(nèi)核空間中可訪問;即使頁表相同,用戶空間也無法訪問。
如果有兩個(gè)單獨(dú)的TLB的硬件支持,一個(gè)專門用于內(nèi)核使用,那么這個(gè)優(yōu)化將不再有用。但是,如果您有足夠的空間來投入使用,那么制作一個(gè)更大的TLB可能更有價(jià)值。
Linux on x86曾經(jīng)支持一種稱為“4G / 4G分割”的模式。在這種模式下,用戶空間可以完全訪問整個(gè)4GB的虛擬地址空間,內(nèi)核還具有完整的4GB虛擬地址空間。如上所述,成本是每個(gè)系統(tǒng)調(diào)用需要一個(gè)TLB刷新,以及更復(fù)雜的例程以在用戶和內(nèi)核內(nèi)存之間復(fù)制數(shù)據(jù)。這一點(diǎn)已經(jīng)被測(cè)量到達(dá)30%的性能損失。
時(shí)間已經(jīng)改變,因?yàn)檫@個(gè)問題最初被提出和回答:64位操作系統(tǒng)現(xiàn)在更加普遍。在x86-64上的當(dāng)前操作系統(tǒng)中,用戶程序允許從0到247-1(0-128TB)的虛擬地址,而內(nèi)核永久駐留在從247×(217-1)到264-1(或從 – 247到-1,如果將地址視為有符號(hào)整數(shù))。
如果您在64位Windows上運(yùn)行32位可執(zhí)行文件,會(huì)發(fā)生什么?您會(huì)認(rèn)為所有虛擬地址從0到232(0-4GB)將很容易可用,但是為了避免在現(xiàn)有程序中顯示錯(cuò)誤,32位可執(zhí)行文件仍然限制在0-2GB,除非它們重新編譯為/ LARGEADDRESSAWARE 。對(duì)于那些,他們可以訪問0-4GB。 (這不是一個(gè)新的標(biāo)志;同樣適用于運(yùn)行/ 3GB開關(guān)的32位Windows內(nèi)核,它將默認(rèn)的2G / 2G用戶/內(nèi)核分裂更改為3G / 1G,盡管3-4GB仍然會(huì)出現(xiàn)的范圍。)
可能有什么種類的錯(cuò)誤?例如,假設(shè)您正在實(shí)現(xiàn)快速排序,并且有兩個(gè)指針,a和b指向數(shù)組的開頭和結(jié)尾。如果用(ab)/ 2選擇中間作為樞軸,只要這兩個(gè)地址都低于2GB,它就可以工作,但是如果它們都在上面,那么加法將會(huì)遇到整數(shù)溢出,結(jié)果將在陣列。 (正確的表達(dá)式是a(b-a)/ 2))
除此之外,32位Linux與其默認(rèn)的3G / 1G用戶/內(nèi)核拆分,歷來是運(yùn)行程序,其堆棧位于2-3GB范圍內(nèi),因此任何此類編程錯(cuò)誤都可能會(huì)被快速刷新。 64位Linux提供32位程序訪問0-4GB。
總結(jié)
以上是生活随笔為你收集整理的Linux内核地址空间为什么1GB,为什么Windows为其系统地址空间预留1Gb(或2 Gb)?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux怎么取消文件隐藏命令,Linu
- 下一篇: linux删除物理卷命令,如何安全的删除