需要以指定的方式分配物理内存并将其用于DMA(X86_64 linux系统)

时间:2018-03-14 09:33:49

标签: memory-management linux-device-driver dma

enter image description here

我是linux驱动程序编程的新手。

我想使用任何一个用红色阴影的物理内存区域进行测试。(即3.7GB-4.3Gb或7.7或8.3GB,基本上内存区域应该越过4GB边界)。该存储器将用于从/到PCI适配器的DMA。

我的想法是:

1)使用内核引导线" memmap"在引导时保留物理内存的所需部分。
2)使用ioremap获取虚拟地址并将其传递给dma_map_single
3)使用" dma_map_single"得到dma公共汽车把手
4)使用" dma_declare_coherent_memory"使用DMA_EXCLUSIVE标志从我们从步骤2和步骤3获得的地址设置dma存储器 5)设置" dma_set_mask_and_coherent"对于64位只是因为。
6)如果上述步骤成功,那么所有" dma_alloc_coherent"将记录我们期望的地区。这样我们就可以测试我们的场景了。

如果上述想法有效,或者我们的理解是错误的,请告诉我们。如果还有其他方法,请指出我们。
当前状态: 由于在大多数系统中保留了3.7GB到4GB,我不得不使用7.7GB-8.3GB或11.7到12.3GB的区域。
Dmesg系统输出:

BIOS提供的物理RAM映射:  BIOS-e820:0000000000000000 - 0000000000099000(可用)
 BIOS-e820:0000000000100000 - 00000000cd2f0000(可用)
 BIOS-e820:00000000cd2f0000 - 00000000cd31c000(保留)
 BIOS-e820:00000000cd31c000 - 00000000cd35b000(ACPI数据)
 BIOS-e820:00000000cd35b000 - 00000000d0000000(保留)
 BIOS-e820:00000000e0000000 - 00000000f0000000(保留)
 BIOS-e820:00000000fe000000 - 0000000100000000(保留)
 BIOS-e820:0000000100000000 - 0000000430000000(可使用)

我尝试使用以下内核启动选项来执行此操作   MEMMAP =" 60M $ 0x1be200000" <<储备60MB从地址7.7GB开始

如果我尝试这样做,我会看到内核恐慌。所有系统服务器都有超过10GB的内存。


如果我错过了什么,请告诉我。

0 个答案:

没有答案