Messages in this thread | ![/](/images/icornerl.gif) | | Date | Mon, 8 Dec 2003 16:07:13 +0100 (CET) | From | moi toi <> | Subject | Physical address |
| |
Hi
I am a newbie in the development of Linux driver. I have some difficulties to understand how the memory management works.
I am working on a Pentium IV ( 512M of RAM), with the Red Hat 9.0. I want to create buffers in the RAM which are available for DMA transfer, and I want that process can map them.
I reserve at boot time some space in the RAM (mem=400M). And then I remap a buffer into the driver with the following command:
>unsigned long Ram_Buffer_addr; >#define POSITION 0x19000000 //400*1024*1024=400M >#define SIZE 8*1024 > >Ram_Buffer_addr = (unsigned long) ioremap (POSITION, SIZE);
The addresses of the buffer are the following: Ram_Buffer_addr = 0xD9DCB000 Virt_to_phys(Ram_Buffer_addr) = 0x19DCB000 Virt_to_bus(Ram_Buffer_addr) = 0x19DCB000
The virtual address is of course different from the physical address, and the physical address and the bus address are the same, because I m working on a PC. But I don t understand why the physical address is different from the one I gave to the function ioremap.
I did a second test: I change the position of the buffer instead of taking it at the address 0x19000000, the buffer start at the address: 0x1f400000 (500M).
>unsigned long Ram_Buffer_addr; >#define POSITION 0x1F400000 //500*1024*1024=500M >#define SIZE 8*1024 > >Ram_Buffer_addr = (unsigned long) ioremap (POSITION, SIZE);
The addresses of the buffer are the following: Ram_Buffer_addr = 0xD9DCB000 Virt_to_phys(Ram_Buffer_addr) = 0x19DCB000 Virt_to_bus(Ram_Buffer_addr) = 0x19DCB000
The addresses are exactly the same. I m ok for the virtual addresses, but it sounds pretty weird for the physical and bus addresses, they shouldn t be the same than in the first test.
---------------------------------------------------------------------- When I map the buffer from a process, I use the virtual address of the buffer with the function mmap, but in the mmap call-back function in the driver, I use the true physical address with the function: remap_page_range( vma, vma->vm_start, POSITION,(vma->vm_end - vma->vm_start), (pgprot_t) vma->vm_page_prot); And it seems work! But if instead of POSITION, I set Virt_to_phys(Ram_Buffer_addr), it doesn t work anymore.
Does that mean that the functions virt_to_phys and virt_to_bus don t work on virtual addresses? Does anyone know, how to get the real physical address of the buffer.
Thanks
Francois.
____________________________________________________________________________________ Do You Yahoo!? -- Avec Yahoo! soyez au coeur de la récolte de dons pour le Téléthon. http://fr.promotions.yahoo.com/caritatif/ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| ![\](/images/icornerr.gif) |