2009-05-20 2 views
21

Является ли стек ядра для общего процесса общим или существует отдельный стек ядра для каждого процесса? Если он отдельно для каждого процесса, где хранится этот указатель стека? В task_struct?стек ядра для процесса linux

ответ

17

Существует только одна общая память ядра. В нем каждый процесс имеет свой собственный task_struct + стек ядра (по умолчанию 8K).

В контекстном переключателе старый указатель стека сохраняется где-то, а фактический указатель стека указывается на вершину стека (или внизу в зависимости от аппаратной архитектуры) нового процесса, который будет запущен.

+1

где хранится этот указатель стека? – suresh

+2

В контекстном переключении значение указателя старого стека сохраняется в task_struct процесса, который заменяется новым процессом, и указатель стека для нового процесса считывается из task_struct этого нового процесса. –

12

This old article говорит, что каждый процесс имеет свой собственный стек ядра. См. Комментарии к тому, почему это кажется очень хорошим дизайном.

Я пробовал reading the current source, чтобы убедиться, но так как стек ядра «неявный», он не отображается в task_struct. Об этом говорится в статье.

Этот ответ был отредактирован для включения мудрости из комментариев. Благодарю.

+3

Я серьезно сомневаюсь, что это можно изменить. Стек ядра - это не общее пространство, где системные вызовы могут помещать свои данные. Если вы разделите их между процессами, несколько подпрограмм ядра могут использовать один и тот же стек одновременно -> повреждение данных. –

+1

Я бы подумал, что каждому процессу нужен свой собственный стек ядра, потому что несколько разных процессов могут одновременно выполнять системные вызовы, и вы не хотите, чтобы их путали. –

+0

Каждый процесс имеет свой собственный стек ядра, и каждый стек ядра имеет связанный с ним процесс. Он никогда не менялся. Вот почему в «ps» есть какая-то псевдопроцессная вещь. –

2

Книга «Развитие ядра Linux» Роберта Лава имеет хорошее объяснение о стеке ядра процесса.

И да, каждый процесс имеет свой собственный стек ядра, и если я не ошибаюсь, его указатель хранится в структуре thread_info. Но я не уверен в этом, и struct task_struct хранится в начале или в конце стека ядра процесса, в зависимости от архитектуры процессора.

Cheers. Carlos Maiolino

+2

Начиная с ядра Linux 2.6 структура 'thread_info' хранится в конце стека ядра каждого процесса, а не структуры task_struct. Строка 'thread_info' содержит указатель на структуру' task_struct' –

1

Я думаю, что каждый процесс имеет свой собственный стек режима ядра. Драйвер выполняется в режиме ядра, процесс иногда блокируется при выполнении подпрограммы драйвера. и операционная система может планировать запуск другого процесса. Запланированный процесс может снова вызвать процедуру драйвера. Если стек ядра является общим, 2 процесса используют стек ядра, все будет замешано. Я озадачен этим вопросом в течение длительного времени. Сначала я думаю, что стек ядра является общим, некоторые книги говорят об этом. После того как я прочитал разработку ядра Linux и посмотрю код драйвера, я начинаю думать, что стек ядра не используется.

Смежные вопросы