2009-11-10 54 views
3

PAE(Physical Address Extension)是在1994年推出的CPU。這允許32位處理器訪問64 GB的內存而不是4 GB。 Linux內核從2.3.23開始提供支持。假設我正在啓動其中一個內核,並且想用C編寫一個可以訪問超過3 GB內存的應用程序(爲什麼是3 GB?See this)。如何在32位支持PAE的Linux應用程序的進程中使用超過3 GB的內存?

我該如何去訪問超過3 GB的內存?當然,我可以分解多個進程;每個人都可以訪問3 GB,並可以相互溝通。但是對於大多數用例來說這不是一個現實的解決方案。還有哪些其他選項可用?很顯然,在大多數情況下,最好的解決方案應該是在64位模式下簡單引導,但我的問題是嚴格地關於如何在啓用PAE的32位應用程序上運行的應用程序中使用高於4 GB的物理內存,內核。

+0

「我該如何編寫一個可以訪問超過3GB內存的C應用程序」?這屬於這裏! – 2009-11-10 16:32:22

回答

9

你不直接 - 只要你在32位上運行,每個進程都將受制於內核的虛擬機分割(2GB,3GB,或者如果你有補丁內核具有4GB/4GB分割,4GB)。

讓一個進程處理更多數據並將其保存在RAM中的最簡單方法之一是創建一個shmfs,然後將數據放入該fs的文件中,使用普通的seek/read/write基元訪問它們,或者用mmap一次將它們映射到內存中(這基本上相當於做自己的分頁)。但是無論你做什麼,它都需要比使用第一個3GB更多的工作。

+0

你回答了一個不同的問題。 「關於如何在啓用PAE的32位內核上運行的應用程序中使用4 GB以上的物理內存,嚴格問題。」你的答案是關於虛擬內存拆分和虛擬內存限制,而問題是關於物理內存。 – 2016-08-08 06:46:34

2

你不能讓指針指向> 4G的地址空間,所以你必須做很多技巧。

應該可以通過使用mmap映射大文件的位來切換不同物理頁面之間的地址空間塊;您可以隨時通過對mmap的另一個調用來更改映射,以更改文件中的偏移量(以OS頁面大小的倍數)。

但是,這是一個非常討厭的技術,應該避免。你打算如何使用內存?當然有更簡單的方法?

+0

是的,更簡單的方法是簡單地引導64位內核。我希望任何解決方案都會涉及討厭的黑客,我只是對它的討厭感興趣。 – ChrisInEdmonton 2009-11-10 17:48:49

+0

這真的取決於你的用例。如果您使用ram作爲光盤緩存,那麼您可以根據需要mmap塊,但是它會在mmap需要混淆頁表等時造成很多開銷,即使所需頁面已經映射到ram中。如果你使用線程,這種方法也會崩潰,因爲它們有一個共享的地址空間,所以mmap基本上是不安全的,沒有過多的鎖定會導致效率極低。 – MarkR 2009-11-10 21:33:26

3

在Unix上,通過使用mmap/munmap訪問用戶空間中超過32位可尋址內存的一種方法,如果/當您想要訪問當前未使用的內存子集時。有點像手動分頁。另一種方式(更簡單)是通過在多個進程中使用不同的內存子集來隱式地利用內存(如果您有代碼的多進程原型圖)。

mmap方法與Commodore 128程序員用於銀行切換的技巧基本相同。在這些後期編程64天,64位支持如此容易獲得,沒有很多好的理由,甚至想到它;)

我很開心從我們的產品刪除所有可怕的PAE代碼一些多年前。

+2

感謝您注意Commodore 64和128天的情況。這一點對我來說是值得的+1。 :) – ChrisInEdmonton 2009-11-10 17:53:11

3

PAE是硬件的地址總線和一些頁表修改的擴展。它不會改變指針仍然是32位的事實,在一個進程中將您限制爲4G地址空間。老實說,在現代世界中,編寫需要超過2G(windows)或3G(linux)地址空間的應用程序的正確方法是簡單地定位到64位平臺。

+1

確實如此,但有些方法可以在Windows和Linux上訪問額外的內存。當然,籃球可能是不值得的。 – ChrisInEdmonton 2009-11-10 20:52:43

6

或者你可以根據需要啓動儘可能多的memcached實例,直到映射到所有物理內存爲止。每個memcached實例都可以在32位機器上使3GiB可用。

然後通過APIs and language bindings爲memcached訪問內存塊。取決於應用程序,它可能幾乎與在64位平臺上直接工作一樣快。對於某些應用程序,您可以獲得創建可伸縮程序的額外好處。沒有多少主板可以處理超過64GiB的RAM,但使用memcached時,您可以輕鬆訪問儘可能多的RAM,因此您可以支付。

編輯注意,這種方法當然也適用於Windows,或任何可以運行memcached的平臺。

+1

+1,因爲這是一種解決問題的新方法!非常好! – 2010-08-19 08:24:23

0

顯然,在大多數情況下,最好的解決辦法是在64位模式,只需開機,但我的問題是嚴格如何利用物理內存4 GB以上的在啓用了PAE的運行的應用程序32位內核。

沒有什麼特別的你需要做的。只有內核需要尋址物理內存,而使用PAE時,它知道如何尋址高於4 GB的物理內存。該應用程序將自動使用超過4 GB的內存,並且沒有問題。

+0

這與給出的所有其他答案相矛盾,以及我在不同問題中閱讀的幾個相關答案。你願意引用你的答案嗎?你很可能是正確的。 – ChrisInEdmonton 2016-08-05 22:55:41

+0

@ChrisInEdmonton如果不允許內核訪問高於4GB的物理內存,您認爲PAE會做什麼?應用程序不直接與物理內存交互(至少不是),它們只與虛擬內存交互。這是解釋[這裏](https://msdn.microsoft.com/en-us/library/windows/desktop/aa366796(v = vs.85).aspx)。 – 2016-08-08 06:45:05

+0

@ChrisInEdmonton其他答案誤解了這個問題,並討論了關於虛擬內存的問題,這個問題與之無關。問題是關於物理內存訪問的具體問題,並且您需要的只是PAE,只有內核需要它。事實上,這正是PAE所做的。 – 2016-08-08 08:53:24

相關問題