Содержание
KnIoMapMem()
Функция объявлена в файле 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;
}