LINUX.ORG.RU

Вот никак со страницами не разберусь


0

0

Размер страницы - 4КБайта.
Например, надо принять по DMA - 40КБайт, т.е. 10 страниц.
Выделяю память:
dma_addr = (unsigned int*)pci_alloc_consistent(dev[LID], 40000,(dma_addr_t*) &dma_buff_phys);
Резервирую страницы:
start_page_addr = virt_to_page(dma_addr);
for(i=0;i<10;i++) {
SetPageReserved(start_page_addr+i);
}

Принимаю. Все вроде нормально.
Сейчас освобождаю память:
ClearPageReserved(start_page_addr);
pci_free_consistent((struct pci_dev *)dev, 40000, dma_addr, dma_buff_phys);
Вот тут начинаются чудеса всякие: в /var/log'e лезут сообщения ошибки,
модуль не выгружается и т.д.
Короче я явно что-то не так делаю. Научите плз. как правильно выделять и освобождать память...


Ответ на: комментарий от idle

Если сделаю так: for(i=0;i<10;i++){ ClearPageReserved(start_page_addr+i); }

То какие-то сообщения лезут типа page fault, причем прям в консоле, наверное какой-то федоровский (FC4) мессенджер.

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

Ты пошутил, или правда думаешь, что десять страниц по 4КБайта это 40000 байт?

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

Точнее - 40960 Байт. А по-твоему (2^12)*10 - сколько будет. Ну может страницы как-то не так считаются...

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

> То какие-то сообщения лезут типа page fault

ну вот и разберитесь с этим

> наверное какой-то федоровский (FC4) мессенджер.

не, это printk

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

> не, это printk

не, это не printk. В иксах printk на иксовый терминал не выводится, смотрю в /var/log'e... Выскакивает иксовое окошечко с надписями (просто я ща это повторить не могу, поэтому что написано не скажу), а в терминале тож сообщения лезут типа что-то со страницей, перегрузитесь. Вот такая вот фигня. Лан буду разбираться...

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

>В иксах printk на иксовый терминал не выводится

Это от настроек сислога зависит наверное.

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

> Точнее - 40960 Байт.

Тебя не смущает, что ты используешь больше памяти, чем аллокируешь?

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

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

Т.к. память выделяется страницами, а не байтами, то при запросе 40000 байт мне выделиттся - 40960 байт. И какие проблемы ?

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

> Т.к. память выделяется страницами, а не байтами, то при запросе 40000 байт мне выделиттся - 40960 байт. 

В начале pci_alloc_consistent
действительно совершается такое действие

size = PAGE_ALIGN(size);
перед kmalloc

Однако я не уверен, что это проделывается во всех ядрах
и для всех архитектур.

> И какие проблемы ?

Если это делается в твоей версии ядра, то никаких
(разумеется, пока ошибка не дошла до размеров страницы).

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

> (разумеется, пока ошибка не дошла до размеров страницы).

Вот не понял на счет ошибки. Вследствии страничного выделения я получу всегда больше, чем надо, если конечно ровно небудет. Например, если мне нужно 4097 байт, то будет выделено 8192 байт (2 страницы), а много - не мало. Так что какая ошибка ????

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

> Вследствии страничного выделения я получу всегда больше

Я плохо понимаю про страничное выделение. Для прикладной программы, естественно, ни о каких страницах речь не идет, а как дело обстоит в твоем случае я просто не знаю.

> Так что какая ошибка

Если тебе понадобится 43 страницы, и ты попросишь 43*4000 байтов, то тебе дадут 42 страницы.

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

Мне не понадобится 43 страницы :))) Мне понадобится 43*4000 байт!!! А ядро спокойно выделит 42 страницы.

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