Получение сведений о памяти

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

Получение сведений о странице виртуальной памяти

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

Получение размера буфера MDL

Чтобы получить размер буфера MDL, нужно вызвать функцию KnPmmMdlGetSize().

Получение сведений о регионе виртуальной памяти, на который отображен буфер MDL

Буферы MDL используются не только для создания разделяемой памяти и загрузки сегментов ELF-образа в память нового процесса, но и для создания дампа памяти процесса, находящегося в "замороженном" состоянии. Функция KnTaskGetNextVmRegion() из API task_api.h создает буфер MDL из физической памяти, отображенной на регион виртуальной памяти процесса, находящегося в "замороженном" состоянии. Таблица описания памяти этого буфера MDL может содержать фиктивные регионы физической памяти, для которых указан размер, но не указан адрес. Фиктивные регионы физической памяти в таблице описания памяти буфера MDL соответствуют участкам незафиксированных страниц в регионе виртуальной памяти процесса, находящегося в "замороженном" состоянии. Созданный функцией KnTaskGetNextVmRegion() буфер MDL нужно отобразить вызовом функции KnPmmMdlMap() на регион виртуальной памяти процесса, создающего дамп, для последующего сохранения содержимого. Этот регион виртуальной памяти будет содержать участки незафиксированных страниц, если таблица описания памяти буфера MDL содержит фиктивные регионы физической памяти. Если процесс, создающий дамп, будет обращаться к участкам незафиксированных страниц в регионе виртуальной памяти, на который отображен буфер MDL, то это приведет к нежелательному выделению физической памяти. Сведения о распределении зафиксированных и незафиксированных страниц в регионе виртуальной памяти, на который отображен буфер MDL, позволяют процессу, создающему дамп, избежать обращения к участкам незафиксированных страниц в этом регионе виртуальной памяти.

Чтобы получить сведения о распределении зафиксированных и незафиксированных страниц в регионе виртуальной памяти, на который отображен буфер MDL, нужно использовать функцию KnPmmMdlGetUsageMap(). Через выходной параметр counters функция передает массив счетчиков зафиксированных и незафиксированных страниц. Счетчики зафиксированных и незафиксированных страниц строго чередуются. Это отражает, что за участком зафиксированных страниц следует участок незафиксированных страниц и наоборот. Выходной параметр firstUsed позволяет определить, какой счетчик является первым в массиве: счетчик зафиксированных страниц или счетчик незафиксированных страниц.

Для сбора сведений об одном регионе виртуальной памяти может потребоваться повторно вызывать функцию KnPmmMdlGetUsageMap() по следующим причинам:

При повторном вызове функции KnPmmMdlGetUsageMap() в параметре startPage нужно указать смещение, то есть число страниц, для которых уже собраны сведения при предыдущих вызовах функции.

Чтобы убедиться в том, что сбор сведений осуществлен для всего региона виртуальной памяти, на который отображен буфер MDL, нужно проверить выполнение одного из следующих условий:

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

Функции vmm_api.h

Функция

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

KnVmQuery()

Назначение

Позволяет получить сведения о странице виртуальной памяти.

Параметры

  • [in] addr – адрес, входящий в страницу виртуальной памяти.
  • [out] info – указатель на структуру, содержащую сведения о странице виртуальной памяти. Тип структуры определен в заголовочном файле sysroot-*-kos/include/vmm/info.h из состава KasperskyOS SDK.

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

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

KnPmmMdlGetSize()

Назначение

Позволяет получить размер буфера MDL.

Параметры

  • [in] handle – дескриптор буфера MDL.
  • [out] size – размер буфера MDL в байтах.

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

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

KnPmmMdlGetUsageMap()

Назначение

Позволяет получить сведения о распределении зафиксированных и незафиксированных страниц в регионе виртуальной памяти, на который отображен буфер MDL.

Параметры

  • [in] handle – дескриптор буфера MDL.
  • [in] startPage – смещение в регионе виртуальной памяти, с которого нужно начать сбор сведений, в страницах памяти.
  • [out] firstUsed – указатель на булевое значение, отражающее, какой счетчик является первым в параметре counters: счетчик зафиксированных страниц (rtl_true) или счетчик незафиксированных страниц (rtl_false).
  • [in,out] usedCounters – входные данные: указатель на максимальное число счетчиков в массиве, заданном через параметр counters (не должно превышать значение константы MappingUsesSlots, определенной в файле sysroot-*-kos/include/kl/core/VMM.idl из состава KasperskyOS SDK); выходные данные: указатель на фактическое число счетчиков в массиве, заданном через параметр counters.
  • [out] counters – указатель на массив, содержащий счетчики зафиксированных и незафиксированных страниц.

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

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

В начало