programação no kernel linux - sdsl.unb.br · funcionamento do kernel o kernel lida com números...
TRANSCRIPT
![Page 1: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/1.jpg)
1
Programação no kernel LinuxProgramação no kernel Linux
Felipe W Damasio
![Page 2: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/2.jpg)
2
Visão GeralVisão Geral
● Linux é um kernel monolít ico● Símbolos exportados para todo o sistema● Dificuldade de adição de APIs, hardware
● Problemas com escalabilidade
![Page 3: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/3.jpg)
3
Visão GeralVisão Geral
● Kernel modular● Permite a carga/ descarga sob demanda
● Facilita o desenvolvimento● APIs são definidas por sub-sistema
![Page 4: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/4.jpg)
4
Visão GeralVisão Geral
![Page 5: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/5.jpg)
5
ObtençãoObtenção
● Livremente disponível na Internet● Acesso pode ser feito de vários repositórios● Link para o projeto
● http:/ / www.kernel.org● Existem outros links!
● http:/ / www.br.kernel.org/● Repositório central de desenvolvimento
● Os principais desenvolvedores tem contas neste servidor
![Page 6: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/6.jpg)
6
2.6 vs 2.42.6 vs 2.4
● 2.6 é mais fácil de escrever drivers;● Menor latência;● Maior escalabilidade;● Escalonador mais “esperto”;● Suporte a “goodies” para módulos;
![Page 7: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/7.jpg)
7
PatchsetsPatchsets● A árvore do Linus ou do mantenedor é 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”
(mm, net e escalonameto);
![Page 8: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/8.jpg)
8
PatchsetsPatchsets
● CK: Con Kolivas responsável;● Finalidade:
● Escalabilidade;● Perfomance;● Baixa latência;● “Responsiveness”;
● Onde obter?● http:/ / www.kernel.org/ pub/ linux/ kernel/ people/
![Page 9: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/9.jpg)
9
ConfiguraçãoConfiguração
● cd <caminho do kernel/ >● make menuconfig/ xconfig● make clean bzImage modules modules_install;
● Vamos configurar um kernel?
![Page 10: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/10.jpg)
10
Estrutura de diretóriosEstrutura de diretórios● arch● crypto● Documentation● Drivers
● net/● Block/● ...
● fs● include● init
![Page 11: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/11.jpg)
11
MódulosMódulos
Pra que módulos?
![Page 12: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/12.jpg)
12
MódulosMódulos
● Como se usa?● insmod● depmod● modprobe● lsmod● rmmod (e isso funciona?)
![Page 13: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/13.jpg)
13
MódulosMódulos
● Escrevendo módulos:#include <linux/ init.h>
# include <linux/ module.h>
# include <linux/ kernel.h>
stat ic init oi_init(void) { printk (KERN_ALERT “Bom Dia!\ n”); return 0; }
stat ic void oi_exit (void) { printk (KERN_ALERT “Bom almoço!\ n”); }
module_init(oi_init);
module_exit(oi_exit);
MODULE_LICENSE(“GPL”)
![Page 14: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/14.jpg)
14
MódulosMódulos
● Como compila?● No 2.4:
gcc -D__KERNEL__ -DMODULE -c <arquivo.c> -Wall● No 2.6:
● Precisa ser criado um Makefile
![Page 15: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/15.jpg)
15
MódulosMódulos
● Makefile:
MODULE:= <nome do módulo>.ko
obj-m:= <nome do módulo>.o
default:
make -C / usr/ src/ linux SUBDIRS=`pwd` modules● No shell:
$ make
![Page 16: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/16.jpg)
16
MódulosMódulosParâmetrosParâmetros
● Passados em user-space para o insmod/ modprobe
modprobe meu_modulo.ko inteiros=1 string=”ola!”
insmod meu_modulo.ko inteiros=1 string=”ola!”
![Page 17: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/17.jpg)
17
MódulosMódulosParâmetrosParâmetros
● Como se programa isso?
● module_param (nome, t ipo, perms);● modules_param_named (nome, variavel, t ipo,
perms);
![Page 18: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/18.jpg)
18
MódulosMódulosParâmetrosParâmetros
● Tipos de dados padrão:● Byte● (u)short● (u)int● (u)long● charp● Bool
![Page 19: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/19.jpg)
19
MódulosMódulosParâmetrosParâmetros
static int numero;
module_param (numero, int, 0);
![Page 20: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/20.jpg)
20
ExercícioExercício
● Criem 1 módulo que recebe uma string como parâmetro e um número inteiro
● Ela imprime essa string 'i' vezes.
![Page 21: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/21.jpg)
21
Funcionamento do kernelFuncionamento do kernel
● Espaço de usuário● Enxerga arquivos● Nomes, diretórios...
● Como o kernel enxerga os dados?● Alguém conhece o strace?
● strace ls / dev/ dsp
![Page 22: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/22.jpg)
22
Funcionamento do kernelFuncionamento do kernel
● O kernel lida com números● Driver tenta “registrar” um major/ minor● Se conseguir, realiza comunicação sobre esse
disposit ivo● Programa de usuário
● ls -l / dev/ dsp● open (“/ dev/ dsp”, O_RDONLY)● Fala com o driver que registrou para si os
major/ minor 14,3
![Page 23: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/23.jpg)
23
Classes de dispositivosClasses de dispositivos● Character devices
● Acessados byte a byte
● Block devices● Transferência em blocos (Hds)
● Ambos apresentam entradas no / dev
![Page 24: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/24.jpg)
24
Major/ Minor NumbersMajor/ Minor Numbers
● Como o kernel sabe quando um disposit ivo é de bloco ou de caractere?
● Pelo t ipo do disposit ivo!
● Como o kernel sabe qual driver vai processar aquele disposit ivo?
● Pelo major number!
![Page 25: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/25.jpg)
25
Classe de Disposit ivosClasse de Disposit ivos
● ls -l / dev/ psauxcrw-r----- 1 root root 10, 1 Dec 31 1969 psaux
Driver de caractere Major number Minor number
![Page 26: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/26.jpg)
26
Classe de Disposit ivosClasse de Disposit ivos
● Como se criam aquelas entradas no / dev?● mknod / dev/ psaux c 10 1
crw-r----- 1 root root 10, 1 Dec 31 1969 psaux
Driver de caractere Major number Minor number
![Page 27: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/27.jpg)
27
Major/ Minor NumbersMajor/ Minor Numbers
● E pra que diabos serve o minor number?
● Quem responder ganha uma...
![Page 28: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/28.jpg)
28
Major/ Minor NumbersMajor/ Minor Numbers
● E pra que diabos serve o minor number?
● Quem responder ganha uma...SALVA DE PALMAS!
![Page 29: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/29.jpg)
29
Major/ Minor NumbersMajor/ Minor Numbers
● E pra que diabos serve o minor number?
● Para identificar qual disposit ivo (manipulado pelo mesmo driver) está sendo executado no momento
● / usr/ src/ linux/ Documentation/ devices.txt
![Page 30: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/30.jpg)
30
Classe de dispositivosClasse de dispositivos● Implementação de char drivers
● Registro do major numberint register_chrdev(unsigned int major, const char * nome, struct file_operations *fops);
int unregister_chrdev (unsigned int major, const char *nome);
● “name” é a entrada que fica em /proc/ devices
● Com major == 0, a geração dele é dinâmica.
![Page 31: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/31.jpg)
31
Comunicação kernel/ user-spaceComunicação kernel/ user-space
● Ioct ls: Funções “I/ O Control”● Permite passagens de parâmetros em tempo de
execução, ao invés de apenas em tempo de carga
● Ioct ls estão disponíveis para ambos drivers de caractere e de bloco
![Page 32: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/32.jpg)
32
Comunicação kernel/ user-spaceComunicação kernel/ user-space
● Implementação via file_operationsstatic struct file_operations driver_fops =
{
.owner = THIS_MODULE,
.ioctl = driver_ioctl,
.open = driver_open,
.release = driver_release,
};
![Page 33: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/33.jpg)
33
Comunicação kernel/ user-spaceComunicação kernel/ user-space
● Implementação em user-space
int ioctl (int fd, int cmd, ...);
● O “...” sinaliza que pode receber outro parâmetro além do parâmetro inteiro. Existe uma extensão no GCC para permit ir a passagem de estruturas para o kernel
![Page 34: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/34.jpg)
34
Comunicação kernel/ user-spaceComunicação kernel/ user-space
● Tratamento 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 como unsigned long, mas pode ser feito um cast para estruturas (geralmente é feito assim).
![Page 35: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/35.jpg)
35
Comunicação kernel/ user-spaceComunicaçã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úmero de bytes não copiados
![Page 36: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/36.jpg)
36
ExercícioExercício
● Implementem um driver pra fazer um modem PCTel funcionar.
![Page 37: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/37.jpg)
37
ExercícioExercício
● Implementem um driver pra fazer um modem PCTel funcionar.
● Desculpa, não resist i :)
![Page 38: Programação no kernel Linux - sdsl.unb.br · Funcionamento do kernel O kernel lida com números Driver tenta “registrar” um major/ minor Se conseguir, realiza comunicação](https://reader034.vdocuments.mx/reader034/viewer/2022042807/5f7a23e423bbac531e093baa/html5/thumbnails/38.jpg)
38
ExercícioExercício
● Implementar a ioctl “0xcafe”, que troca o ID do dono do processo atual para o parâmetro passado.
● Dicas:● current->uid = id_que_o_usuario_passou;