Direct Memory Access in Linux

前端 未结 5 2034
时光取名叫无心
时光取名叫无心 2020-11-30 20:12

I\'m trying to access physical memory directly for an embedded Linux project, but I\'m not sure how I can best designate memory for my use.

If I boot my device regul

5条回答
  •  离开以前
    2020-11-30 20:55

    I think you can find a lot of documentation about the kmalloc + mmap part. However, I am not sure that you can kmalloc so much memory in a contiguous way, and have it always at the same place. Sure, if everything is always the same, then you might get a constant address. However, each time you change the kernel code, you will get a different address, so I would not go with the kmalloc solution.

    I think you should reserve some memory at boot time, ie reserve some physical memory so that is is not touched by the kernel. Then you can ioremap this memory which will give you a kernel virtual address, and then you can mmap it and write a nice device driver.

    This take us back to linux device drivers in PDF format. Have a look at chapter 15, it is describing this technique on page 443

    Edit : ioremap and mmap. I think this might be easier to debug doing things in two step : first get the ioremap right, and test it using a character device operation, ie read/write. Once you know you can safely have access to the whole ioremapped memory using read / write, then you try to mmap the whole ioremapped range.

    And if you get in trouble may be post another question about mmaping

    Edit : remap_pfn_range ioremap returns a virtual_adress, which you must convert to a pfn for remap_pfn_ranges. Now, I don't understand exactly what a pfn (Page Frame Number) is, but I think you can get one calling

    virt_to_phys(pt) >> PAGE_SHIFT
    

    This probably is not the Right Way (tm) to do it, but you should try it

    You should also check that FOO_MEM_OFFSET is the physical address of your RAM block. Ie before anything happens with the mmu, your memory is available at 0 in the memory map of your processor.

提交回复
热议问题