Я читал эту статью, в которой рассказывается о том, что максимальный объем оперативной памяти, выделенной для использования ядра в 32-битных окнах, составляет 2 ГБ, даже если общий объем оперативной памяти составляет> 4 ГБ.
То же самое для 32-битных сред Linux, таких как 32-битный ubuntu 10.04? IE - максимальное выделение ядра 2 ГБ оперативной памяти, даже если общая основная память> 4 ГБ?
Если вы увеличите общий объем оперативной памяти до 64 ГБ путем перекомпиляции ядра с включенной опцией PAE, какой максимальный объем оперативной памяти вы можете выделить для использования ядра? Это все еще 2Гб? Или можно увеличить?
Оба ядра разделяют виртуальное адресное пространство на пользовательскую часть и часть ядра. Часть ядра распределяется между всеми процессами в системе, поэтому ядро ограничено этой непосредственно адресуемой памятью. У каждого пользовательского процесса в системе есть собственная пользовательская часть адресного пространства. Классически это деление делалось посередине, давая каждой половине 2 ГБ. Windows можно указать, чтобы переместить разделение на 3 ГБ для пользователя и 1 ГБ для ядра с помощью переключателя / 3gb boot.ini. Ядро linux довольно легко настраивается во время сборки, и в последний раз, когда я проверял, ядра Ubuntu собираются с разделением 3: 1.
PAE позволяет адресовать 64 ГБ физической оперативной памяти, но любая заданная таблица страниц по-прежнему ограничена 4 ГБ. Поскольку существует только одна часть ядра этого адресного пространства, совместно используемая всеми процессами в системе, она ограничена 1 или 2 ГБ напрямую адресуемой оперативной памяти, независимо от того, что. Может быть использована дополнительная физическая память, но она должна быть только частично отображена в виртуальное адресное пространство в любой момент времени, и отображения меняются по мере необходимости. Поскольку каждый процесс имеет отдельное адресное пространство пользователя, у вас может быть, например, 5 различных процессов, каждый из которых имеет 2 ГБ собственной памяти, которая сопоставляется с различными частями установленной вами физической RAM объемом 16 ГБ, а ядро использует еще 2 ГБ.
Обратите внимание, что кеш файловой системы не должен постоянно отображать страницы, поэтому он может использовать гораздо больше этого физического ОЗУ, а ядро автоматически отображает его биты, когда это необходимо, а затем отключает отображение, чтобы оно могло отображать другие страницы. Эта уловка позволяет ядру использовать много гигабайт памяти для кеша и несколько сотен мегабайт для других целей, даже когда ядро имеет только 1 гигабайт виртуального адресного пространства для игры.
Также стоит отметить, что в последних версиях Windows Microsoft ввела различные искусственные ограничения на лицензирование продуктов. Windows 7 Pro, с которой я застрял на своем ПК на работе, отказывается использовать физические адреса оперативной памяти> 4 ГБ, даже если я включаю PAE, что приводит к тому, что она может использовать только 3,4 из 4,0 ГБ установленной оперативной памяти, так как часть RAM перемещается на отметку 4 ГБ, чтобы оставить место для таких вещей, как видеопамять, которые должны быть расположены под 4 ГБ.
Обычно Windows не может выделить всю память, потому что часть этой памяти используется для видеопамяти.
Что касается вашего вопроса о PAE, я не уверен. Если бы у вас было 64 ГБ оперативной памяти и PAE, вы, вероятно, могли бы использовать в общей сложности более 4 ГБ, но я думаю, что каждая отдельная программа была бы ограничена 4 ГБ оперативной памяти.
Эта проблема возникает из-за адресного пространства, предоставляемого 32-битным целым числом. 2 ^ 32 обеспечивает 4294967295 значений, следовательно, предел оперативной памяти 4 ГБ.
В соответствии с этот текст, Linux разделяется на 3G, поэтому у вас должен быть доступ к 3G RAM сразу, как в Windows с Ключ / 3GB применен к boot.ini.
По крайней мере, теоретически. По неизвестной мне причине тест только что доказал, что я могу использовать только часть этой памяти:
08048000-0804b000 data?
0804b000-081ce000 heap
65e00000-b7395000 mmap-ed heap
b7395000-b73ac000 mmap-ed code
bf93f000-bf960000 stack
Почему я не мог malloc()
диапазон от 081ce000-65e00000
, Я не знаю.