указатель на дескриптор процесса не соответствует текущему макросу в ядре Linux

#linux-kernel

#linux-ядро

Вопрос:

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

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

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

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

Комментарии:

1. В Kernelnewbies есть описание того, как current() это работает , которое может быть полезным.

Ответ №1:

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

Попробуйте выполнить следующее:

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

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

Комментарии:

1. Ваш код такой же, как:*((unsigned int *) esp amp; 0xffffe000), потому что первое поле thread_info — это задача.

Ответ №2:

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