2014-01-27 1 views
1

Я пытаюсь распечатать текущие значения регистра в нескольких точках, из моего модуля ядра. Это код, я использую:Как распечатать текущие значения регистра из кода ядра?

struct pt_regs *regs = task_pt_regs(current); 
show_regs(regs); 

Это работает, но выглядит как контекст не является правильным. Например, например, значение epc всегда отображается ниже, хотя у меня есть этот код в нескольких местах в моем файле.

kernel: epc : ffffffff8023a510 kernel_thread_helper+0x0/0x18 

i.e имя функции всегда «kernel_thread_helper».

В случае паники ядра, я получаю значение ЕРС указывая на мое имя функции + смещение, например:

kernel: epc : ffffffffc0087ef0 my_function+0x58/0xa0 [myModule] 

Что я делаю неправильно?

Примечание: Мне не удалось напрямую использовать фактическое определение show_regs, так как оно не экспортируется в код ядра (так что я получу ошибку «неопределенного символа»). Как обходной путь, я скопировал функцию dentition show_regs, как есть, моему модулю. Надеюсь, это не должно вызывать никаких проблем.

+0

Если вы хотите получить доступ к невыполненному символу, я предлагаю отсылать этот блог в последний раздел. http://onebitbug.me/2011/03/04/introducing-linux-kernel-symbols/ – Jeyaram

+0

А также укажите точную арку. Это поможет проанализировать. – Jeyaram

+0

'current' - макрос текущей задачи. Вы находитесь в ядре, а не в задаче ядра, поэтому регистры не будут меняться. Намного проще использовать 'printk («% s:% d \ n », __function__, __line __);'. Почему вы хотите напечатать «ПК». Сайт вызова 'show_regs()' известен. –

ответ

2

Получено, код действует ниже! :)

struct pt_regs regs; 
prepare_frametrace(&regs); 
show_regs(&regs); 
Смежные вопросы