KnIoMapMem()

02 августа 2023

ID kn_io_map_mem

Функция объявлена в файле coresrv/io/mmio.h.

Retcode KnIoMapMem(Handle rid, rtl_uint32_t prot, rtl_uint32_t attr,

void **addr, Handle *handle);

Функция отображает зарегистрированный участок памяти, которому назначен дескриптор rid, на адресное пространство процесса.

С помощью входных параметров prot и attr можно изменить атрибуты защиты участка памяти, а также отключить кэширование.

Выходные параметры:

  • addr – указатель на адрес начала участка виртуальной памяти;
  • handle – дескриптор участка виртуальной памяти.

Функция возвращает rcOk в случае успеха.

prot – атрибуты защиты участка памяти через MMU, возможные значения:

  • VMM_FLAG_READ – разрешено чтение;
  • VMM_FLAG_WRITE – разрешена запись;
  • VMM_FLAG_READ | VMM_FLAG_WRITE – разрешены чтение и запись;
  • VMM_FLAG_RWX_MASK или VMM_FLAG_READ | VMM_FLAG_WRITE | VMM_FLAG_EXECUTE – полный доступ к участку памяти (эти записи эквивалентны).

attr – атрибуты участка памяти, возможные значения:

  • VMM_FLAG_CACHE_DISABLE – отключить кэширование;
  • VMM_FLAG_LOW_GUARD и VMM_FLAG_HIGH_GUARD – добавление защитной страницы перед и после выделенной памяти соответственно;
  • VMM_FLAG_ALIAS – флаг указывает, что участок памяти может иметь несколько виртуальных адресов.

Пример

static Retcode MemInit(IOMem *resource)

{

Retcode rc = rcFail;

rc = KnRegisterPhyMem(resource->base,

resource->size,

&resource->handle);

if (rc == rcOk)

rc = KnIoMapMem(resource->handle,

VMM_FLAG_READ | VMM_FLAG_WRITE,

VMM_FLAG_CACHE_DISABLE,

(void **) &resource->addr, &resource->permitHandle);

if (rc == rcOk)

resource->addr = ((rtl_uint8_t *) resource->addr

+ resource->offset);

return rc;

}

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!