On a ARM based system running Linux, I have a device that's memory mapped to a physical address. From a user space program where all addresses are virtual, how can I read content from this address?
相关问题
- What uses more memory in c++? An 2 ints or 2 funct
- Is shmid returned by shmget() unique across proces
- how to get running process information in java?
- Memory for python.exe on Windows 7 python 32 - Num
- Error building gcc 4.8.3 from source: libstdc++.so
busybox devmem
busybox devmem
is a tiny CLI utility that mmaps/dev/mem
.You can get it in Ubuntu with:
sudo apt-get install busybox
Usage: read 4 bytes from the physical address
0x12345678
:Write
0x9abcdef0
to that address:Source: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
mmap
MAP_SHARED
When mmapping
/dev/mem
, you likely want to use:MAP_SHARED
makes writes go to physical memory immediately, which makes it easier to observe, and makes more sense for hardware register writes.CONFIG_STRICT_DEVMEM
andnopat
To use
/dev/mem
to view and modify regular RAM on kernel v4.9, you must fist:CONFIG_STRICT_DEVMEM
(set by default on Ubuntu 17.04)nopat
kernel command line option for x86IO ports still work without those.
See also: mmap of /dev/mem fails with invalid argument for virt_to_phys address, but address is page aligned
Cache flushing
If you try to write to RAM instead of a register, the memory may be cached by the CPU: How to flush the CPU cache for a region of address space in Linux? and I don't see a very portable / easy way to flush it or mark the region as uncacheable:
So maybe
/dev/mem
can't be used reliably to pass memory buffers to devices?This can't be observed in QEMU unfortunately, since QEMU does not simulate caches.
How to test it out
Now for the fun part. Here are a few cool setups:
volatile
variable on an userland process/proc/<pid>/maps
+/proc/<pid>/pagemap
devmem
, and watch the userland process reactkmalloc
virt_to_phys
and pass it back to userlanddevmem
devmem
to write to the registerprintf
s come out of the virtual device in responseBonus: determine the physical address for a virtual address
Is there any API for determining the physical address from virtual address in Linux?
You can map a device file to a user process memory using
mmap(2)
system call. Usually, device files are mappings of physical memory to the file system. Otherwise, you have to write a kernel module which creates such a file or provides a way to map the needed memory to a user process.Another way is remapping parts of /dev/mem to a user memory.
Edit: Example of mmaping /dev/mem (this program must have access to /dev/mem, e.g. have root rights):