Escolar Documentos
Profissional Documentos
Cultura Documentos
Viso Geral
Linux um kernel m onoltico Sm bolos exportados para todo o sistem a Dificuldade de adio de APIs, hardware
Viso Geral
Kernel m odular
Viso Geral
Obteno
Livrem ente disponvel na Internet Acesso pode ser feito de vrios repositrios Link para o projeto
http:/ / www.kernel.org http:/ / www.br.kernel.org/ Os principais desenvolvedores tem contas neste servidor
5
2.6 vs 2.4
2.6 m ais fcil de escrever drivers; Menor latncia; Maior escalabilidade; Escalonador m ais esperto; Suporte a goodies para m dulos;
Patchsets
A rvore do Linus ou do m antenedor considerada oficial Existem outras! MM: Andrew Morton responsvel;
Finalidade: Testar patches para entrarem depois no 2.6 vanilla (oficial) Finalidade:
Suporte a novo hardware; Modificaes intrusivas no kernel do kernel (m m , net e escalonam eto);
7
Patchsets
Finalidade:
Configurao
cd <cam inho do kernel/ > m ake m enuconfig/ xconfig m ake clean bzIm age m odules m odules_install;
Estrutura de diretrios
fs include init
10
Mdulos
11
Mdulos
Com o se usa?
12
Mdulos
Escrevendo m dulos:
static init oi_init(void) { printk (KERN_ALERT Bom Dia!\ n); return 0; } static void oi_exit (void) { print k (KERN_ALERT Bom alm oo!\ n); }
13
Mdulos
Com o com pila? No 2.4: gcc -D__KERNEL__ -DMODULE -c <arquivo.c> -Wall No 2.6:
14
Mdulos
Makefile:
MODULE:= <nom e do m dulo>.ko obj-m := <nom e do m dulo>.o default: m ake -C / usr/ src/ linux SUBDIRS=`pwd` m odules
No shell: $ m ake
15
Mdulos
Parm etros
m odprobe m eu_m odulo.ko inteiros=1 string=ola! insm od m eu_m odulo.ko inteiros=1 string=ola!
16
Mdulos
Parm etros
Com o se program a isso? m odule_param (nom e, tipo, perm s); m odules_param _nam ed (nom e, variavel, tipo, perm s);
17
Mdulos
Parm etros
18
Mdulos
Parm etros staticintnumero; module_param(numero,int,0);
19
Exerccio
Criem 1 m dulo que recebe um a string com o parm etro e um nm ero inteiro
20
Funcionamento do kernel
Espao de usurio
Funcionamento do kernel
Driver tenta registrar um m ajor/ m inor Se conseguir, realiza com unicao sobre esse dispositivo ls -l / dev/ dsp open (/ dev/ dsp, O_RDONLY) Fala com o driver que registrou para si os m ajor/ m inor 14,3
22
Program a de usurio
Classes de dispositivos
Character devices
Block devices
23
24
Classe de Dispositivos
ls -l / dev/ psaux
crw-r----- 1 root root 10, 1 Dec 31 1969 psaux
Driver de caractere
Major number
Minor number
25
Classe de Dispositivos
Driver de caractere
Major number
Minor number
26
E pra que diabos serve o m inor num ber? Quem responder ganha um a...
27
E pra que diabos serve o m inor num ber? Quem responder ganha um a... SALVA
DE
PALMAS!
28
E pra que diabos serve o m inor num ber? Para identificar qual dispositivo (m anipulado pelo m esm o driver) est sendo executado no m om ento / usr/ src/ linux/ Docum entation/ devices.txt
29
Classe de dispositivos
int register_chrdev(unsigned int m ajor, const char * nom e, struct file_operations *fops); int unregister_chrdev (unsigned int m ajor, const char *nom e);
30
Ioctls: Funes I/ O Control Perm ite passagens de parm etros em tem po de execuo, ao invs de apenas em tem po de carga
31
static struct file_operations driver_fops = { .owner = THIS_MODULE, .ioctl = driver_ioctl, .open = driver_open, .release = driver_release, };
32
O ... sinaliza que pode receber outro parm etro alm do parm etro inteiro. Existe um a extenso no GCC para perm itir a passagem de estruturas para o kernel
33
'inode' e 'file' so os valores do fd aberto e passado pela ioctl userspace. arg chega no kernel com o unsigned long, m as pode ser feito um cast para estruturas (geralm ente feito assim ).
34
Funes auxiliares:
int copy_to_user (void *destino, const void *origem , unsigned long count); int copy_from _user (void *destino, const void *origem , unsigned long count);
Copia estruturas Checa os ponteiros (apenas o incio) Retorna o nm ero de bytes no copiados
35
Exerccio
36
Exerccio
Im plem entem um driver pra fazer um m odem PCTel funcionar. Desculpa, no resisti :)
37
Exerccio
Im plem entar a ioctl 0xcafe, que troca o ID do dono do processo atual para o parm etro passado. Dicas:
current->uid = id_que_o_usuario_passou;
38