Você está na página 1de 38

Programao no kernel Linux

Felipe W Dam asio

Viso Geral

Linux um kernel m onoltico Sm bolos exportados para todo o sistem a Dificuldade de adio de APIs, hardware

Problem as com escalabilidade

Viso Geral

Kernel m odular

Perm ite a carga/ descarga sob dem anda

Facilita o desenvolvim ento APIs so definidas por sub-sistem a

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

Existem outros links!

Repositrio central de desenvolvim ento

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:

AC: Alan Cox responsvel;

Suporte a novo hardware; Modificaes intrusivas no kernel do kernel (m m , net e escalonam eto);
7

Patchsets

CK: Con Kolivas responsvel;

Finalidade:

Escalabilidade; Perfom ance; Baixa latncia; Responsiveness;

Onde obter? http:/ / www.kernel.org/ pub/ linux/ kernel/ people/


8

Configurao

cd <cam inho do kernel/ > m ake m enuconfig/ xconfig m ake clean bzIm age m odules m odules_install;

Vam os configurar um kernel?

Estrutura de diretrios

arch crypto Docum entation Drivers


net/ Block/ ...

fs include init
10

Mdulos

Pra que m dulos?

11

Mdulos

Com o se usa?

insm od depm od m odprobe lsm od rm m od (e isso funciona?)

12

Mdulos

Escrevendo m dulos:

# include <linux/ init.h> # include <linux/ m odule.h> # include <linux/ kernel.h>

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); }

m odule_init(oi_init); m odule_exit(oi_exit); MODULE_LICENSE(GPL)

13

Mdulos

Com o com pila? No 2.4: gcc -D__KERNEL__ -DMODULE -c <arquivo.c> -Wall No 2.6:

Precisa ser criado um Makefile

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

Passados em user-space para o insm od/ m odprobe

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

Tipos de dados padro:


Byte (u)short (u)int (u)long charp Bool

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

Ela im prim e essa string 'i' vezes.

20

Funcionamento do kernel

Espao de usurio

Enxerga arquivos Nom es, diretrios...

Com o o kernel enxerga os dados?

Algum conhece o strace? strace ls / dev/ dsp


21

Funcionamento do kernel

O kernel lida com nm eros


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

Acessados byte a byte

Block devices

Transferncia em blocos (Hds)

Am bos apresentam entradas no / dev

23

Major/ Minor Num bers

Com o o kernel sabe quando um dispositivo de bloco ou de caractere?

Pelo tipo do dispositivo!

Com o o kernel sabe qual driver vai processar aquele dispositivo?

Pelo m ajor num ber!

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

Com o se criam aquelas entradas no / dev? m knod / dev/ psaux c 10 1


crw-r----- 1 root root 10, 1 Dec 31 1969 psaux

Driver de caractere

Major number

Minor number

26

Major/ Minor Num bers

E pra que diabos serve o m inor num ber? Quem responder ganha um a...

27

Major/ Minor Num bers

E pra que diabos serve o m inor num ber? Quem responder ganha um a... SALVA

DE

PALMAS!

28

Major/ Minor Num bers

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

Im plem entao de char drivers

Registro do m ajor num ber

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);

nam e a entrada que fica em / proc/ devices

Com m ajor == 0, a gerao dele dinm ica.

30

Com unicao kernel/ user-space


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

Ioctls esto disponveis para am bos drivers de caractere e de bloco

31

Com unicao kernel/ user-space

Im plem entao via file_operations

static struct file_operations driver_fops = { .owner = THIS_MODULE, .ioctl = driver_ioctl, .open = driver_open, .release = driver_release, };

32

Com unicao kernel/ user-space

Im plem entao em user-space


int ioctl (int fd, int cmd, ...);

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

Com unicao kernel/ user-space

Tratam ento no driver


int *(ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);

'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

Com unicao kernel/ user-space

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

Im plem entem um driver pra fazer um m odem PCTel funcionar.

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