[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

RE: EP1



Nelson Guedes Paulo Junior writes:
 > Como faço para descobrir que a leitura chegou no fim do arquivo? Em
 > outras palavras: Como eu descubro que acabou a leitura?

A chamada linux_read retorna em eax o número de bytes lidos. Zero
indica final de arquivo.

 > Aonde posso obter alguma referencia sobre a INT 80H do Linux?

A documentação do Linux não é em termos da INT 80H (cujo uso não é
recomendado) e sim em termos de "system calls" através da libc. Para
saber como funciona a "system call" read, diga

	 man 2 read

O "2" indica que você quer informações sobre a "system call" read, e
não sobre o comando read (na bash há um comando read). Para saber como
funciona a "system call" write, diga

         man 2 write

Essas "system calls" fazem o mesmo as nossas linux_read e linux_write,
ou seja, cada uma delas faz o seguinte:

   1. Coloca em eax o código da chamada (o valor __NR_`nome_da_chamada'
      definido em /usr/include/asm/unistd.h).

   2. Copia os parametros (no máximo cinco) da pilha para os
      registradores ebx, ecx, edx, esi, edi (o primeiro parametro vai
      para ebx, os segundo para ecx, e assim por diante).

   3. Executa int 0x80.

   4. Se o valor de retorno da int 0x80 (devolvido em eax) for um número
      negativo N (que indica erro), coloca -N (um número positivo) na
      variável global errno e retorna -1 em eax.

Note que embora as "system calls" passem pela libc, a libc não faz nada
além de compatibilizar o modo de passar parâmetros e retornar códigos de
erro. Cada "system call" é praticamente uma chamada à int 0x80. Por isso
não há necessidade de documentação no nível da int 0x80 (em termos dos
registradores da CPU), a documentação das "system calls" (em termos de
funções C) é suficiente.

A lista de todas as "system calls" e seus códigos está no arquivo

     /usr/include/asm/unistd.h

Para obter informações sobre uma "system call" qualquer, diga

     man 2 nome_da_system_call

Portanto o que a documentação do Linux chama de "system calls" é na
verdade um conjunto de rotininhas de interfaceamento com a int 0x80. Uma
chamada direta à int 0x80 é uma "direct system call". É bom deixar claro
que esse conjunto de rotininhas é uma parte muito pequena (ínfima,
pode-se dizer) da libc, que faz muitas outras coisas. As funções da libc
que não são "system calls" (ou seja, que fazem mais do que simplesmente
compatilizar a passagem de parâmetros e executar int 0x80) estão em
outra seção do manual do Linux/Unix. Assim, para obter informações sobre
a função fread (que não é uma "system call"), voce deve dizer

     man 3 fread

As "system calls" estão na seção 2 do manual, as demais funções de
biblioteca estão na seção 3.

Mais uma dica: em vez de chamar `man' da linha de comando, voce pode
usar o `xman', selecionar a seção do manual desejada e depois selecionar
um ítem dentro da seção. Pode também chamar o `man' de dentro do emacs.
(Quem ainda estiver usando outro editor, mude para o emacs logo!)
É possível também ler páginas de manual via netscape (usando o dwww, por
exemplo).

Puxa, acabei escrevendo demais! Espero que isso ajude!

Reverbel