KasperskyOS Community Edition 1.3

Ввод-вывод через память (mmio.h)

API определен в заголовочном файле sysroot-*-kos/include/coresrv/io/mmio.h из состава KasperskyOS SDK.

API предназначен для работы с памятью MMIO. Память MMIO – это физические адреса, на которые отображены регистры и память устройств. (Для адресации физической памяти и доступа к регистрам и памяти устройств используются части одного пространства физических адресов.)

Сведения о функциях API приведены в таблице ниже.

Использование API

Типовой сценарий использования API включает следующие шаги:

  1. Регистрация региона памяти MMIO, соответствующего устройству, с которым нужно работать.

    Чтобы выполнить этот шаг, нужно вызвать функцию KnRegisterPhyMem().

    Дескриптор региона памяти MMIO можно передать другому процессу через IPC.

  2. Отображение региона памяти MMIO на память процесса.

    В один момент времени регион памяти MMIO может быть отображен только на один регион виртуальной памяти только одного процесса. (В разные моменты времени регион памяти MMIO может отображаться на виртуальную память разных процессов, владеющих дескриптором этого региона.) В результате отображения процесс получает доступ к региону памяти MMIO на чтение и/или запись.

    Чтобы зарезервировать регион виртуальной памяти и отобразить на него регион памяти MMIO, нужно вызвать функцию KnIoMapMem().

    Дескриптор, полученный при вызове функции KnIoMapMem(), нельзя передать другому процессу через IPC.

  3. Чтение данных из региона памяти MMIO и запись данных в него через память процесса.

    8-, 16- и 32-битные слова, считанные из региона памяти MMIO или записанные в него, представляют собой значения регистров устройства или содержимое памяти устройства.

    Чтобы выполнить этот шаг, нужно использовать функции IoReadMmReg8|16|32(), IoReadMmBuffer8|16|32(), IoWriteMmReg8|16|32(), IoWriteMmBuffer8|16|32().

Дерегистрация региона памяти MMIO

Чтобы дерегистрировать регион памяти MMIO, нужно выполнить следующие шаги:

  1. Освободить регион виртуальной памяти, выделенный при вызове функции KnIoMapMem().

    Чтобы выполнить этот шаг, нужно вызвать функцию KnHandleClose(), указав дескриптор, который был получен при вызове функции KnIoMapMem(). (Функция KnHandleClose() объявлена в заголовочном файле sysroot-*-kos/include/coresrv/handle/handle_api.h из состава KasperskyOS SDK.)

  2. Закрыть или отозвать каждый дескриптор региона памяти MMIO во всех процессах, которые владеют этими дескрипторами.

    Чтобы выполнить этот шаг, нужно использовать функцию KnHandleClose() и/или KnHandleRevoke(), которые объявлены в заголовочном файле sysroot-*-kos/include/coresrv/handle/handle_api.h из состава KasperskyOS SDK.

Сведения о функциях API

Функции mmio.h

Функция(и)

Сведения о функции(ях)

KnRegisterPhyMem()

Назначение

Регистрирует регион памяти MMIO.

Параметры

  • [in] addr – странично выровненный базовый адрес региона памяти MMIO.
  • [in] size – размер региона памяти MMIO. Должен быть кратен размеру страницы памяти.
  • [out] outRid – указатель на дескриптор региона памяти MMIO.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnIoMapMem()

Назначение

Резервирует регион виртуальной памяти и отображает на него регион памяти MMIO.

Параметры

  • [in] rid – дескриптор региона памяти MMIO.
  • [in] prot – флаги, задающие права доступа к региону виртуальной памяти. Флаги определены в заголовочном файле sysroot-*-kos/include/vmm/flags.h из состава KasperskyOS SDK.
  • [in] attr – флаги, задающие параметры кеширования. Флаги определены в заголовочном файле sysroot-*-kos/include/vmm/flags.h из состава KasperskyOS SDK.
  • [out] addr – указатель на базовый адрес региона виртуальной памяти.
  • [out] handle – указатель на дескриптор, который используется для освобождения региона виртуальной памяти.

Возвращаемые значения

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

В параметре prot можно указать следующие флаги:

  • VMM_FLAG_READ – доступ на чтение.
  • VMM_FLAG_WRITE – доступ на запись.

В параметре attr можно указать следующие флаги:

  • VMM_FLAG_WRITE_BACK, VMM_FLAG_WRITE_THROUGH, VMM_FLAG_WRITE_COMBINE, VMM_FLAG_CACHE_DISABLE – управление кешированием.

    Рекомендуется указать флаг VMM_FLAG_CACHE_DISABLE.

IoReadMmReg8()

IoReadMmReg16()

IoReadMmReg32()

Назначение

Позволяют получить 8-, 16- или 32-битное слово из региона памяти MMIO.

Параметры

  • [in] reg – виртуальный адрес для чтения слова.

Возвращаемые значения

8-, 16- или 32-битное слово из региона памяти MMIO.

IoReadMmBuffer8()

IoReadMmBuffer16()

IoReadMmBuffer32()

Назначение

Сохраняют в буфер последовательность 8-, 16-или 32-битных слов из региона памяти MMIO.

Параметры

  • [in] baseReg – виртуальный адрес первого слова в последовательности.
  • [out] dst – указатель на буфер для сохранения последовательности слов.
  • [in] cnt – число слов в последовательности.

Возвращаемые значения

Нет.

Дополнительные сведения

Функции можно использовать, если процессор имеет архитектуру x86 или x86-64.

IoWriteMmReg8()

IoWriteMmReg16()

IoWriteMmReg32()

Назначение

Записывают 8-, 16- или 32-битное слово в регион памяти MMIO.

Параметры

  • [in] reg – виртуальный адрес для записи слова.
  • [in] data – слово для записи.

Возвращаемые значения

Нет.

IoWriteMmBuffer8()

IoWriteMmBuffer16()

IoWriteMmBuffer32()

Назначение

Записывают в регион памяти MMIO последовательность 8-, 16-или 32-битных слов из буфера.

Параметры

  • [in] baseReg – виртуальный адрес для записи последовательности слов.
  • [in] src – указатель на буфер с последовательностью слов.
  • [in] cnt – число слов в последовательности.

Возвращаемые значения

Нет.

Дополнительные сведения

Функции можно использовать, если процессор имеет архитектуру x86 или x86-64.