LINUX.ORG.RU

Kernel Memory Allocation


0

0

Нужно выделить максимально возможное количество памяти в системе. Интересует выделение памяти как в 32 так и 64 битном Linux. Я написал простенький модуль для ядра 2.6, с тестовым приложением для проверки:
http://narod.ru/disk/12704488000/ALLOCATOR.tgz.html
Ядро для выделения памяти из зон ZONE_NORMAL, ZONE_DMA и ZONE_HIGMEM составляет набор функций:

__get_free_pages(), alloc_pages(), kmap().

Правильно ли я выбрал направление, может есть способы проще решить эту задачу?

Спасибо.


может есть способы проще решить эту задачу?

Какую задачу - malloc-бомбу написать? Да, есть способ и проще:

while (1)
   malloc(1);

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

В случае с модулем ядра можно ограничиться одной строчкой.

LamerOk ★★★★★
()
Ответ на: комментарий от tailgunner

Извинияюсь :) задачу я действительно не сформулировал. Звучит она примерно так: - есть машина с 2Гб оперативной памяти. - установлена 32-битная система Linux с ядром 2.6.х без патчей bigmem.

Каким образом выделить максимальное количество физической памяти?

В Linux kernel сказано, что адреса выше 896 Мб, не могут быть доступны напрямую, а только через kmap. Но все равно выделяемое количество памяти (750 Мб), при использовании указанного выше модуля, недостачно. Причем если устанавливаешь количество RAM 4 Гб, то выделенный объем не меняется.

karak
() автор топика
Ответ на: комментарий от karak

> Каким образом выделить максимальное количество физической памяти?

Если это задача, то она решается тем самым циклом. Но это не задача. Ты не сказал, нужно тебе это сделать в ядре, в юзерспейсе, зачем тебе это, почему физическая память, должна ли она быть непрерывной... да ты вообще ничего не сказал.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Выделить память в кернелспэйсе. Она должна быть непрерывной. Нужна для ввода данных в режиме BUS-mastering для PCI, PCI-X плат.

karak
() автор топика
Ответ на: комментарий от karak

> Нужна для ввода данных в режиме BUS-mastering для PCI, PCI-X плат.

Так бы сразу и сказал. Невозможность выделить дофига неперрывной физической памяти для таких целей - давняя проблема Линукса. Раньше даже были патчи, позволявшие использовать для этого память за пределами параметра ядра mem.

С другой стороны, приличные PCI-платы давно поддерживают режим scatter-gather. так что эта проблема на практике жить особо не мешает.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Спасибо. А не пробовал get_user_pages? Может можно получить много-много маленьких страниц по PAGE_SIZE и суммарный объем будет больше? Правда в 2.4 такой функции кажется нет.

karak
() автор топика
Ответ на: комментарий от karak

> А не пробовал get_user_pages?

Ы? get_user_pages закрепляет страницы пользовательского процесса в памяти (потом, после стандартных заклинаний, в них можно делать DMA), но это не способ выделения памяти.

> Правда в 2.4 такой функции кажется нет.

Нет. Там kiobuf & Co, ЕМНИП.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Да, конечно, память выделяется в юзерспэйсе предварительно. Спасибо за разъяснения, пока оставлю эту часть как есть.

P.S. ЕМНИП - это что такое? :)

karak
() автор топика

Для выделения больших объемов непрерывной физической памяти можно использовать патч bigphysarea. Он есть для 2.6.xx

tim239 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.