Чтобы понять ответ на ваш вопрос, вам необходимо понять аппаратное обеспечение Intel.
Сначала мы начнем с самой простой инструкции (поскольку SINGLE_STEP переводит процессор Intel в режим одноступенчатого перехода и возвращается к обработчику прерываний после выполнения одной структуры):
мовл (eax), отлив
В соответствии с форматом Intel это означает получение значений внутри eax, обработку их как указателя памяти, доступ к памяти, получение 4-байтовых значений и копирование их в ebx.
Эта ОДНА инструкция по сборке - при выполнении в контексте ядра и пользователя будет иметь РАЗНОЕ поведение / значение.
Если в ядре таблица страниц ядра будет использоваться для доступа к памяти и копирования данных в ebx. В пользовательском процессе таблица пользователя будет использоваться (кстати, аппаратным обеспечением MMU) для чтения данных из памяти и копирования в ebx. Одинаковые значения в eax, но с разными значениями в регистре CR3 (что означает различный контекст процесса), будут запускать чтение различных частей памяти. Так что трассировка пользовательских программ в ядре, действительно, нелепа. Потому что вам нужно сделать переключение контекста (которое включало весь набор операций по сохранению и восстановлению регистров), выполненное до и после выполнения пользовательской инструкции - что означает эффективное выполнение 4 операций.
Как видите, я не ссылался ни на один API-интерфейс функций ядра, как вы упомянули. Общее концептуальное понимание на первом месте.