Сопоставление виртуального адреса с физической страницей можно изменить во время выполнения приложения путем подкачки или перераспределения физических страниц для дефрагментации памяти и т. д.
Что делать, если я хочу кэшировать номера физических страниц (PPN) некоторого диапазона виртуальных адресов из / proc / PID / pagemap, поскольку доступ к proc / PID / pagemap требует чрезвычайно больших накладных расходов, которые нужно проверять каждый раз, есть ли способ получить уведомление, если страница была перемещена на другой физический адрес или заменена на действующий адрес или просто на любую часть памяти?
Подойдет любой метод (не только метод пользовательского пространства, но и те, которые могут быть реализованы только в пространстве ядра).
@wxz Привет! PPN означает физический номер страницы, что означает лишь начальную точку физического адреса каждой отдельной страницы. / Я предпочитаю использовать любой метод, который уже есть в текущей системе Linux, но если нет, я готов сделать для этого модуль ядра.
Я представил правку, поясняющую это. Я привык, что его называют физическим номером кадра (PFN) или просто физическим адресом. Что касается поставленной задачи, я не думаю, что Linux изначально предоставляет инструменты пользовательского уровня для получения физических адресов (см. здесь). Поэтому я думаю, что модуль ядра, который связывается с PID вашего процесса, а затем вызывается при сбоях страницы или подкачке, будет вашим лучшим вариантом.
Вы можете просто получить страницы, чтобы они не двигались.
mlock(2)
по крайней мере гарантирует, что страница не будет выгружена, и что доступ к ней не будет ошибкой страницы. Теоретически ядро могло бы скопировать его на другую физическую страницу, пока ваш процесс спит, но я был бы удивлен, если бы это действительно могло произойти. Итак, я думаю, что вы обычно делаете сначала mlock()
виртуальные страницы, а затем проверяете /proc/self/pagemap
, чтобы получить их физический адрес; тогда вы знаете, что они не изменятся.
Можете ли вы определить PPN в своем сообщении? Кроме того, похоже, что вы идете вниз, на территорию «модифицировать ядро Linux, чтобы перехватывать определенные ошибки страниц / операции подкачки и регистрировать их». Сделать можно, но очень сложно.