Является ли стек ядра для общего процесса общим или существует отдельный стек ядра для каждого процесса? Если он отдельно для каждого процесса, где хранится этот указатель стека? В task_struct?
Стек ядра для процесса linux
Ответ 1
Существует только одна общая память ядра. В нем каждый процесс имеет свой собственный task_struct + стек ядра (по умолчанию 8K).
В контекстном переключении старый указатель стека сохраняется где-то, и фактический указатель стека делается так, чтобы указывать на вершину стека (или снизу в зависимости от архитектуры оборудования) нового процесса, который будет запущен.
Ответ 2
В этой старой статье говорится, что каждый процесс имеет свой собственный стек ядра. См. Комментарии к тому, почему это кажется очень хорошим дизайном.
Я попытался прочитать текущий источник, чтобы убедиться, но поскольку стек ядра "неявный", он не отображается в task_struct
, Это упоминается в статье.
Этот ответ был отредактирован для включения мудрости из комментариев. Спасибо.
Ответ 3
В книге "Развитие ядра Linux" Роберта Лава есть хорошее объяснение о стеке ядра процесса.
И да, каждый процесс имеет свой собственный стек ядра, и если я не ошибаюсь, его указатель хранится в структуре thread_info. Но я не уверен в этом, и struct task_struct хранится в начале или в конце стека ядра процесса, в зависимости от архитектуры процессора.
Приветствия. Карлос Майолино
Ответ 4
Я думаю, что каждый процесс имеет свой собственный стек режима ядра. Драйвер выполняется в режиме ядра, процесс иногда блокируется при выполнении подпрограммы драйвера. и операционная система может планировать запуск другого процесса. Запланированный процесс может снова вызвать процедуру драйвера. Если стек ядра является общим, 2 процесса используют стек ядра, все будет замешано. Я озадачен этим вопросом в течение длительного времени. Сначала я думаю, что стек ядра является общим, некоторые книги говорят об этом. После того как я прочитал разработку ядра Linux и посмотрю код драйвера, я начинаю думать, что стек ядра не используется.