DMA_ALLOC_COHERENT () Speicher -Remap an UserSpace über MMAPLinux

Linux verstehen
Anonymous
 DMA_ALLOC_COHERENT () Speicher -Remap an UserSpace über MMAP

Post by Anonymous »

Ich arbeite an einem Linux-Kernel-Treiber, der den Speicher mit DMA_ALLOC_COHERENT () zuordnet und mit MMAP dem Benutzerspeicher ordnet. (5.14.0-503.34.1.el9_5.x86_64), der Benutzerspace sieht beim Lesen des Speicherbereichs nur 0xffffff-obwohl der MMAP () sich ohne Fehler erfolgreich ist. Wenn Sie den Speicherinhalt von der Kernel-Seite inspizieren, ist es wie erwartet Null gefüllt.u8 *cpu_addr = dma_alloc_coherent(&pdev->dev, len, &dma_handle, GFP_KERNEL);
< /code>
Dann in der MMAP -Implementierung: < /p>
int my_mmap(struct file *file, struct vm_area_struct *vma){

switch(vma->vm_pgoff) {

case MMAP_COMEM:
ret = mmap_kvirt_mem(vma, cpu_addr); //cpu vaddr returned from dma_alloc_coherent
break;
< /code>
und die Speicher -Remapping -Funktionen: < /p>
static int mmap_kvirt_mem(struct vm_area_struct *vma, unsigned long ptr) {
unsigned long paddr = virt_to_phys((void *)ptr);

unsigned long pfn = paddr >> PAGE_SHIFT;
size_t size = vma->vm_end - vma->vm_start;

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); //suggested by chatgpt

if (remap_pfn_range(vma, vma->vm_start, pfn, size, vma->vm_page_prot)) {
pr_err("remap_pfn_range() failed\n");
return -EAGAIN;
}

return 0;
}
< /code>
Aus dem Benutzerspeicher rufe ich mmap () auf dem Treiber auf und greife dann über den zurückgegebenen Zeiger auf den Speicher auf den Speicher. Ich vermute also:

[*] Auf die falsche physische Adresse hinweist
, die stillschweigend fehlschlägt, aber einen gültigen Zeiger zurückgibt. /> < /ul>
Genau der gleiche Code funktioniert ohne Probleme auf Kernel 4.18 ... < /p>
ist virt_to_phys () immer noch ein zuverlässiger Weg, um die physikalische Adresse eines DMA_Allloc_Alloc_coherent () -Puffer auf dem neuesten Kernel zu erhalten. Dies?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post