Обратите внимание, что теперь это возможно через/proc/[pid]/pagemap
Ответ 3
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(). Но из пользовательского пространства вы не можете получить к нему доступ напрямую. предположим, что ваш драйвер или модули ядра хотят получить доступ к этому физическому адресу, это лучший способ. Обычно драйверы с отображением карты памяти используют эту функцию для сопоставления регистров с виртуальной памятью.
Ответ 4
Что-то вроде этого в C., если вы опросите аппаратный регистр, убедитесь, что вы добавили объявления volatile, чтобы компилятор не оптимизировал вашу переменную.
#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;
}