You are on page 1of 20

Sumrio a

Introduo `s mensagens ca a

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

Criando uma System Call no Minix


Tarc E. M. Crocomo sio
Universidade Federal de Santa Catarina

25 de Maio de 2011

Sumrio a

Introduo `s mensagens ca a

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

Dissecando a funo syscall ca

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

Denindo nosso syscallnr

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

Ou ser que no? a a

Sumrio a

Introduo `s mensagens ca a

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

Criando nosso wrapper


Criar o wrapper bem simples. Basicamente, iremos at e e /usr/src/lib/posix e criaremos o arquivo mycall.c com a nossa funo: ca /usr/src/lib/posix/ mycall.c #include <lib.h> PUBLIC int mycall(int nro) { message m; m.m1_i1 = nro; return(_syscall(FS, MYCALL, &m)); }

Sumrio a

Introduo `s mensagens ca a

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

Recompilando as bibliotecas

Por m, v at /usr/src/tools e execute make libraries. a e

Sumrio a

Introduo `s mensagens ca a

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

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

Criando nossa syscall

Criando nossa funo wrapper ca

Testando nossa syscall

E-mail: tarcisio.crocomo@inf.ufsc.br

You might also like