Почему выделение страниц в порядке 10 или 11 с помощью __получить _свободных _страниц ()обычно не удается?

Моей системной памяти достаточно (для сервера с 24 ГБ ). В моей системе пространство ядра выделено 320 МБ и 120 МБ для аварийного ядра. Остальная память используется для других целей. Однако, когда я использую __get_free_pages()для выделения смежных страниц с порядком 11, ядро ​​не может выделить 2^10 страниц. Почему?

Согласно makelinux

The maximum allowed value for order is 10 or 11 (corresponding to 1024 or 2048 pages), depending on the architecture. The chances of an order-10 allocation succeeding on anything other than a freshly booted system with a lot of memory are small, however.

Почему это так? Каждая страница в моей системе имеет размер 4 КБ (4096 байт ), 2^10 страниц = 1024 страницы, а общий размер составляет 1024 *4096 = 4 194 304 (байт )~. 4 МБ. Это всего 4 МБ непрерывного пространства, а ядро ​​очень маленькое :vmlinuz — всего 2,1 МБ, а initrd — 15 МБ. Общее потребление памяти всего ядра составляет ~300 МБ. Этого должно быть более чем достаточно, чтобы ядро ​​выделило 4 МБ смежных страниц. Даже на обычной машине с ядром/пользователем 1 ГБ/3 ГБ, и, конечно, ядро ​​не будет использовать весь 1 ГБ. Но как может произойти сбой при выделении только 4 МБ смежных страниц? И я думаю, что в пространстве ядра память не разбросана по физической памяти (из-за отображения виртуальной памяти ), а является линейной и непрерывной.

Сначала я попытался загрузить модуль ядра с выделением 2^10 страниц, но это не удалось, и я выгрузил трассировку стека :

[    6.037056]  [] dump_trace+0x86/0x2de
[    6.037063]  [] dump_stack+0x69/0x6f
[    6.037070]  [] warn_alloc_failed+0x13f/0x151
[    6.037076]  [] __alloc_pages_nodemask+0x80a/0x871
[    6.037081]  [] __get_free_pages+0x12/0x50

-. 121 ---1370480-

Статистика посещения моего приложения в магазине Google Play [закрыто]Я знал, что существует консоль разработчика Android, что я могу проверить всю статистику по своему приложению, ту статистику, которую я видел на данный момент, все о том, сколько раз мое приложение будет...

Я знал, что существует консоль разработчика Android, что я могу проверить всю статистику о моем приложении, ту статистику, которую я видел на данный момент, все о том, сколько раз мое приложение было установлено, удалено, обновлено... есть ли способ Я мог бы знать, сколько людей видели мое приложение..?

на всякий случай, если я мог что-то упустить, я написал письмо, чтобы задать этот вопрос команде Google Play, и поддержка сказала, что они не предоставляют такого рода аналитику

опять Анкит прав:)

6
задан Bastet 10 July 2012 в 09:41
поделиться