Como a chamada do sistema é executada [fechada]

2

Do ponto de vista do programador de aplicativos, a chamada do sistema é apenas a invocação de um procedimento da biblioteca do wrapper. Como não tenho bons conhecimentos de montagem, fiquei imaginando como isso é feito no nível mais baixo. De que outra forma uma aplicação pode invocar a chamada do sistema sem usar a biblioteca?

    
por Arkonix 25.02.2014 / 22:40

1 resposta

3

As chamadas do sistema são dependentes da arquitetura, mas todas compartilham características semelhantes.

Em x86, as chamadas do sistema são feitas por meio de interrupções de software ou por meio de uma instrução especial "systenter". O Linux também pode usar, mas uma interrupção de software é mais comum. No tempo de inicialização, o kernel configura manipuladores para interrupções, ambas as interrupções geradas pelo hardware e aquelas geradas pelo software. No x86 há uma instrução de montagem especial 'int' que gera uma interrupção de software. O kernel configurou um manipulador para que a interrupção do software 0x80 seja a interrupção da chamada do sistema.

Esta tabela mostra cada possível chamada do sistema e seus parâmetros e como eles pode ser passado. Como você pode ver, um número no registro eax indica qual chamada de sistema. Os outros registradores apontam para algum parâmetro para a chamada do sistema.

Assim, o software do usuário simplesmente configura os parâmetros corretos nos registradores e, em seguida, emite a interrupção 0x80. O kernel tem o manipulador configurado para interpretar a chamada do sistema, executar a função e retornar os registros modificados com qualquer valor de retorno possível.

Embora as funções de invólucro façam isso e geralmente de maneira portátil, não há motivo para você não poder escrever algum assembly embutido em nenhum código C / C ++ para emitir uma chamada de sistema diretamente. Você só precisa de um conhecimento básico de montagem: Mova os dados corretos nos registros corretos e, em seguida, emita 'int 0x80'

    
por 26.02.2014 / 02:09