Подтвердить что ты не робот

Преобразование физического адреса в виртуальный в Linux и чтение его содержимого

У меня есть Linux, и у меня есть физический адрес: (т.е. 0x60000000).
Я хочу прочитать этот адрес из пользовательской программы Linux.

Этот адрес может находиться в ядре.

4b9b3361

Ответ 2

Обратите внимание, что теперь это возможно через/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;
}

Теперь вы можете читать запись в hw_mmap.