API определен в заголовочном файле sysroot-*-kos/include/coresrv/io/mmio.h из состава KasperskyOS SDK.
API предназначен для работы с памятью MMIO. Память MMIO – это физические адреса, на которые отображены регистры и память устройств. (Для адресации физической памяти и доступа к регистрам и памяти устройств используются части одного пространства физических адресов.)
Сведения о функциях API приведены в таблице ниже.
Использование API
Типовой сценарий использования API включает следующие шаги:
Чтобы выполнить этот шаг, нужно вызвать функцию KnRegisterPhyMem(). Если один и тот же регион памяти MMIO требуется зарегистрировать несколько раз, то при каждой регистрации этого региона в параметре flags нужно указать флаг MMIO_U_SHARED. Если регистрируемый регион памяти MMIO используется кодом ядра, то нужно указать флаг MMIO_K_SHARED. Если эти флаги не будут указаны, то доступ к региону памяти MMIO получит только тот код, который запросит этот доступ первым (это может быть как код ядра, так и код, исполняющийся в пользовательском режиме). Все последующие попытки регистрации вызовом функции KnRegisterPhyMem() завершатся с ошибкой rcAlreadyExists, и в диагностический вывод будут добавлены сообщения о проблеме совместного доступа к региону памяти MMIO. Если ядру не удастся получиться доступ к региону памяти MMIO из-за того, что этот регион уже зарегистрирован кодом, исполняющимся в пользовательском режиме, то также в диагностический вывод будет добавлено сообщение о проблеме совместного доступа к региону памяти MMIO.
Дескриптор региона памяти MMIO можно передать другому процессу через IPC.
В один момент времени регион памяти MMIO может быть отображен только на один регион виртуальной памяти только одного процесса. (В разные моменты времени регион памяти MMIO может отображаться на виртуальную память разных процессов, владеющих дескриптором этого региона.) В результате отображения процесс получает доступ к региону памяти MMIO на чтение и/или запись.
Чтобы зарезервировать регион виртуальной памяти и отобразить на него регион памяти MMIO, нужно вызвать функцию KnIoMapMem().
Дескриптор, полученный при вызове функции KnIoMapMem(), нельзя передать другому процессу через IPC.
8-, 16- и 32-битные слова, считанные из региона памяти MMIO или записанные в него, представляют собой значения регистров устройства или содержимое памяти устройства.
Чтобы выполнить этот шаг, нужно использовать функции IoReadMmReg8|16|32() и IoWriteMmReg8|16|32().
API включает вспомогательные функции KnIoMemHandlesClear() и KnIoMemHandlesClose(). Функция KnIoMemHandlesClear() инициализирует структуру для хранения дескрипторов, которые создаются на шаге 1 и 2. Функция KnIoMemHandlesClose() закрывает дескрипторы, сохраненные в этой структуре (вызывая функцию KnHandleClose() из API handle_api.h), и инициализирует ее. При вызове функции KnIoMemHandlesClose() отсутствие всех или одного дескриптора в структуре не приводит к ошибке, и присутствующий дескриптор будет закрыт. Функции KnIoMemHandlesClear() и KnIoMemHandlesClose() можно использовать следующим образом. Перед выполнением шага 1 инициализировать структуру для хранения дескрипторов вызовом функции KnIoMemHandlesClear(). Затем при выполнении шагов 1 и 2 сохранять дескрипторы в этой структуре. В дальнейшем это позволит закрыть все созданные дескрипторы одним вызовом функции KnIoMemHandlesClose().
Дерегистрация региона памяти MMIO
Чтобы дерегистрировать регион памяти MMIO, нужно выполнить следующие шаги:
KnIoMapMem().Чтобы выполнить этот шаг, нужно закрыть дескриптор, который был получен при вызове функции KnIoMapMem().
Для закрытия дескрипторов при выполнении этих шагов можно использовать функцию KnIoMemHandlesClose().
Сведения о функциях API
Функции mmio.h
Функция(и) |
Сведения о функции(ях) |
|---|---|
|
Назначение Регистрирует регион памяти MMIO. Параметры
Возвращаемые значения В случае успеха возвращает Дополнительные сведения В параметре
|
|
Назначение Резервирует регион виртуальной памяти и отображает на него регион памяти MMIO. Параметры
Возвращаемые значения В случае успеха возвращает Дополнительные сведения В параметре
В параметре
|
|
Назначение Позволяют получить 8-, 16- или 32-битное слово из региона памяти MMIO. Параметры
Возвращаемые значения 8-, 16- или 32-битное слово из региона памяти MMIO. |
|
Назначение Записывают 8-, 16- или 32-битное слово в регион памяти MMIO. Параметры
Возвращаемые значения Нет. |
|
Назначение Инициализирует структуру для хранения дескрипторов ресурсов, выделенных для обеспечения MMIO. Параметры
Возвращаемые значения Нет. Дополнительные сведения После инициализации поля структуры принимают значение |
|
Назначение Закрывает дескрипторы ресурсов, выделенных для обеспечения MMIO, и инициализирует структуру, в которой эти дескрипторы хранились. Параметры
Возвращаемые значения В случае успеха возвращает Дополнительные сведения После инициализации поля структуры принимают значение |