Понимание получения указателя task_struct из стека ядра процесса
Прямо сейчас я читаю книгу "Linux Kernel Development 3d Edition". Роберт Лав. Там он пишет о структуре thread_info, которая содержит указатель на структуру task_struct и, как я понял, расположена внизу или вверху стека ядра процесса (зависит от архитектуры). До недавнего времени я не был знаком с API ядра Linux и не знал о существовании метода current (). В книге есть выдержка, связанная с тем, как на самом деле работает метод current ():
On x86, current is calculated by masking out the 13 least-significant bits of the stack pointer to obtain the thread_info structure.This is done by the current_thread_info() function.The assembly is shown here: movl $-8192, %eax andl %esp, %eax This assumes that the stack size is 8KB.When 4KB stacks are enabled, 4096 is used in lieu of 8192.
Мои вопросы:
As far as I know if we have a decimal value represented as a set of bits, then there is only one least-significant bit in the set, isn't it? What is the magical number 13?Для тех, кто будет читать эту тему, вопросы, которые я озвучил, могут привести к выводу, что автор не правильно понимает процесс выделения памяти и администрирования. Хорошо, это может быть правильно из-за того факта, что я могу представить память, выделенную для стека, как ленту, полную битов (или байтов). Все эти байты доступны по определенному адресу памяти, представленному в виде некоторого десятичного значения. Начало стека - самый низкий адрес памяти, а плавник стека - самое высокое значение адреса памяти. Но КАК, КАК мы можем получить указатель на структуру thread_info, расположенную, скажем, в конце стека, только путем маскировки 13 наименее значимых битов указателя стека, расположенных в ARBITRARY (если я правильно понял, мы маскируем биты указатель стека АДРЕС представлен в виде десятичного значения).