Как уменьшить объем памяти, резервируемый IOKit при запуске процесса?

Я разработчик, работающий над очень большим 32-битным приложением с интенсивным использованием памяти. Для нас проблема нехватки виртуального адресного пространства (памяти). Во время расследования некоторых недавних проблем я заметил большой кусок памяти, зарезервированный IOKit (512 МБ). Эта память не выделяется, а только зарезервирована. Дальнейшее исследование показало, что большинство приложений (Safari, iTunes и т. Д.) Также резервируют этот фрагмент памяти. Кажется, что он остался нераспределенным. Я использую vmmap для тестирования. Например, вот приложение Какао, созданное с помощью XCode, с использованием шаблона по умолчанию:

REGION TYPE                      VIRTUAL
===========                      =======
CG backing stores                  1008K
CG image                              4K
CG raster data                       64K
CG shared images                   2252K
Carbon                             7264K
CoreGraphics                         16K
IOKit (reserved)                  512.0M        reserved VM address space (unallocated)
MALLOC                             59.0M        see MALLOC ZONE table below
MALLOC guard page                    48K
MALLOC metadata                     348K
Memory tag=242                       12K
STACK GUARD                        56.0M
Stack                              8712K
VM_ALLOCATE                        16.2M
__DATA                             8296K
__IMAGE                            1240K
__LINKEDIT                         31.5M
__TEXT                             76.7M
__UNICODE                           536K
mapped file                        27.4M
shared memory                      1320K
===========                      =======
TOTAL                             809.2M
TOTAL, minus reserved VM space    297.2M

Могу ли я что-нибудь сделать, чтобы уменьшить или исключить этот пул памяти? Наше приложение действительно могло бы использовать эти 512 МБ !!!

РЕДАКТИРОВАТЬ: Я провел еще несколько исследований и, похоже, этот фрагмент памяти является кадровым буфером видеокарты, отображаемым в пространство пользователя. Поэтому я предполагаю, что более точный вопрос заключается в том, есть ли способ ограничить захват фреймбуфера такой большой части виртуального адресного пространства пользовательского режима?

РЕДАКТИРОВАТЬ: Провели дополнительное тестирование и обнаружили, что ключ, который необходимо изменить, - это IOFBMemorySize. Как показано, если вы выполните эту команду:

ioreg -l | grep IOFBMemorySize

Или вы можете увидеть это в IORegistryExplorer. Однако мне не удалось изменить это значение. Я попытался добавить его в Info.plist для ATIFramebuffer.kext, ничего не вышло. Я попытался написать программу, которая вызывает IOConnectSetCFProperty, но она вернула kIOReturnUnsupported.

РЕДАКТИРОВАТЬ: После дополнительных исследований кажется, что этот ключ IOFBMemorySize, скорее всего, доступен только для чтения, просто сообщая об объеме памяти, доступной на видеокарте. Выглядело несколько интересных значений в Configuration.plist для CoreGraphics, но ни одно из них не повлияло на распределение памяти (даже после перезагрузки).

11
задан pj4533 29 June 2011 в 11:51
поделиться