Пишу драйвер для передачи данных с памяти на плате через шину PCI express и запись в файл, Стандартное считывание было с медленной скоростью, поэтому решил делать через DMA-функции, Нашел в интернете следующий текст: ----------------------------- Dynamic DMA Mapping
Direct memory access in Linux for AMD64 technology requires the use of the dynamic DMA mapping API. This API provides a way to efficiently map 64-bit physical addresses to 32-bit Single Address Cycle PCI addresses, so that hardware that only supports 32-bit accesses can be used in 64-bit systems. A full description of the dynamic DMA mapping API is beyond the scope of this document. Device driver developers who need to use DMA should read DMA-mapping.txt in the /usr/src/linux/Documentation directory. ------------------------------ Нашел у себя эту документацию и прочитал. Там было написано что главным является добавление #include <linux/pci.h>
Код программы: ---------------------------- #include <linux/pci.h> #include <pci/pci.h> #include <stdio.h> #include <sys/mman.h> int main (int argc, char *argv[]) { struct pci_dev *dev; u64 device_mask; struct pci_dev *pdev; int pci_dma; int pci_consistent; pci_dma = pci_set_dma_mask(*pdev, device_mask); pci_consistent = pci_set_consistent_dma_mask(*pdev, device_mask);
return 0;
} ------------------------------ # gcc -o beta beta.c -lpci -lz beta.c:(.text+0xa4): undefined reference to `pci_set_dma_mask' beta.c:(.text+0xec): undefined reference to `pci_set_consistent_dma_mask' collect2: ld returned 1 exit status ------------------------------- Вот что выдал компилятор, Тоесть эти функции в pci.h не определены, Поискал на компьютере заголовочные файлы содержащие эти функции; >> Выяснилось что функции DMA описаны в следующих файлах: /usr/src/linux-source-2.6.22/include/linux/PCI.h /usr/src/linux-headers-2.6.22-14-generic/include/linux/PCI.h /usr/src/linux-headers-2.6.22-14/include/asm-generic/pci-dma-compat.h /usr/src/linux-headers-2.6.22-14/include/asm-generic/dma-mapping.h /usr/src/linux-source-2.6.22/include/asm-i386/dma-mapping.h /usr/src/linux-source-2.6.22/include/asm-i386/pci.h -------------------------------- Теперь суть проблемы: стандарно #include </usr/src/linux-source-2.6.22/include/asm-i386/dma-mapping.h> dma-mapping.h добавить нельзя, потамучто внутри него прописаны другие заголовки типа такого:
dma-mapping.h source: ................................. #include <asm/cache.h> #include <asm/io.h> #include <asm/scatterlist.h> #include <asm/bug.h> .................................
которые компилятор уже не найдет, а внутри этих прописаны следющие и так до бесконечности, ------------------------------------------------------------------------------- ------------------------------
Вопросы:
1) Есть ли какой-то способ добавить эти заголовки внутри кода программы или при компиляции? 2) Если нужно для этого написать специальный Makefile какой может быть простой пример для компиляции программы и автоматического добавления заголовочных файлов?
Старался изложить как можно подробнее суть проблемы, Жду ответов, заранее благодарен за помощь спецам!