Создание процесса в Linux: стек режима пользователя - PullRequest
0 голосов
/ 10 ноября 2010

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

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

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

С уважением Bibek

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

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

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

1 голос
/ 10 ноября 2010

Мои ответы:

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...