Я в целом понимаю, как работает системный вызов и необходимость системных вызовов в целом. Однако я не понимаю, почему некоторые системные вызовы, такие как 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()
и т. д. запускается из службы пользовательского пространства.