Почему существуют системные вызовы - PullRequest
0 голосов
/ 31 мая 2018

Я читал о системных вызовах и о том, как они работают в Linux.У меня еще есть кое-что для чтения, но одна вещь, на которую я ничего не прочитал, - это то, ПОЧЕМУ нам нужны системные вызовы?

Я понимаю, что системные вызовы - это запросы от программы пользовательского пространства к ядру, чтобы что-то сделать,но мой вопрос в основном: почему программа пользовательского пространства не может сделать это сама?Почему Glibc не выполняет фактическую операцию вместо того, чтобы быть просто оболочкой для системного вызова?

Например, если я вызываю fopen() в моей программе, почему glibc вызывает системный вызов open?Почему glibc просто не выполняет саму операцию?

Я понимаю, что это означало бы, что у разработчиков glibc было бы гораздо больше работы, и что они должны были бы иметь глубокие знания Linux, но не glibcуже очень тесно связаны с ядром Linux?

Кроме того, я понимаю, что функции системного вызова выполняются в цикле 0 в ЦП ... но какой в ​​этом смысл?Если я выполняю программу, я даю ей явное разрешение на запуск, поэтому какую защиту можно добавить, отделяя, какой код можно запускать в разных контекстах, поскольку вы все равно даете ей все разрешения?

Ответы [ 7 ]

0 голосов
/ 01 июня 2018

1 - Вы не хотите иметь дело с аппаратными средствами связи низкого уровня.По крайней мере, большинство людей этого не делают.Каждая из них имеет сотни команд.

2 - допустите простую ошибку, и ваш ЦП / ОЗУ или устройство ввода-вывода могут быть бесполезны навсегда.

3- Когда вы являетесь частью сетиВы можете поделиться ресурсами.Системные вызовы и ядро ​​защищают вашего коллегу от повреждения вашего жесткого диска.

0 голосов
/ 07 июня 2018

Полный ответ на ваш вопрос очень широкий, но позвольте мне привести простой пример, основанный на вашем вопросе о fopen.

Допустим, у нас большая система, в которой сотни или тысячи пользователей.Одним из таких пользователей является, скажем, отдел кадров с файлами, содержащими конфиденциальную информацию о сотрудниках.

Если к этому диску можно получить доступ по желанию в режиме пользователя, тогда любой человек в системе сможет открыть любой файл в системе,в том числе с конфиденциальной информацией.

Другими словами, операционные системы управляли ресурсами SHARED.К ним относятся диск, процессор и память.Если бы ими можно было управлять в режиме пользователя, не было бы никакого способа гарантировать, что они были распределены справедливо.

0 голосов
/ 31 мая 2018

Если бы код, сгенерированный реализацией C, был единственным, что собирался работать на целевой системе (как это было бы для многих автономных реализаций и для очень небольшого числа размещенных реализаций) и если реализация знала точно на каком оборудовании он будет работать (правда, для некоторых автономных реализаций, но редко для хостовых), его библиотека времени выполнения могла бы выполнять такие операции, как «fopen», напрямую взаимодействуя с оборудованием хранилища.Однако редко применяется какое-либо условие, а тем более и то и другое.

Если запоминающее устройство будет использовать несколько программ, обычно необходимо, чтобы они либо каким-либо образом координировали свои действия, либо последовательностиоперации, выполняемые различными программами, не перекрываются, и каждая программа «забывает» все, что, по ее мнению, она знает о состоянии хранилища, каждый раз, когда другая программа могла бы записать в нее.

В противном случае, предположим, что диск содержит одинФайл и программа # 1 используют «fopen», чтобы открыть его для чтения.Каждый сектор каталогов содержит 8 записей, поэтому программа считывает первый сектор каталогов и отмечает, что слот № 0 идентифицирует интересующий файл, в то время как № 1- № 7 пусты.

Теперь предположим, что программа №2 использует «fopen» для создания файла для записи.Он считывает сектор каталогов, наблюдает, что слоты № 1- № 7 пусты, и переписывает сектор каталогов с информацией о новом файле в слоте № 1.

Наконец, предположим, что программа # 1 хочет записатьфайл.Если он не знает о программе # 2, он может разумно полагать, что знает, что содержит каталог (он прочитал его ранее, и у него нет оснований полагать, что он изменился), поместить информацию о новом файле в слот # 1 изамените сектор каталога на диске новой версией, уничтожив запись, написанную программой №2.

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

Вопреки тому, что говорят другие ответы, даже реализации микрокомпьютера C, работающие на платформах, таких как MS-DOS, по существу всегда полагались на ОС для файлового ввода-вывода.Некоторые включали бы свои собственные подпрограммы консольного ввода-вывода, потому что те в MS-DOS были примерно в четыре раза медленнее, чем они должны были быть, но необходимость координации при использовании файлового ввода-вывода означала, что очень немногие программы попытались бы сделать этосами по себе.

0 голосов
/ 31 мая 2018

Если ранее бездействующий диск вращался в течение двух секунд или сетевой диск подключался в течение тридцати секунд, что будет делать библиотека?

0 голосов
/ 31 мая 2018

Другое соображение заключается в том, что ядро ​​ОС должно предоставлять абстракцию для множества различных типов оборудования через единый API - без которого вы бы неизменно делали вызовы для конкретных устройств в вашей программе.

0 голосов
/ 31 мая 2018

Почему glibc просто не выполняет саму операцию?

Ну, тем более, как обстоят дела в старых добрых системах MS / DOS: нет разделения между кодом ядра и пользователемкод и пользовательский код могут с легкостью получить прямой доступ к аппаратному обеспечению.

У этого просто есть 2 основные проблемы:

  • Он работает (скорее) хорошо для одного пользователя, а не для системы многозадачности,но как только несколько программ могут одновременно запускаться в системе, вам необходимо синхронизировать аппаратные обращения и использование памяти => это те части, которые посвящены ядру
  • Нет защиты системы от плохо закодированной программы,В современной ОС ошибочная программа может аварийно завершить работу, но сама система должна выжить.В MS / DOS сбой программы обычно заканчивался перезагрузкой системы.

По этим причинам все современные ОС (за исключением, возможно, некоторых встроенных) используют изоляцию между различными пользовательскими процессами и ядром.И это просто означает, что вам нужен способ, позволяющий процессу пользовательского режима требовать привилегированного действия (чтение или запись физического диска - это ) из ядра: именно для этого и создаются системные вызовы.

0 голосов
/ 31 мая 2018

Почему glibc просто не выполняет саму операцию?

Краткий ответ: потому что не может.


Длинный ответ: программа работаетв Linux может работать в двух режимах: UserLand или KernelLand.

Kernel Land обладает всеми правами и может делать все, включая общение с оборудованием или предоставление обратных вызовов в пользовательском пространстве.Например, когда вы вызываете fopen(), ядро ​​делает весь грязный разговор с вашей файловой системой (например, ext4), кеширование, все, вплоть до общения с контроллером SATA для доступа к данным на жестком диске.

GLibc мог бы сделать это, используя устройство, представленное ядром в /dev, но это означало бы перекодирование с нуля всех слоев файловой системы, сокетов, межсетевого экрана ...

Ядро просто предоставляетПростой в использовании API для программистов, чтобы иметь повышенные права и общаться с устройствами. Вот так создается Linux (и большинство современных ОС).

Какая защита добавляется путем разделения того, какой код можно запускать в разных контекстах, поскольку вы все равно даете ему все разрешения?

Разрешения управляются ядром.Если у вас нет системного вызова, у вас нет прав.Или программа, которую вы запускаете, должна проверить собственное разрешение?Еще раз, это будет заново изобретать колесо каждый раз.

...