#linux-kernel
#linux-ядро
Вопрос:
Я использую esp
значение стека ядра для вычисления значения указателя на дескриптор процесса. Согласно книге ULK, мне просто нужно замаскировать 13 младших значащих битов esp
, чтобы получить базовый адрес thread_info
структуры. Мой тест:
- напишите модуль ядра, потому что мне нужно получить значение стека ядра
- В функции инициализации ядра получите значение стека ядра
- используйте следующую формулу, чтобы получить указатель дескриптора процесса процесса, запущенного на процессоре:
*((unsigned int*) esp amp; 0xffffe000)
- используйте текущий макрос, распечатайте его значение.
Я думаю, что значение шага 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. Спасибо за все предложения и ответы!