Нет хорошего способа сделать это без того, чтобы ваш код работал внутри ядра, хотя вы могли бы сделать это, если ваша программа работает с правами root и вы можете прочитать /proc/kcore
(и, возможно, /proc/kallsyms
) и благодаря большой работе мы можем найти информацию о таблице страниц для вашего процесса и найти там адрес.
Проблема в том, что пока вы делаете это, ваша программа не останется на месте. Даже если страница, содержащая адрес, никогда не выгружается, ее можно переместить (на x86 некоторые страницы не могут быть использованы для DMA, поэтому страницу можно переместить только для настройки операции ввода-вывода, и я уверен, что Есть и другие причины, по которым страница может быть перемещена без замены).
Кроме того, пока вы читаете таблицы страниц, они меняются. Вы не можете заблокировать их из пространства приложения так, как вы можете в пространстве ядра, поэтому я не уверен, что вы когда-нибудь сможете сделать хороший снимок этой структуры.
Если вы действительно хотите наблюдать за изменением адресов страниц при выполнении программ, лучше всего реализовать модуль ядра, который позволяет вам запрашивать их или просто читать отображение всей страницы каждый раз, когда вызываемый пользователь читает в специальном файле устройства. Я не думаю, что это было бы слишком сложно, поскольку блок управления процессом текущего процесса доступен в вызовах функции чтения драйвера. Было бы сложнее, если бы вы захотели иметь возможность изучать сопоставления других процессов.