Необходимость некоторых системных вызовов

Необходимость некоторых системных вызовов

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

Например, в create() и read() файлах, почему это не может произойти в пользовательском пространстве или пользовательском режиме? Как пользователь может повредить систему, создавая и читая файл? У меня есть те же сомнения и в случае системного вызова close().

решение1

Я не понимаю, почему некоторые системные вызовы, такие как create() file, read() file и close(), должны выполняться только в режиме ядра.

Ну, системные вызовы по определению выполняются в режиме ядра. В пространстве пользователя они обычно доступны через библиотечные функции-обертки, имеющие то же имя. Из man 2 intro:

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

(смотрите также man 2 syscall)

Как отметили @dirkt и @StephenKitt в комментариях, упомянутые вами системные вызовы должны выполняться в пространстве ядра, поскольку им приходится записывать данные в таблицу дескрипторов файлов, обращаться к драйверам для ввода-вывода файлов, проверять права доступа и т. д.

решение2

Например, в файле create()и read()почему это не может произойти в пользовательском пространстве?

На некоторых платформах (включая те, что основаны на Linux) вполне возможно запустить файловую систему ввода-вывода из пользовательского пространства. Это известно как FUSE, и вы можете прочитатьФайловая система в пользовательском пространстведля одного введения в тему.

Существует множество файловых систем на основе FUSE, включаяСШФС(файловая система поверх ssh) иS3QL(файловая система в облачном хранилище).

Ядро выступает посредником между клиентом пользовательского пространства (прикладной программой) и реализацией FUSE, что обеспечивает проверку и согласованность семантики файловой системы, но фактический код ввода-вывода для creat(), open(), read(), write(), fcntl(), close()и т. д. запускается из службы пользовательского пространства.

Связанный контент