O kernel simplesmente não usa chamadas de sistema ou o assembly está sendo montado antes de estar em um novo sistema? Eu posso precisar de mais informações sobre montadores, mas estou confuso que, se instruções como mov [register] são chamadas de sistema, como alguém usaria isso sem ter que se referir ao kernel de um sistema operacional confiável?
Por exemplo, digamos que estou fazendo um programa assembly com uma distribuição GNU/Linux e usando suas chamadas de sistema. Como o próprio Linux usa o assembly se não tiver kernel para fazer chamadas de sistema?
mov [register]
e similares não são chamadas de sistema, mas instruções do montador.As chamadas do sistema são basicamente um programa de espaço do usuário chamando sub-rotinas específicas no kernel, usando um mecanismo embutido no processador e configurado pelo kernel, que permite que a sub-rotina chamada tenha um nível de privilégio mais alto do que o espaço do usuário regular código do programa.
As instruções de montagem são basicamente uma representação amigável de bytes reais de código de máquina. E o código de máquina não é interpretado nem compilado, mas implementado dentro do processador ou com o microcódigo do processador, ou diretamente no nível do hardware, usando grandes grupos de portas lógicas.
Uma única chamada de sistema em linguagem assembler geralmente consiste em várias linhas de código. Primeiro os parâmetros para a chamada do sistema são carregados nos registradores apropriados do processador e/ou na pilha, e então uma instrução especial como
int 0x80
ousyscall
é usada para realmente fazer a chamada do sistema.Na arquitetura x86 de 32 bits, o
int 0x80
é usado como a instrução de chamada do sistema. O kernel preparou uma tabela de rotinas de tratamento de interrupção de software para o processador. Esta tabela não é acessível diretamente pelo código de espaço de usuário regular, mas usando aint
instrução o código de espaço de usuário pode acionar uma das rotinas apontadas pela tabela.int 0x80
simplesmente diz ao processador para mudar para o modo kernel e pular para a rotina cujo endereço está no slot #128 daquela tabela. Essa rotina é a interface de chamada de sistema do Linux para arquitetura x86 de 32 bits: ela verifica os parâmetros especificados, identifica qual processo fez a chamada e então salta para a sub-rotina apropriada.Na versão de 64 bits da arquitetura x86, há uma
syscall
instrução dedicada para a mesma finalidade. Na verdade, a arquitetura x86 de 32 bits agora também tem, mas ou ela ainda não existia quando a convenção de chamada do sistema Linux de 32 bits foi projetada por Linus Torvalds, ou a instrução tinha um bug de hardware em alguns modelos de processador, então não Acostume-se. Mas como todos os processadores x86 de 64 bits têm asyscall
instrução e ela definitivamente funciona, ela é usada.