В pcie драйвере вызвал функцию pci_alloc_consistent(). Благодаря этому получил два адреса - один виртуальный адрес ядра, другой - физический адрес. Физический адрес сообщил в плис. Плис пишет данные по этому адресу, выставляет прерывание. В обработчике прерывания печатаю содержимое буфера с виртуальным адресом. Вижу свои данные, все работает.
Вопрос 1. Функция pci_alloc_consistent завершается удачно, если размер запрашиваемого буфера не превышает 4 МБайт. С чем это связано, почему не удаётся получить 8 и больше МБайт?
Вопрос 2. Можно ли замапить виртуальный буфер ядра в пространство пользователя? Это вообще возможно? Как я понимаю, физическая память линейна и поделена на траницы. Эти страницы отображаются в виртуальную память в произвольном порядке. Вызвав функцию pci_alloc_consistent, я зарезервировал большое количество подряд идущих страниц физической памяти и отобразил их в виртуальной памяти. В виртуальной памяти пользователя свой порядок страниц, это меня и напрягает, получится ли просто замапить виртуальный буфер ядра в виртуальный буфер пользователя, у пользователя как то тоже нужно пересортировать страницы, чтобы они в линию выстроились в физической памяти.
|