Programação no kernel Linux
Transcrição
Programação no kernel Linux
Programação no kernel Linux Felipe W Dam asio 1 Visão Geral ● Linux é um kernel m onolítico ● Sím bolos exportados para todo o sistem a ● Dificuldade de adição de APIs, hardware ● Problem as com escalabilidade 2 Visão Geral ● Kernel m odular ● Perm ite a carga/ descarga sob dem anda ● Facilita o desenvolvim ento ● APIs são definidas por sub-sistem a 3 Visão Geral 4 Obtenção ● Livrem ente disponível na Internet ● Acesso pode ser feito de vários repositórios ● Link para o projeto ● ● Existem outros links! ● ● http:/ / www.kernel.org http:/ / www.br.kernel.org/ Repositório central de desenvolvim ento ● Os principais desenvolvedores tem contas neste servidor 5 2.6 vs 2.4 ● 2.6 é m ais fácil de escrever drivers; ● Menor latência; ● Maior escalabilidade; ● Escalonador m ais “esperto”; ● Suporte a “goodies” para m ódulos; 6 Patchsets ● A árvore do Linus ou do m antenedor é considerada “oficial” ● Existem outras! ● MM: Andrew Morton responsável; ● ● Finalidade: Testar patches para entrarem depois no 2.6 “vanilla” (oficial) AC: Alan Cox responsável; ● Finalidade: ● Suporte a novo hardware; ● Modificações intrusivas no “kernel do kernel” (m m , net e escalonam eto); 7 Patchsets ● CK: Con Kolivas responsável; ● Finalidade: ● ● Escalabilidade; Perfom ance; ● Baixa latência; ● “Responsiveness”; ● Onde obter? ● http:/ / www.kernel.org/ pub/ linux/ kernel/ people/ 8 Configuração ● 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? 9 Estrutura de diretórios ● arch ● crypto ● Docum entation ● Drivers ● net/ ● Block/ ● ... ● fs ● include ● init 10 Módulos Pra que m ódulos? 11 Módulos ● Com o se usa? ● insm od ● depm od ● m odprobe ● lsm od ● rm m od (e isso funciona?) 12 Módulos ● 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 oço!\ n”); } m odule_init(oi_init); m odule_exit(oi_exit); MODULE_LICENSE(“GPL”) 13 Módulos ● Com o com pila? ● No 2.4: gcc -D__KERNEL__ -DMODULE -c <arquivo.c> -Wall ● No 2.6: ● Precisa ser criado um Makefile 14 Módulos ● 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 Módulos Parâm 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 Módulos Parâm 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 Módulos Parâm etros ● Tipos de dados padrão: ● Byte ● (u)short ● (u)int ● (u)long ● charp ● Bool 18 Módulos Parâm etros static int numero; module_param (numero, int, 0); 19 Exercício ● Criem 1 m ódulo que recebe um a string com o parâm etro e um núm ero inteiro ● Ela im prim e essa string 'i' vezes. 20 Funcionamento do kernel ● ● Espaço de usuário ● Enxerga arquivos ● Nom es, diretórios... Com o o kernel enxerga os dados? ● Alguém conhece o strace? ● strace ls / dev/ dsp 21 Funcionamento do kernel ● ● O kernel lida com núm eros ● Driver tenta “registrar” um m ajor/ m inor ● Se conseguir, realiza com unicação sobre esse dispositivo Program a de usuário ● 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 Classes de dispositivos ● Character devices ● ● Block devices ● ● Acessados byte a byte Transferência 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 entação 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 geração dele é dinâm ica. 30 Com unicação kernel/ user-space ● Ioctls: Funções “I/ O Control” ● Perm ite passagens de parâm etros em tem po de execução, ao invés de apenas em tem po de carga ● Ioctls estão disponíveis para am bos drivers de caractere e de bloco 31 Com unicação kernel/ user-space ● Im plem entação via file_operations static struct file_operations driver_fops = { .owner = THIS_MODULE, .ioctl = driver_ioctl, .open = driver_open, .release = driver_release, }; 32 Com unicação kernel/ user-space ● Im plem entação em user-space int ioctl (int fd, int cmd, ...); ● O “...” sinaliza que pode receber outro parâm etro além do parâm etro inteiro. Existe um a extensão no GCC para perm itir a passagem de estruturas para o kernel 33 Com unicação kernel/ user-space ● Tratam ento no driver int *(ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); ● 'inode' e 'file' são 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 unicação kernel/ user-space ● Funções 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 início) Retorna o núm ero de bytes não copiados 35 Exercício ● Im plem entem um driver pra fazer um m odem PCTel funcionar. 36 Exercício ● Im plem entem um driver pra fazer um m odem PCTel funcionar. ● Desculpa, não resisti :) 37 Exercício ● Im plem entar a ioctl “0xcafe”, que troca o ID do dono do processo atual para o parâm etro passado. ● Dicas: ● current->uid = id_que_o_usuario_passou; 38