указатель дескриптора процесса не соответствует текущему макросу в ядре Linux - PullRequest
3 голосов
/ 05 октября 2011

Я использую значение esp стека ядра для вычисления значения указателя дескриптора процесса. Согласно книге ULK, мне просто нужно замаскировать 13 младших битов esp, чтобы получить базовый адрес структуры thread_info. Мой тест:

  1. написать модуль ядра, потому что мне нужно получить значение стека ядра
  2. В функции инициализации ядра получить значение стека ядра
  3. Используйте следующую формулу, чтобы получить указатель дескриптора процесса, запущенного на CPU: *((unsigned int*) esp & 0xffffe000)
  4. использовать текущий макрос, распечатать его значение.

Я думаю, что значение шага 3 должно совпадать со значением шага 4.

Но результаты моего эксперимента показывают: иногда они одинаковы, а иногда различны. Может ли кто-нибудь объяснить, почему? Или я что-то упустил?

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Это потому, что в основе стека ядра вы найдете struct thread_info экземпляр (зависит от платформы) и не a struct task_struct.Макрос current() предоставляет указатель на текущий task_struct.

Попробуйте следующее:

struct thread_info *info = (struct thread_info*)(esp & 0xfffe000);
struct task_struct *my_current = info->task;

Теперь вы можете сравнить my_current с current().

0 голосов
/ 15 октября 2011

Наконец-то я решил эту проблему.Все правильно ожидать размера стека ядра.Мое ядро ​​использует стек 4 КБ вместо стека 8 КБ.Так что мне просто нужно замаскировать младшие 12 бит ESP.Спасибо за все предложения и ответ!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...