Professional Documents
Culture Documents
Introduo `s mensagens ca a
25 de Maio de 2011
Sumrio a
Introduo `s mensagens ca a
Sumrio a
Introduo ao sistema de mensagens. ca Criando nossa syscall Criando nossa funo wrapper ca Testando nossa syscall
Sumrio a
Introduo `s mensagens ca a
A funo syscall ca
No Minix, as chamadas de sistema, quando no esto sendo a a acessadas por funes wrapper de bibliotecas, so feitas por co a mensagens. Essas mensagens so passadas pela funo a ca /usr/include/lib.h syscall(int who, int syscallnr, message *messageptr)
Sumrio a
Introduo `s mensagens ca a
int who: O destinatrio da mensagem. Mais ` frente veremos a a quais podem ser. int syscallnr: O cdigo da chamada desejada. A chamada que o implementaremos ter o seu cdigo unico. a o message *messageptr: Ponteiro para uma struct que ser a utilizada para passar informaes para dentro da syscall, como se co fossem parmetros, j que no estamos usando uma funo a a a ca espec ca.
Sumrio a
Introduo `s mensagens ca a
Quem who? e
Os valores para who esto denidos em lib.h, e so os seguintes: a a /usr/include/lib.h #define MM PM PROC NR //servidor de processos #define FS FS PROC NR //servidor de filesystem
Sumrio a
Introduo `s mensagens ca a
Os nmeros das chamadas esto denidos em minix/callnr.h. u a Para denirmos o nosso, adicionamos uma linha em /usr/src/include/minix/callnr.h. No Minix 3.1.4 o nmero u 64 est livre. a /usr/src/include/minix/callnr.h #define MYCALL 64
Sumrio a
Introduo `s mensagens ca a
Denindo o servidor
Agora vamos ao nosso servidor. Utilizaremos o FS para atender nossa syscall. No arquivo /usr/src/servers/vfs/table.c deniremos a funo interna (handler) que ser executada quando nossa ca a chamada for passada ao FS.
Sumrio a
Introduo `s mensagens ca a
Denindo o servidor
O arquivo contm um grande array de ponteiros para funes. e co Vamos colocar a nossa na posio correta. Guie-se pelos ca comentrios. a /usr/src/servers/vfs/table.c no sys, /* 64 = unused */ virar a /usr/src/servers/vfs/table.c do mycall, /* 64 = minha syscall */
Observao: Documente bem o que est fazendo, nos padres dos comentrios ca a o a que j esto no arquivo, para ter uma boa forma de saber o que j fez. a a a
Sumrio a
Introduo `s mensagens ca a
Denindo o servidor
No arquivo /usr/src/servers/vfs/proto.h iremos colocar o prottipo de nossa funo handler. o ca /usr/src/servers/vfs/proto.h /* mycall.c */ PROTOTYPE( int do mycall, (void) );
Sumrio a
Introduo `s mensagens ca a
Implementando o handler
Para implementar nosso handler, temos duas opoes: c Utilizar um arquivo preexistente Criar nosso prprio arquivo o Criaremos um novo arquivo. O que isso muda que teremos e depois que adicion-lo no Makele, mas ajudar na organizao. a a ca
Sumrio a
Introduo `s mensagens ca a
Implementando o handler
Criaremos ento o arquivo mycall.c, com o seguinte contedo a u /usr/src/servers/vfs/mycall.c #include "fs.h" #include <stdio.h> PUBLIC int do_mycall() { int nro = m_in.m1_i1; /* m_in a mensagem e de entrada para toda syscall */ printf("O numero e %d\n", nro); return(OK); }
Sumrio a
Introduo `s mensagens ca a
Modicando o Makele
Por m, modicaremos o Makele adicionando mycall.o na varivel OBJ: a /usr/src/servers/vfs/Makefile OBJ = (...) mycall.o
Sumrio a
Introduo `s mensagens ca a
Compilando o sistema
Podemos ento recompilar o sistema. a cd /usr/src/tools make hdboot E temos nossa syscall pronta, para us-la basta reiniciar o sistema! a Fim!
Sumrio a
Introduo `s mensagens ca a
Sumrio a
Introduo `s mensagens ca a
O que falta?
Syscalls no so utilizadas por aplicaes externas diretamente por a a co chamadas ` syscall(). a Utiliza-se o que se chama de wrapper, ou seja, uma funo de ca biblioteca que envolve a chamada ` syscall(). a
Sumrio a
Introduo `s mensagens ca a
Sumrio a
Introduo `s mensagens ca a
Alterando o Makele
Agora abrimos o arquivo Makele.in e adicionamos nosso arquivo a ele: /usr/src/lib/posix/Makefile.in libc_FILES = " \ (...) \ _mycall.c \ (...) " E na mesma pasta, execute o comando make Makefile.
Sumrio a
Introduo `s mensagens ca a
Recompilando as bibliotecas
Sumrio a
Introduo `s mensagens ca a
Teste nal
Testar nossa syscall simples. Faamos um arquivo teste.c: e c /root/teste.c int main (void) { mycall(15); return 0; } E por m, cc -o teste teste.c dentro da pasta /root. Agora basta rodar (./teste) e se o resultado for O numero e 15 nossa syscall foi implementada com sucesso!
Sumrio a
Introduo `s mensagens ca a
E-mail: tarcisio.crocomo@inf.ufsc.br