Вам нужно беспокоиться об использовании физически смежной памяти, если к буферу будет обращаться устройство DMA по шине с физическим адресом (например, PCI). Проблема в том, что многие системные вызовы не имеют возможности узнать, будет ли их буфер в конечном итоге передан на устройство DMA: как только вы передадите буфер в другую подсистему ядра, вы действительно не сможете знать, куда он пойдет. Даже если ядро сегодня не использует буфер для DMA , может сделать будущая разработка.
vmalloc часто медленнее, чем kmalloc, поскольку может потребоваться перераспределить пространство буфера в практически непрерывный диапазон. kmalloc никогда не перераспределяется, хотя, если не вызывается с помощью GFP_ATOMIC, kmalloc может блокировать.
kmalloc ограничен размером буфера, который он может предоставить: 128 КБ *) . Если вам нужен действительно большой буфер, вы должны использовать vmalloc или какой-то другой механизм, например резервирование большого объема памяти при загрузке.
*) Это было верно для более ранних ядер. В последних ядрах (я проверял это на 2.6.33.2) максимальный размер одного kmalloc составляет до 4 МБ! (Я написал довольно подробный пост об этом .) & Mdash; kaiwan
Для системного вызова вам не нужно передавать GFP_ATOMIC в kmalloc (), вы можете использовать GFP_KERNEL. Вы не обработчик прерываний: код приложения входит в контекст ядра посредством ловушки, это не прерывание.