Как я могу принудительно очистить кэш процесса из драйвера устройства Linux? - PullRequest
2 голосов
/ 21 марта 2019

Я работаю над исследовательским проектом, который требует от меня захвата памяти с нестандартного оборудования.Я работаю с Zedboard SoC (двухъядерный ARM Cortex-A9 с подключенной матрицей FPGA).Я разработал драйвер устройства, который позволяет мне выполнять захват виртуальной памяти и физической памяти (используя периферийное устройство AXI4-Lite, которое управляет Xilinx AXI DMA IP ).

Моя цель - захватить все сопоставленные страницы, поэтому я проверяю / proc / pid / maps для сопоставленных областей, затем получаю PFN из / proc / pid / pagemaps, передаю физические адреса в драйвер моего устройства и затемпередать их на мое пользовательское оборудование (которое вызывает XMAXX AXI DMA для получения содержимого из физической памяти).

ПРИМЕЧАНИЕ. Я использую дистрибутив Xtainx PetaLinux, построенный на Linux версии 4.14.

Мой драйвер устройства реализует следующую процедуру через серию вызовов IOCTL:

  1. Остановка целевого процесса.
  2. Выполнение захвата виртуальной памяти (используя access_process_vm () function).
  3. Очистить кэш (используя функцию flush_user_range () ).
  4. Выполнить захват физической памяти.
  5. Возобновить целевой процесс.

Однако я замечаю, что захват виртуальной памяти и захват физической памяти различаются в разделе [heap] (это первый раздел, который расширяетмимо одной страницы).Первая страница совпадает, но ни одна из других страниц даже близко не закрыта.Секция [stack] не совпадает вообще.Я должен отметить, что для первых двух разделов памяти, .text и .rodata, захваты точно совпадают.На данный момент сделан вывод, что данные, которые не изменяют , изменяют во время выполнения, совпадают между виртуальным и физическим захватом, тогда как данные, которые изменяют , изменяют во время выполненияне совпадает.

Так что меня удивляет: использую ли я правильную функцию для обеспечения согласованности между кешем и оперативной памятью?Если нет, то какую функцию использовать для принудительной очистки кэша в ОЗУ?Необходимо, чтобы данные в оперативной памяти были обновлены до того момента, когда целевой процесс был остановлен, поскольку я не могу получить доступ к кэшам с нестандартного оборудования.

Редактировать 1: В отношении этого вопроса отмечаетсяВ качестве возможного дубликата этого вопроса я использую функцию из принятого ответа для запуска очистки кэша.Однако, с моей точки зрения, это не работает, так как физическая память не соответствует виртуальной памяти, как я ожидал бы, если происходил сброс кеша.

...