O Torvalds Linus

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

Следовательно, ядро должно уметь работать с несколькими процессами одновременно, и дескрипторы процессов хранятся в динамической памяти, а не в области, постоянно выделенной ядру. Для каждого процесса Linux помещает две разные структуры данных в одну область памяти, свою у каждого процесса. Это небольшая структура, связанная с дескриптором процесса (структура thread infо), и стек режима ядра для данного процесса. Размер этой области обычно равен 8192 байтам (двум страничным кадрам). По соображениям эффективности, ядро хранит 8 – килобайтовую область памяти в двух соседних страничных кадрах, причем первый из них выровнен по границе 213. Это может обернуться проблемой, если доступно мало динамической памяти, потому что свободная память может оказаться сильно фрагментированной. Поэтому в архитектуре 80×86 можно сконфигурировать ядро на этапе компиляции так, чтобы область памяти, включающая в себя стек и структуру thread info, занимала один страничный кадр (4096 байтов).

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

На рис. 3.2 изображено, как эти две структуры данных располагаются в двухстраничной (8 Кбайт) области памяти. Структура thread info находится в начале области памяти, а стек растет вниз, начиная с конца этой области. На рисунке также показано, что между структурами thread info и task struct установлена взаимная связь при помощи полей task и thread info.

Регистр esp является указателем на стек процессора. Он служит для адресации верхушки стека. В системах с архитектурой 80×86 стек начинается в конце области памяти и растет в направлении ее начала. Сразу после переключения из режима пользователя в режим ядра стек процесса в этом режиме пуст, и, следовательно, регистр esp указывает на байт, непосредственно следующий за стеком.

Значение регистра esp уменьшается, как только в стек записываются данные. Поскольку структура thread info занимает 52 байта, стек ядра может разрастаться до 8140 байтов.

Структура thread info, хранится, начиная с адреса 0x015fa000, а стек —с адреса 0x015fc000. Регистр esp указывает на верхушку стека по адресу 0x015fa878.

Ядро вызывает макросы alloc_thread_info И free thread info, когда ему нужно выделить и, соответственно, освободить область памяти, содержащую структуру thread inf о и стек ядра.

Add A Comment