O Torvalds Linus

Сайт о *nix системах и всем что с ними связано

Тесная связь между структурой thread info и стеком режима ядра, описанная в предыдущем разделе, предлагает эффективное решение: ядро может легко вычислить адрес структуры thread info текущего процесса по значению регистра esp. В самом деле, если структура thread union имеет длину 8 Кбайт (213 байт), то ядро маскирует 13 младших битов регистра esp, чтобы получить базовый адрес структуры thread info. С другой стороны, если структура thread union имеет длину 4 Кбайт, ядро маскирует 12 младших битов регистра esp. Это делается с помощью функции current thread info (), которая выполняет примерно следующие ассемблерные инструкции:

movl $0xffffeOOO,%есх / или OxfffffOOO для стеков в 4 Кбайт / andl %esp,%есх movl %есх,р

После выполнения этих трех инструкций переменная р содержит указатель на структуру thread info процесса, работающего на процессоре, выполнившем инструкцию.

Чаще всего ядру нужно обратиться к дескриптору процесса, а не к структуре thread info. Чтобы получить указатель на дескриптор текущего процесса, ядро вызывает макрос current, который фактически эквивалентен current_ thread_info ()->task и выполняет примерно следующие ассемблерные инструкции:

movl $0xffffeOOO,%ecx / или OxfffffOOO для стеков в 4 Кбайт / andl %esp,%ecx movl (%ecx),p

Поскольку поле task имеет в структуре thread info смещение 0, после выполнения этих трех инструкций переменная р содержит указатель на дескриптор текущего процесса.

Макрос current часто появляется в коде ядра в качестве префикса к полям дескриптора процесса. Например, конструкция current ->pid возвращает идентификатор текущего процесса.

В ранних версиях Linux стек ядра и дескриптор процесса хранились порознь. Тогда приходилось пользоваться глобальной статической переменной current, чтобы идентифицировать дескриптор работающего процесса. В многопроцессорных системах переменная current была массивом, содержащим по элементу на каждый процессор.

Add A Comment