Saturday 1 February 2014

Mapping physical addresses to virtual address linux

I am working on a small embedded system. When my linux boots up into user space, I know where are my devices in the physical memory. I want to map them into user space virtual addresses. Currently, I am doing it through a kernel module. I use vmalloc/kmalloc (depending on the size) and then I use ioremap_page_range on that returned virtual addresses to map my physical addresses. I dont think that is the correct way to go about. First of all I am allocating memory and then I am asking kernel to remap that virtual address space to some different physical address space. (Initially mapped physical->virtual in vmcall/kmalloc is kinda useless as I dont care about those physical pages. This is definitely not good.)
Instead of this is there a better way to map the known physical memory into user space process. (I know other than my user space process, no one gonna touch that memory.)
Answers:-

What you are trying to do is accessing what is called IO memory. I can only encourage you to read theLinux Device Drivers (LDD) book and more specifically the chapter 9.
To "allocate" such an area, you need to call struct resource *request_mem_region(unsigned long start, unsigned long len, char *name). Before your driver can access it, you have to assign it a virtual address, this is done with a call to void *ioreamp(unsigned long phys_addr, unsigned long size).
To ensure that your driver will then work on different architectures/platforms, be sure to use some accessor function to such areas ( ioread8/16/32 or iowrite8/16/32 and all of their variants).

0 comments:

Post a Comment

Twitter Delicious Facebook Digg Stumbleupon Favorites More