Содержание
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
– длина последовательности.
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
, и возвращают прочитанное значение.
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
- длина последовательности.
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
.
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;
}
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()
.