KasperskyOS Community Edition 1.1
[Topic libkos_mmio]

IoReadMmBuffer8(), IoReadMmBuffer16(), IoReadMmBuffer32()

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

void IoReadMmBuffer8(volatile rtl_uint8_t *baseReg, rtl_uint8_t *dst,

rtl_size_t cnt);

void IoReadMmBuffer16(volatile rtl_uint16_t *baseReg, rtl_uint16_t *dst,

rtl_size_t cnt);

void IoReadMmBuffer32(volatile rtl_uint32_t *baseReg, rtl_uint32_t *dst,

rtl_size_t cnt);

Функции вычитывают последовательность одно-, двух- или четырехбайтовых значений соответственно из регистра, отображаемого по адресу baseReg, и записывают значения в массив dst. cnt – длина последовательности.

В начало
[Topic io_read_mm_buffer]

IoReadMmReg8(), IoReadMmReg16(), IoReadMmReg32()

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

rtl_uint8_t IoReadMmReg8(volatile void *reg);

rtl_uint16_t IoReadMmReg16(volatile void *reg);

rtl_uint32_t IoReadMmReg32(volatile void *reg);

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

В начало
[Topic io_read_mm_reg]

IoWriteMmBuffer8(), IoWriteMmBuffer16(), IoWriteMmBuffer32()

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

void IoWriteMmBuffer8(volatile rtl_uint8_t *baseReg, const rtl_uint8_t *src,

rtl_size_t cnt);

void IoWriteMmBuffer16(volatile rtl_uint16_t *baseReg, const rtl_uint16_t *src,

rtl_size_t cnt);

void IoWriteMmBuffer32(volatile rtl_uint32_t *baseReg, const rtl_uint32_t *src,

rtl_size_t cnt);

Функции записывают последовательность одно-, двух- или четырехбайтовых значений соответственно из массива src в регистр, отображаемый по адресу baseReg. cnt - длина последовательности.

В начало
[Topic io_write_mm_buffer]

IoWriteMmReg8(), IoWriteMmReg16(), IoWriteMmReg32()

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

void IoWriteMmReg8(volatile void *reg, rtl_uint8_t data);

void IoWriteMmReg16(volatile void *reg, rtl_uint16_t data);

void IoWriteMmReg32(volatile void *reg, rtl_uint32_t data);

Функции записывают одно-, двух- или четырехбайтовое значение data в регистр, отображаемый по адресу reg.

В начало
[Topic io_write_mm_reg]

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;

}

В начало
[Topic kn_io_map_mem]

KnRegisterPhyMem()

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

Retcode KnRegisterPhyMem(rtl_uint64_t addr, rtl_size_t size, Handle *outRid);

Функция регистрирует участок памяти размером size байт с началом по адресу addr.

В случае успешной регистрации дескриптор, назначенный участку памяти, будет передан в параметр outRid, а функция вернет rcOk.

Адрес addr должен быть странично-выровненным, а размер size должен быть кратен размеру страницы.

Пример использования – см. KnIoMapMem().

Если участок памяти больше не используется, его необходимо освободить с помощью функции KnIoClose().

В начало
[Topic kn_register_phy_mem]