Найти программный счетчик процесса в ядре
Я пытаюсь отследить ценность ПК определенного процесса в ядре.
Для этого я посмотрел на исходный код ядра и выяснил, что компьютер хранится внутри task_struct->stack
и что, чтобы иметь смысл стека, мне нужно набрать приведение его в struct thread_info *
,
Поэтому в GDB я установил точку останова b scheduler_tick
(вызывается каждые 10 мс). Тем не менее, когда я распечатал p/x ((struct thread_info *)curr->stack)->cpu_context.pc
Я получил значение как $4 = 0x804d19d8
,
Я ожидал, что компьютер будет ниже 0x80000000
учитывая, что адреса выше 0x80000000
настроены для пространства ядра в моем ядре. Посмотрев на objdump
вывод ядра, я вижу, что компьютер указывал на __schedule
,
Разве ПК не должен указывать на инструкции в пользовательском пространстве для процесса, который я запустил из пользовательского пространства?
Насколько я понимаю, когда запускается прерывание, состояние регистра сохраняется, прерывание обслуживается, а затем восстанавливается состояние регистра, поэтому программа продолжает работать так, как будто "ничего" не произошло.