comp coop 10

13/05/2009

Como adicionar System Call no Minix

Filed under: disciplina, tutorial — Tags:, — Yuri Duarte Corrêa @ 10:21 am

Tutorial sobre Minix, feito por um aluno do COOP09. Autorizado.

Yuri

Aeeee galera esperta…

Agora que a gente sabe como compilar uma bosta em C nesse lixo.. e eu entendi o que é system call, vamos brincar de adicionar uma no minix….

Adicionar uma system call no minix (acredito que em outros SOs) passam por dois passos:

– Escrever um system call handler
– Escrever uma user lib

O handler é a função que é chamada em resposta a uma requisicao ao system call… E vale o 1×1, cada system call tem apenas um handler…

A lib empacota os parametros que a system call precisa e chama o handler no server apropriado… o usuario sempre invoca a system call pela lib!

User -> Lib -> Handler

Importante salientar que o handler deve ser associado ao seu correto server, exemplo dado, se a system call atualiza/altera algum arquivo, tem que estar no FS (filesystem) server…

Abaixo segue como criar uma system call que imprime alguma coisa…

1) Os servers estão listados no diretório /usr/src/servers

# cd /usr/src/servers

2) Viram que todos estao separados? O fs é um deles…

3) Instalem os dedos a chatice ta só começando…. seguinte… dentro do diretorio fs, tem dois arquivos, o table.c e o proto.h… blz? Deem um elle neles e olhem a cara dos arquivos.. O table.c contem os index das system calls que serão chamadas em um array, então o que a gente tem que fazer é procurar um espaço não utilizado (no_sys) e adicionar a nossa system call feupuda lá… deem um elle no table.c, e adicionem a sys call desejada exemplo, aconselho vcs a usarem o 64, depois falo pq:

do_printshit,   /*  XX = printshit */     // neste caso antes haveria um “no_sys,    /* XX unused */”
// Decorem o valor que está no XX!!!!

4) ok… fecha o elle (Ctrl+W e depois Esc+X -> yes), agora abre o proto.h com o elle… ele contem todos os prototypes das system calls… entao adicionem a prototype da nova sys call, exemplo:

_PROTOTYPE( int do_printshit, (void) );
// Procurem o comentario com o misc.c e adicionem esse prototype lá, pq a gente vai adicionar a nossa declaracao nesse arquivo, eu to seguindo um tutorial e facilitando pra galera, mas da pra criar em um arquivo separado, é tao simples quanto, é só alterar o Makefile depois…

agora dentro do /fs, acessem o arquivo misc.c, como falei da pra colocar em arquivo separado… e adicionem o codigo:

int do_printshit()
{
printf(“\nMensagem qualquer… welcome to your doom!!\n”);
return (0); //ou return(OK);
}

ok.. next…

5) Blz? Adicionado o prototype e o codigo da syscall voltem para o diretorio dos servers /usr/src/servers… e vamos compilar os servers bonitamente, executem em seguida:

make image // Se der algum erro, olhem o mesmo e vejam se voces alteraram o talbe.c ou o proto.h direito…
make install // Sucesso?

6) Blz… a chatice vai começar agora… ainda tá longe, AUEhiAEhUAehiAHiuhAe…. Decoraram o valor do XX? Não.. putz… olha lá de novo!!! Vamos aprender a chamar o handler direto? Legal né? não… Existe uma system call chamada _syscall que pode ser utilizada para chamar system calls diretamente, olhem a declaracao dela:

PUBLIC int _syscall(int who, int syscallnr, register message *msgptr);

Blz, o who é o server recipiente, no caso o FS, o syscallnr é o numero da system call, no seu caso o XX, e o message é um struct que contem os parametros da syscall que é uma novela.. não vou entrar em detalhes dele pq eu ainda não o entendi direito…

Então pra chamar direto, como a nossa syscall num tem parametros entao o ponteiro do message vai sem nada…

message m;
_syscall(FS,XX,&m);

7) Chato né? pois é… tem mais… antes de mais nada, para usar a message structure nos nossos programas é só dar include na lib.h (#include <lib.h>). Blz? Agora vamos pro segundo passo que é criar a lib… dois arquivos importantes:

/usr/src/include/minix/callnr.h
/usr/include/minix/callnr.h

blz? Adicionem nele um #define com o XX que voces associaram,por exemplo:

#define PRINTSHIT XX

ok? Entenderam pq pedi pra usar o 64…

8) Agora vamos pra parte interessante, vao para o diretorio /usr/src/lib/posix/, nele a gente vai criar a lib em c, neste caso _printshit.c, blz? entao comecem com um elle _printshit.c e escrevam:

#include <lib.h>
#include <unistd.h>
PUBLIC int printshit(void)
{
message m;
return(_syscall(FS,PRINTSHIT,&m));
}
CTRL+W, ESC+X-> Yes…

9) blz… quase lá…mais um pouco… agora no diretorio do posix, vamos adicionar o nome do arquivo que criamos no Makefile.in… elle nele!!!

adicionem algo parecido com:

_pipe.c \    // ja ta la
_printshit.c \   // adicionem igual ta o exemplo no arquvio
_ptrace.c \ // ja ta la tambem…

blz?

agora: entrem com “make Makefile”

voltem para o diretorio /usr/src/ e nele entrem com: “make libraries”

pronto! compilada e instaladas as libs do posix…

10) Acabou? não… Agora a gente vai ter criar uma nova imagem de boot para dar merge nos bins no minix… se nao num vai dar para usar a syscall, vao para /usr/src/tools

make hdboot //blz… entrem com isso e criem a nova imagem de boot
make install //entrem com isso tambem depois do hdboot

Agora gravem, anotem, sei la, o nome da imagem que foi criada, a gente vai bootar com ela da proxima vez, ok? o nome vai ser criado em /boot/image, no meu caso foi criar a 3.1.2ar3, ok?

Agora shutdown no minix!

11) Quando aparecer a entrada para boot (d0p0s0> ) vcs vao associar a imagem criada da seguinte forma:

image=/boot/image/3.1.2ar3 (no meu caso foi esse, vejam o de vcs e adaptem)

depois disso é só bootar normal: “boot” só o boot mesmo…

12) PRONTO!!!! Agora dá pra usar essa merda de syscall…. façam um programinha exemplo igual o que a gente fez do hellworld, saca só:

#include <stdio.h>
int main(void)
{
printshit();
}

13) Vcs vao receber a mensagem que vcs colocaram no printf… assim espero… se nao conseguirem ou encontrarem erros, favor avisar!

Wilson Leão, COOP09.

Anúncios

8 Comentários »

  1. Cara, sou iniciante e tentei seguir a risca mas no passo 6 não dá certo,o que deveria acontecer?quando digito “message m;”aparece :”no such file or directory”,não sei em que diretório devo executar o comando.
    Outra,o no passo 9 não tem um arquivo “Makefile.in”, só tem um “Makefile”, além disso nesse makefile que tem,só tem arquivos “.o” e não “.c” como colocaste.Explica melhor estas dúvidas por favor! 🙂

    Comentário por júnior moura — 02/06/2009 @ 5:29 pm

    • Cara, o passo 6 é só explicação, não é para digitar nada :p vc implementa oq ele menciona no passo 6 no passo 8.

      No passo 9 certifique-se que está na pasta posix mesmo, pois tem q ter um arquivo Makefile.in…modificar o Makefile (sem .in) é loucura, neste caso
      vc tentou digitar elle (ou mined) Makefile.in para ver oq acontece?

      Comentário por Fernando Nobre — 09/06/2009 @ 8:28 pm

      • blz, entendi como é a parada! agora ta funfando legal!

        Comentário por júnior moura — 10/06/2009 @ 3:59 pm

  2. Muito bom.
    Entendi perfeitamente como é que faz uma system call sem passagem de parametro.

    Agora, como seria com passagem de parametro?

    por exemplo: printshit(var);

    Tentei fazer mas paro no passo 7:

    #include
    #include
    PUBLIC int printshit(void)
    {
    message m;
    return(_syscall(FS,PRINTSHIT,&m));
    }

    como seria??

    Comentário por Jean — 27/10/2009 @ 12:15 pm

  3. Cara, eu não sei nem se você vai ver esse comentário, mas tomara Deus que sim!
    Estou fazendo um trabalho que é alterar o kernel do minix, e logo no primeiro passo, quando tenho que alterar o arquivo table.c, ele da um erro: READ ONLY FILE. Ai eu fui lá e usei o comando: CHMOD 755. Então ele da outro erro (¬¬): READY-ONLY FILE SYSTEM. Então eu fui dar um rw mount -o remount rw table.c, ele da RW not found! ¬¬’

    Agora eu já não sei o que fazer, você pode me ajudar?

    Comentário por Gabriel — 10/09/2010 @ 5:49 pm

  4. não encontrei a pasta fs dentro de /usr/src/servers.
    Tinha uma ext2. Tentei fazer nela e nada!

    Comentário por Vinícius Pádua — 14/02/2011 @ 9:47 am

  5. Por Favor ME AJUDA! Parei no PASSO 2, “VIRão que todos estao separados?!?!?!” nao vi nao!!!
    Digitei esse comando :# cd /usr/src/servers
    mas apareceu : #
    qq eu faço agora ?!?!
    Agradeço ajudas!!!

    Comentário por Luisa — 28/08/2011 @ 5:40 pm

    • O comando cd só muda de diretório, se o comando estiver certo ele nao dá feedback, se estiver errado ele vai acusar erro. O comando pwd mostra o diretório corrente que vc está navegando. E o ls mostra os arquivos que estao no diretório.

      Comentário por Zé das Couves — 20/09/2011 @ 8:00 pm


RSS feed for comments on this post. TrackBack URI

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Blog no WordPress.com.

%d blogueiros gostam disto: