Чтение значения физического адреса через ядро - PullRequest
0 голосов
/ 17 июня 2020

Я работаю над старой linux операционной системой, которая имеет одно ядро ​​для всех процессов (в основном это экзоядро). При реализации функций отладки из пользовательского пространства я хотел бы дизассемблировать команды других процессов. Поэтому я создал системный вызов, который принимает виртуальный адрес целевого процесса и печатает его значение (так что я могу разобрать байты). Моя идея состояла в том, чтобы переключиться на целевой pgdir, вызвать просмотр страниц и затем получить доступ к данным в указателе физического адреса. Я получаю ядро ​​pani c при попытке доступа к последнему. Если я переключаюсь на целевой процесс, а затем получаю доступ к виртуальному адресу (без перехода по страницам), байты команды печатаются без каких-либо проблем (например, с printf ("% 04x", * va)).

Мой вопрос - почему виртуальный адрес содержит фактическую команду, а физический - нет (и почему он c?)

Спасибо!

1 Ответ

0 голосов
/ 17 июня 2020

Примечание: это XY-ответ ... Я знаю, что не отвечаю на ваш вопрос ('как вертеться с аппаратной настройкой MMU для чтения ... памяти где-то'), но Я предлагаю решение вашей заявленной проблемы (как читать из адресного пространства другого процесса).

Linux предоставляет возможность делать то, что вы просите - читать память из адресное пространство другого процесса - с использованием ptrace(),

   PTRACE_PEEKTEXT, PTRACE_PEEKDATA
          Read a word at the address addr in the tracee's memory, returning
          the word as the result of the ptrace() call.  Linux does not have
          separate text and data address spaces, so these two requests are 
          currently equivalent.  (data is ignored; but see NOTES.)

{ ссылка } для некоторых ссылок?

...