我有Linux和我有一个物理地址:(即0x60000000)。
我想从用户空间的Linux程序读取这个地址。
这个地址可能在内核空间中。
您需要一个内核驱动程序将物理地址导出到用户级别。
看看这个驱动程序: https : //github.com/claudioscordino/mmap_alloc/blob/master/mmap_alloc.c
请注意,这现在可以通过/ proc / [pid] / pagemap来实现
Is there an easy way I can do that?
为了从用户空间访问, mmap()
是一个不错的解决方案。
Is it possible to convert it by using some function like "phys_to_virt()"?
物理地址可以使用ioremap_nocache()映射到虚拟地址。 但是从用户空间,你不能直接访问它。 假设你的驱动程序或者内核模块想访问那个物理地址,这是最好的方法。 通常内存映射的设备驱动程序使用此函数将寄存器映射到虚拟内存。
如果你在轮询一个硬件寄存器,像这样的东西,确保你添加挥发性声明,所以编译器不会优化你的变量。
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <memory.h> volatile int *hw_mmap = NULL; /*evil global variable method*/ int map_it() { /* open /dev/mem and error checking */ int i; int file_handle = open(memDevice, O_RDWR | O_SYNC); if (file_handle < 0) { DBG_PRINT("Failed to open /dev/mem: %s !\n",strerror(errno)); return errno; } /* mmap() the opened /dev/mem */ hw_mmap = (int *) (mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, file_handle, 0x60000000)); if(hw_mmap ==(void*) -1) { fprintf(stderr,"map_it: Cannot map memory into user space.\n"); return errno; } return 0; }
现在你可以读取写入hw_mmap。