2017-02-07 37 views
2

Я нахожусь в середине моего первого класса ОС, поэтому, надеюсь, у меня нет никаких больших заблуждений.Почему getpid реализован как системный вызов?

Мне было интересно, почему getpid() реализован как системный вызов в Linux. Насколько я понимаю, некоторые функции выполняются в системные вызовы, потому что они получают доступ или изменяют информацию, которую ОС может захотеть защитить, поэтому они реализованы как системный вызов для передачи управления ядру.

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

Спасибо за помощь.

+2

Это не защита, это просто потому, что внутренняя структура процесса реализована в ядре, а не в библиотеках пользовательского режима. – Barmar

ответ

0

Getpid() может быть просто ЧИТАЙТЕ из местоположения, но кто-то должен НАПИСАТЬ в это место. Чтобы любой старый процесс записывал мусор в место, используемое операционной системой, он должен быть защищен от доступа к пользовательскому режиму. Чтобы приложение могло получить доступ к этому местоположению, ему необходимо сделать это в режиме ядра. Следовательно, это нужно делать как системный вызов.

0

Я не вижу проблем с безопасностью при экспонировании pid для обработки. Операционная система принудительно изолирует пространство адресов процесса. Если я правильно помню, первый вызов getpid() - это системный вызов, но будущие вызовы getpid() кэшируются (возможно, libc) и обрабатываются локально.

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