Nesse laboratório vamos explorar a interface com o sistema operacional.
Para começar, pegue o
programa em C, que copia o arquivo dado na linha
de comando para a saída padrão (tela), e
salve-o em um arquivo copia.c
.
Compile e execute esse programa, testando-o com alguns
arquivos texto como entrada:
> gcc -Wall -o copia copia.c > ./copia arquivodeentrada
copia.c
.
A rotina main
chama quatro funções definidas no
mesmo arquivo: myopen
, myread
, mywrite
e myclose
.
cada uma dessas funções é implementada por uma única linha, que
contém uma chamada ao sistema operacional.
As chamadas ao sistema operacional são documentadas na seção 2 do manual
do linux.
Para ver a documentação de uma delas, basta escrever, por exemplo:
> man 2 open
chamadas.s
,
e comece com a função myopen
.
Comente a definição (não o protótipo!) dessa função
no arquivo copia.c
e declare-a
como pública (globl
) em chamadas.s
,
programe-a (ver abaixo), e compile tudo agora com:
> gcc -Wall -m32 chamadas.s copia.cPara saber o código das chamadas ao sistema, consulte a tabela de chamadas ou o arquivo "/usr/include/asm/unistd.h" Observe os seguinte pontos:
int $0x80
man 2 open
, por exemplo) devem ser passados em %ebx, %ecx, ...,
copia.c
e substituindo-a pela
implementação em assembler em chamadas.s
.
A implementação em assembler de chamadas a serviços do sistema
operacional que você acabou de fazer é
semelhante à implementação das funções (chamadas funções wrapper)
open
, read
, write
e close
, disponíveis na biblioteca C.