Eu entendo muito bem como funciona a chamada do sistema e a necessidade de chamadas do sistema em geral. No entanto, não entendo por que algumas chamadas do sistema, como arquivo create (), arquivo read () e close (), devem ser executadas apenas no modo kernel.
Por exemplo, no arquivo create () e read (), por que isso não pode acontecer no userspace ou no usermode? Como o usuário poderia danificar o sistema criando e lendo um arquivo? Eu tenho a mesma dúvida no caso de chamada de sistema close() também.
Bem, as chamadas do sistema, por definição, são executadas no modo kernel. No espaço do usuário, eles geralmente estão disponíveis por meio de funções wrapper de biblioteca com o mesmo nome. De
man 2 intro
:(veja também
man 2 syscall
)Como dito por @dirkt e @StephenKitt nos comentários, as chamadas do sistema que você mencionou precisam ser executadas no espaço do kernel porque precisam escrever na tabela do descritor de arquivo, acessar os drivers para E/S de arquivo, verificar os direitos de acesso etc.
Em algumas plataformas (incluindo as baseadas em Linux), é bem possível executar IO do sistema de arquivos a partir do espaço do usuário. É conhecido como FUSE e você pode ler Filesystem in Userspace para uma introdução ao tópico.
Existem muitos sistemas de arquivos baseados em FUSE disponíveis, incluindo SSHFS (sistema de arquivos sobre
ssh
) e S3QL (sistema de arquivos em armazenamento em nuvem).O kernel medeia a camada entre o cliente do espaço do usuário (um programa aplicativo) e a implementação do FUSE para que a semântica do sistema de arquivos seja validada e consistente, mas o código IO real para
creat()
,open()
,read()
,write()
,fcntl()
,close()
etc. - serviço de espaço.