2010-11-10 2 views
0

Я новичок в Linux, понимая, что из пользовательского режима, если вызов процесса вызывает системный вызов fork(), тогда звезды процесса, выполняющиеся в системном режиме, и новый дочерний процесс создаются с помощью новое пространство режима ядра (включая стек) также выделяется для вновь созданного дочернего процесса. Мой вопрос: 1> Как и когда создается стек пользовательского режима для этого вновь созданного процесса? 2> Как ядро ​​знает, где находится стек пользовательского режима для этого вновь созданного процесса? 3> Может ли ядро ​​получить доступ к стеке пользовательского режима при выполнении в режиме ядра в этом новом контексте процесса?Создание процесса Linux: стек пользовательского режима

исправьте меня, если мой вопрос или понимание неверны.

Заранее благодарим за руководство.

рассматривает Bibek

ответ

4

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

Два пуска с одинаковой кучей и стека. Регистр x86, указывающий на текущую позицию стека, указывает на тот же адрес памяти как для родительского, так и для дочерних процессов (поскольку их карта памяти идентична).

1
  1. Обычно программа получить новый стек пользовательского режима при вызове exec() или создать новый рисунок протектора. Если вы хотите сделать это вручную, используйте системный вызов mmap(). Примечание: процесс может иметь несколько стеков (зеленые потоки или стек сигналов).

  2. Когда вы делаете системный вызов, ваш регистр сохраняется - это включает адрес стека.

  3. Большая часть функции ядра не может напрямую обращаться к стеку пользовательского режима. Но, конечно, находясь в кольце-0, ядро ​​может настроить разрешение и оценить его, когда захочет. В немодифицированном ядре это ограничено несколькими выбранными функциями. (Поиск copy_to_user и copy_from_user в исходном коде ядра)

1

Моих ответов:

  1. Вся виртуальная память дублируются для нового процесса, в том числе любых стек. Ядро рассматривает это не иначе, как любые другие страницы.
  2. Ядру не нужно знать, где стек пользовательского режима должен достичь этого, он просто дублирует все адресное пространство.
  3. Для этого не требуется доступ к стеку пользовательского режима.

Единственное отличие - это возвращаемое значение, которое ядро ​​дает родительскому и дочернему.

Когда системный вызов fork() возвращается, он вернется к тому же адресу в родительском и дочернем, но с другим возвращаемым значением (ребенок всегда получает 0, родитель получает pid ребенка). Поскольку у каждого из них есть своя копия (она будет копировать на запись, но скоро будет написана) стека, это не проблема.

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