簡體   English   中英

x64計算機上的x86 LARGEADDRESSAWARE程序的內核模式內存大小?

[英]Kernel Mode memory size for an x86 LARGEADDRESSAWARE program on an x64 machine?

標題幾乎總結了一下。 我有一個為x86平台編譯的應用程序,該應用程序設置了/largeaddressaware標志。 在x64系統上運行它,我可以“免費”獲得擴展的4gb用戶模式虛擬內存,而不必指定/3GB引導選項。 在x86系統上,這意味着內核模式內存僅為1gb,但是由於x64系統可以尋址更多內存,因此內核模式是否保留2gb甚至提高到3gb?

編輯:明確地說,我想知道每個進程的限制。 問題來自閱讀本文

編輯2:此問題不是在64位操作系統上32位進程可以訪問多少內存的重復項 因為該問題僅解決了應用程序可訪問的內存,而不是系統可訪問的內存。 如果我被誤解了,並且每個進程都沒有為系統保留內存,那么如果有人可以將其寫成答案,我將不勝感激。 我確定我不是第一個對此感到困惑的人。

有一些誤解使您感到困惑。

首先,讓我們看一下32位Windows。 每個進程的虛擬地址空間都有一部分分配給進程本身,一部分分配給內核所需的任何東西。 但是,所有進程都共享相同的內核內存-實際上,您甚至在自己的虛擬地址空間中都有內核內存,這實際上是一種性能優化,可以避免在處理應用程序中的內核對象和數據時不得不切換地址空間。

默認情況下,這是1:1拆分,因此您獲得2 GiB的用戶地址空間和2 GiB的內核地址空間。 早期的32位Windows軟件(當您的計算機可能只有486 CPU或類似的內存而總內存只有4 MiB時)會使用(濫用),因為由於內存的布局方式,您的用戶地址空間永遠不會有超過 2個GiB障礙的任何指針-有效地為您提供任何指針中最高的位,供您自己的數據使用。 通常,這是用來允許混合的“如果合適,這是一個值,否則它是指向結構的指針”方法,從而節省了內存並減少了間接性。 由於分布范圍如此廣泛,因此默認設置與早期的設置相同,以防止出現兼容性問題。 但是,您還可以選擇加入其他分區-3 GiB用戶空間和1 GiB內核空間。 這就是/3GB選項的作用。 但這還不夠-您的應用程序必須使用/LARGEADDRESSAWARE選擇加入。 這基本上是說“我不會用指針做一些奇怪的事情”。

應該注意的是,32位操作系統或進程並不一定意味着您只能尋址4 GiB的內存-它只是限制了CPU在任何時候都可以直接訪問的內容。 對於內存密集型服務器軟件,即使是“ 32位”版本也可能支持尋址更多的內存-例如,32位MS SQL Server通過AWE最多支持64 GiB。 這基本上是虛擬化的另一層,它允許重新映射虛擬地址的物理地址。 從理論上講,無論有無AWE,您可以尋址的內存量都沒有限制-畢竟,沒有什么可以阻止您擁有充當內存映射文件的硬件,從而有效地為您提供了無限的地址空間。 當然,就像分段內存的時代一樣,使用它也不是一件容易的事或不實際的:)

在64位Windows上, /3GB不再有意義,將被忽略。 默認地址空間划分取決於Windows的確切版本,但在“ TB或更多”范圍內,超出了32位限制。 對於現代Windows,這通常是128 TiB用戶+ 128 TiB內核。 32位應用程序仍然必須像以前一樣使用/LARGEADDRESSAWARE 但是,由於內核現在是64位的,因此無論如何它都不能與用戶進程位於相同的地址空間中,因此64位OS上的32位應用程序可以完全訪問4 GiB地址空間。

當然,這些限制仍然遠低於理論上能夠解決的64位。 但是,大多數64位CPU實際上無法尋址整個64位地址空間-上一次我檢查的最常見的只是48位。 令人驚訝的是,這給了您256 TiB的地址空間,這是Windows的極限。 畢竟不是微軟的陰謀! :)實際上,這並不是什么新鮮事物。 Intel x86的32位ALU與32位地址空間相關聯的事實在CPU歷史上是一個異常的事實-CPU的地址空間(用於虛擬尋址或物理尋址)寬度通常比其ALU寬度高或低。 MS DOS對1 MiB可尋址內存的典型限制(還有640 kiB留給用戶應用程序)也來自此-當時的“ 32位” CPU只能使用20位地址。

如您鏈接的文章所述,32位CPU上可用的4GB地址空間分為兩部分:用戶模式或應用程序地址空間,以及內核模式地址空間。

用戶模式地址空間是每個進程的。 每個過程在用戶模式地址空間中的頁面與物理或虛擬內存之間都有不同的映射。

無論當前正在運行哪個進程,內核模式地址空間都是相同的。 否則,每次轉換到內核模式時都必須重新映射地址空間,這將非常低效。 (這篇文章的確如此,但只是非常簡短:“操作系統使它的虛擬內存在每個進程的地址空間中可見”。)

默認情況下,32位Windows將其平均划分,用戶空間2GB,內核空間2GB,但可以配置為將其划分為3GB / 1GB。

在x64 Windows上,內核以64位模式運行,因此它可以訪問CPU允許的全部地址空間,當前為48位或256TB。 最初的x64 Windows版本僅使用16TB的地址空間,平均分配:8TB用於應用程序地址空間(對於64位應用程序)和8TB用於內核。 在Windows 8.1中,將其增加為使用CPU允許的整個256TB,並再次平均分配:用於64位應用程序的128TB,用於內核的128TB。

32位應用程序在WOW64仿真環境中運行,而CPU在舊模式下運行。 但是,內核永遠不會在傳統模式下運行。 當需要內核轉換時,必須將CPU從傳統模式切換到長模式,這也意味着它從32位地址空間切換到64位地址空間。 x64 CPU的設計使這種轉換非常有效。

結果,不需要為內核保留任何 32位地址空間。

為了確保向后兼容,一個32位進程(其可執行文件未標記為支持大地址)仍限制為2GB地址空間。 如果可執行文件較大的地址,進程得到所有4GB。

您應該注意,這實際上是地址空間 ,而不是內存甚至虛擬內存 一個32位應用程序可以使用文件映射和其他方法來利用超過4GB的內存。

您還應該注意, 進程可以訪問2GB / 3GB / 4GB的地址空間這一事實並不意味着應用程序可以使用所有這些空間。 Windows在每個進程中為其保留一些用戶模式地址空間。

地址空間和其他限制在此處記錄: Windows和Windows Server Releases的內存限制

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM