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.