2012-05-16 5 views
2

Моя физическая память - 4G, и я использую Android x86, который 32bit, HIGHMEM4G включен. Я хочу как можно больше увеличить пространство vmalloc().Какое большое пространство VMALLOC может быть в 32 бит x86?

Как я и пытался, если перейти на 2G/2G VMsplit и сделать VMALLOC_RESERVED больше, то пространство vmalloc(), возможно, достигнет 1G. Но если я хочу получить больше vmalloc(), например. 2G, возможно ли это?

Vmalloc() выделяет из ZONE_HIGHMEM и ZONE_NORMAL. Если у меня достаточно физической памяти, ZONE_HIGHMEM достаточно большой. Может ли это помочь сделать vmalloc() выше 2G? Или vmalloc() ограничено своим виртуальным пространством, поэтому, если виртуальное пространство ядра составляет всего 2G, vmalloc() абсолютно не может быть больше этого?

ответ

1

Вы можете приблизиться к 2G (по расщеплению 2G/2G), но как и вы, ваша нормальная зона сжимается.
Большинство распределений ядра выполняется из нормальной зоны, поэтому вы начнете ощущать нехватку там, что приведет к серьезным проблемам.

Увеличение количества VMALLOC_RESERVE от 1G до 2G обычно плохое. Например. при переходе от 1G до 1.5G вы получаете на 50% больше vmalloc, но ваша нормальная зона уменьшается вдвое. И компромисс становится хуже, когда вы приближаетесь к 2G.

Мой лучший совет - изменить свой код, чтобы не использовать так много vmalloc.
Вместо этого вы можете использовать kmalloc и __get_free_pages.
Или вы можете думать, почему на самом деле нужно столько памяти ядра.