Я пытаюсь распечатать текущие значения регистра в нескольких точках, из моего модуля ядра. Это код, я использую:Как распечатать текущие значения регистра из кода ядра?
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, как есть, моему модулю. Надеюсь, это не должно вызывать никаких проблем.
Если вы хотите получить доступ к невыполненному символу, я предлагаю отсылать этот блог в последний раздел. http://onebitbug.me/2011/03/04/introducing-linux-kernel-symbols/ – Jeyaram
А также укажите точную арку. Это поможет проанализировать. – Jeyaram
'current' - макрос текущей задачи. Вы находитесь в ядре, а не в задаче ядра, поэтому регистры не будут меняться. Намного проще использовать 'printk («% s:% d \ n », __function__, __line __);'. Почему вы хотите напечатать «ПК». Сайт вызова 'show_regs()' известен. –