LINUX.ORG.RU

Сообщения ksanto

 

Выделение больших объемов (>4GiB) невыгружаемой памяти в приложении

Форум — Development

Здравствуйте! Есть задача выделения большого буфера (4-48GiB) памяти для приложения, который не будет выгружаться (аналог NonPagedPool из Windows). Как я понимаю, из приложения этого можно достичь путем обычного выделения памяти (malloc()) + mlock(). Но при очередном перезапуске приложения может случиться так, что не всю память удастся выделить.Поэтому было решено использовать память, получаемую из драйвера.

Решение на мой взгляд выглядит таким образом:

-выделение в драйвере при загрузке ОС памяти с помощью __get_free_pages(GFP_KERNEL) или kmalloc(GFP_KERNEL);

-SetPageReserved();

-mmap() памяти из приложения.

Есть следующие вопросы:

1.В этом случае получается гарантированно невыгружаемая память?

2.Флага GFP_KERNEL достаточно? Нет необходимости во флаге __GFP_HIGHMEM? Речь идет о x86-64 (кстати, где в x86-64 граница Low и High Memory ядре?).

3.Нет ли ограничений на mmap() больших объемов памяти в пользовательское приложение?

4.Можно ли аналогичное решение применить для x86+PAE? Что нужно изменить?

Возможно, это не самый короткий путь. Если есть варианты, предлагайте, пожалуйста.

ksanto
()

Driver initialization parameters

Форум — General

Вопрос по написанию драйверов Linux: как передать в драйвер какие-либо параметры инициализации?

Ситуация такова: есть PCI драйвер, он загружается ядром по наличию в машине определенного PCI устройства (идентификаторы обслуживаемых устройств занесены в modules.pcimap). Нужно, чтобы на одной машине этот драйвер получал(откуда-то читал) при загрузке одно число, а на другой машине другое (или набор параметров). И чтобы была возможность настройки этих параметров пользователем (вступать в силу они будут после перезагрузки).

В LDD3 описан способ передачи с помощью module_param(), но он используется в случае загрузки драйвера через insmod/modprobe (я не знаю, как его использовать в таком случае загрузки драйвера). Ну и в общем вопрос: есть ли в Linux место, где могут храниться настройки драйверов (тут вспоминается реестр из Windows), и как из драйвера реализуется доступ к этому месту?

Спасибо.

ksanto
()

Команда file. Файл magic.mgc

Форум — General

Для работы команды файл file используется файл /usr/share/misc/magic.mgc (или здесь /usr/share/file/magic.mgc). Я использую ОС собранную с помощью buildroot для микроконтроллера AVR32. Вопрос: можно ли без последствий удалить файл magic.mgc, если я и мои приложения не используют команду file? Используется ли file когда-либо самой ОС? Я попробовал это сделать: удаление не повлияло на работоспособность ОС. Хотелось узнать нет, ли каких-либо подводных камней при этом.

P.S. Файл занимает 1,7Мб при том, что вся ОС вместе с ним занимает 5,9Мб. Хотелось освободить драгоценное место на флешке весьма ограниченного объема (8Мб).

ksanto
()

DMA (bus master) buffer from user-space.

Форум — Development

Здравствуйте!

Есть задача: для 1-4 PCI плат выделить по 64Mб непрерывной памяти, иметь доступ к каждому из блоков этой памяти из user-space и его физический адрес для передачи соотвествующей плате. ОС: Ubuntu 11.01 x86 Kernel 3.0.0-12-generic.

Блоки памяти могут выделяться кусочно (сейчас необходимо сделать по 2 банка 32Мб для каждой платы, но хорошо бы иметь возможность изменять объем банков и их количество).

Я предполагаю, что необходимо делать это с помощью функции dma_alloc_coherent(), из которой будет получаться dma_addr_t* - физический адрес, который можно передать в устройство, и указатель на памяти в kernel-space. Далее этот указатель отправляется в user-space с помощью mmap().

Возможно, можно выбрать для выделения памяти kmalloc() с необходимыми флагами, а физический адрес получить из полученного указателя с помощью дополнительных функций.

Вопрос: какими средствами лучше сделать эту операцию, чем выделать память? Как лучше отправить указатель на выделенную память в user-space (с учетом того, что банков памяти может быть много и нужно иметь указатель на каждый из них)?

Спасибо.

ksanto
()

Remap PCI memory в user-space

Форум — Development

Здравствуйте!

Подобный вопрос уже поднимался в этой теме: remap PCI memory в user-space Но варианты предложенные там не работают в моем случае. Опишу ситуацию: пишу драйвер для PCI плат, ОС: Ubuntu 11.04 x86_64 Kernel 2.6.38-8-generic.

Для каждой из плат нормальным порядком получаются ресурсы: через pci_resource_start(dev,0) и pci_resource_len (dev, 0) (меня интересует в первую очередь BAR0). Далее необходимо сделать remap в user-space. В первую очередь для проверки правильности получения ресурсов выполняю функцию ioremap_nocache(pci_resource_start(dev,0),pci_resource_len (dev, 0)), на выходе которой получаю указатель, по которому в kernel-space читаются адекватные значения (ресурсы получены правильно). Далее необходимо реализовать mmap. В указанной теме используется такой вариант:

addr = pci_resource_start(dev->pdev, bar);

pfn = virt_to_phys(bus_to_virt(addr)) >> PAGE_SHIFT;

Не работает. Если вывести адреса, получаемые во всех функциях, получается следующее (это для примера):

Resourse start: 0x90104A00

ioremap_nocache: 0xFFFFC90008B9AA00

bus_to_virt: 0xFFFF880090104A00

virt_to_phys(bus_to_virt()): 0x90104A00

Т.е. после конструкции virt_to_phys(bus_to_virt()) получается то же значение. (что не выполняет правильно mmap).

Я пробовал выполнить вариант mmap того адреса, что получается из ioremap_nocache:

pfn = ioremap_nocache >> PAGE_SHIFT;

Тоже на работает. Еще загвоздка в том, что длина получаемых ресурсов равна 0x80, тогда как mmap выполняется минимум для PAGE_SIZE = 0x1000. Вопросы: как выполнить mmap адреса, получаемого после ioremap_nocache и работает ли это для длин не кратных PAGE_SIZE (как я понимаю нет, но существует ли другой способ отправить полученный адрес в user-space)?

Благодарю.

ksanto
()

RSS подписка на новые темы