Eu entendo perfeitamente como funciona a chamada do sistema e a necessidade das chamadas do sistema em geral. No entanto, não entendo por que algumas chamadas de sistema como create() file, read() file e close() devem ser executadas apenas no modo kernel.
Por exemplo, nos arquivos 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? Também tenho a mesma dúvida no caso de chamada de sistema close().
Responder1
Não entendo por que algumas chamadas de sistema como create() file, read() file e close() devem ser executadas apenas no modo kernel.
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 que possuem o mesmo nome. De man 2 intro
:
Uma chamada de sistema é um ponto de entrada no kernel do Linux. Normalmente, as chamadas do sistema não são invocadas diretamente: em vez disso, a maioria das chamadas do sistema possuem funções correspondentes de wrapper da biblioteca C que executam as etapas necessárias (por exemplo, trapping para o modo kernel) para invocar a chamada do sistema. Assim, fazer uma chamada de sistema é o mesmo que invocar uma função normal de biblioteca.
(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 de descritores de arquivos, acessar os drivers para E/S de arquivos, verificar direitos de acesso etc.
Responder2
Por exemplo, em
create()
umread()
arquivo, por que isso não pode acontecer no espaço do usuário?
Em algumas plataformas (incluindo aquelas 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 lerSistema de arquivos no espaço do usuáriopara uma introdução ao tema.
Existem muitos sistemas de arquivos baseados em FUSE disponíveis, incluindoSSHFS(sistema de arquivos encerrado ssh
) eS3QL(sistema de arquivos no 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 espacial.