Доступ к памяти из userspace

Доступ к памяти из юзерспейса linux’a может понадобиться для доступа к axi-регистрам, к целому куску физической памяти или чего-нибудь еще.

Существует как минимум два способа:

  1. использование /dev/mem
  2. использование userspace i/o

Преимуществом первого способа является то, что дополнительно ничего делать не нужно, доступно все адресное пространство. Это же является и недостатком — одно неосторожное действие с указателем и мы изменили чужой кусок памяти.

Поэтому буду рассматривать второй способ. Во-первых, необходимо включить драйвер ядра: CONFIG_UIO=y и CONFIG_UIO_PDRV_GENIRQ=y. Во-вторых, в dts-файл добавить примерно следующее:

regs@43c00000 {
compatible = "generic-uio";
reg = <0x43c00000 0x1000>;

, где 0x43c00000 — адрес нужного куска в физическом адресном пространстве (в данном случае это axi-регистры), а 0x1000 — длина.

После сборки ядра и загрузки linux’a должно появиться устройство /dev/uio0, для работы с которым нужен следующий код:

const unsigned int _MAP_SIZE = 0x1000;
int fd;
fd = open("/dev/uio0", O_RDWR);
if (fd < 1)
{
    return -1;
}
ptr = mmap(NULL, _MAP_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
{
    return -1;
}

//делаем все что нужно

munmap(ptr,_MAP_SIZE);
close(fd);
Плюсануть
Поделиться

,
Вступление ← ctrl → OpenVPN и NetworkManager