2009-11-10 50 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

相关问题