Как получить сохраненные регистры процесса в Linux (ARM Architecture) - PullRequest
3 голосов
/ 19 июля 2011

Я пишу программу, которая анализирует все задачи, запущенные в linux, начиная с init_task для каждой задачи, и я читаю его структуру task_struct, которая позволяет мне получить его PID, State, Oncpu ..

Однако я такженужно найти сохраненные регистры этой задачи, особенно регистры R0-R10, IP, SP, FP и ПК

Также в task_struct я нашел указатель на структуру cpu_context, которая содержит регистры R4 в ПК

Итак, проблема в том, что я не знаю, как получить регистры с R0 по R3. Я пытался вручную проанализировать стек задачи, но не нашел соответствующих значений

, поэтому вот мои вопросы:

- где в стеке (или в другом месте в памяти) сохраняются регистры задачи, которая не выполняется?

-Могу ли я доверять значениям регистров R4 дляПК найден в структуре cpu_context?

Я использую плату, содержащую процессор ARM Cortex A9 MPCore (2 ядра), связанный с главным компьютером с помощью JTAG Link

Linux Kernel 2.6.35.7+ работает на плате (конечно, это ядро ​​было скомпилировано для архитектуры ARM)

На хост-компьютере я использую OPENOCD и GDB для отладки.

Спасибо

Ответы [ 2 ]

3 голосов
/ 30 января 2014

Зависит от того, какой набор регистров вас интересует.

Если вас интересует состояние режима пользователя, посмотрите, как это делает ptrace.После быстрого взгляда на исходный код, task_pt_regs(task) - это то место, куда вам следует заглянуть.По-видимому, они находятся около вершины стека ядра для этой задачи (например, посмотрите на vector_swi; у него есть stmia sp, {r0 - r12} около начала, за которым следует хранилище sp и lr).

Если вас интересует состояние режима ядра, оно сохраняется __switch_to в task->cpu_context (TI_CPU_SAVE - это смещение cpu_context в struct thread_info).Как уже отмечалось в другом ответе, он не сохраняет r0-r3, потому что не обязан;вызывающий switch_to предполагает, что они будут перекрыты __switch_to, поэтому их значения не имеют значения.

1 голос
/ 27 октября 2013

cpu_context содержит значение регистров при вызове __switch_to, регистры, сохраненные вызывающим абонентом, не сохраняются.

Если вы хотите, чтобы значение регистров при входе в прерывание или системный вызов вы искали в другом месте.

...