Как использовать более 3 ГБ в процессе в 32-разрядном приложении Linux с поддержкой PAE? - PullRequest
3 голосов
/ 10 ноября 2009

PAE ( расширение физических адресов ) было введено в процессоры еще в 1994 году. Это позволяет 32-разрядному процессору получать доступ к 64 ГБ памяти вместо 4 ГБ. Ядра Linux предлагают поддержку для этого, начиная с 2.3.23. Предположим, я загружаю одно из этих ядер и хочу написать приложение на C, которое будет иметь доступ к более чем 3 ГБ памяти (почему 3 ГБ? См. Это ).

Как мне получить доступ к более чем 3 ГБ памяти? Конечно, я мог бы отключить несколько процессов; каждый получал доступ к 3 ГБ и мог общаться друг с другом. Но это нереальное решение для большинства случаев использования. Какие еще варианты доступны?

Очевидно, что лучшим решением в большинстве случаев было бы просто загрузиться в 64-битном режиме, но мой вопрос строго о том, как использовать физическую память объемом более 4 ГБ в приложении, работающем на 32-битном PAE-совместимом ядро.

Ответы [ 6 ]

9 голосов
/ 10 ноября 2009

Непосредственно, если вы работаете в 32-битном режиме, каждый процесс будет подвергаться разделению виртуальной машины, с которой было построено ядро ​​(2 ГБ, 3 ГБ или если у вас есть исправленное ядро) с разделением 4 ГБ / 4 ГБ, 4 ГБ).

Один из самых простых способов заставить процесс работать с большим количеством данных и по-прежнему хранить его в оперативной памяти - это создать shmfs и затем поместить ваши данные в файлы на этом fs, получая к ним доступ с помощью обычного поиска / чтения / записи. примитивы, или отображая их в память по одному с mmap (что в основном эквивалентно выполнению вашей собственной подкачки страниц). Но что бы вы ни делали, это займет больше работы, чем использование первых 3 ГБ.

6 голосов
/ 16 ноября 2009

Или вы можете запустить столько экземпляров memcached , сколько потребуется, пока не будет отображена вся физическая память.Каждый экземпляр memcached может сделать 3GiB доступным на 32-битном компьютере.

Затем получить доступ к памяти частями через API и привязки языка для memcached.В зависимости от приложения, оно может быть почти таким же быстрым, как и работа на 64-битной платформе напрямую.Для некоторых приложений вы получаете дополнительное преимущество создания масштабируемой программы.Не многие материнские платы обрабатывают более 64 ГБ ОЗУ, но благодаря memcached у вас есть простой доступ к такому объему ОЗУ, за который вы можете заплатить.или любая платформа, которая может запускать memcached.

3 голосов
/ 10 ноября 2009

PAE является расширением адресной шины оборудования и некоторых модификаций таблицы страниц для этого. Это не меняет того факта, что указатель по-прежнему 32-битный, ограничивая вас до 4G адресного пространства в одном процессе. Честно говоря, в современном мире правильным способом написания приложения, которому требуется адресное пространство более 2G (windows) или 3G (linux), является простое назначение 64-битной платформы.

3 голосов
/ 10 ноября 2009

В Unix один способ получить доступ к более чем 32-битной адресуемой памяти в пространстве пользователя с помощью mmap / munmap, если / когда вы хотите получить доступ к подмножеству памяти, которое вы не используете в данный момент. Вроде как пейджинг вручную. Другой способ (более простой) состоит в том, чтобы неявно использовать память, используя различные подмножества памяти в нескольких процессах (если у вас есть многопроцессная архететура для вашего кода).

Метод mmap - по сути тот же трюк, что и обычные 128 программистов, которые использовали для переключения банков. В эти 64-разрядные дни, когда 64-разрядная поддержка так легко доступна, нет особых причин даже думать об этом;)

Я с удовольствием удалял весь отвратительный код PAE из нашего продукта несколько лет назад.

2 голосов
/ 10 ноября 2009

У вас не может быть указателей, указывающих на> 4G адресного пространства, поэтому вам придется проделать много трюков.

Должна быть возможность переключать блок адресного пространства между разными физическими страницами, используя mmap для отображения битов большого файла; вы можете изменить отображение в любое время, вызвав другой вызов mmap, чтобы изменить смещение в файле (кратное размеру страницы ОС).

Однако это действительно противная техника, и ее следует избегать. Для чего вы планируете использовать память? Неужели есть более простой способ?

0 голосов
/ 06 августа 2016

Очевидно, что лучшим решением в большинстве случаев было бы просто загрузиться в 64-битном режиме, но мой вопрос строго о том, как использовать физическую память объемом более 4 ГБ в приложении, работающем на 32-битном PAE-совместимом ядро.

Ничего особенного вам не нужно делать. Только ядро ​​должно обращаться к физической памяти, а с PAE оно знает, как обращаться к физической памяти выше 4 ГБ. Приложение будет использовать память объемом более 4 ГБ автоматически и без проблем.

...