programação no kernel linux - sdsl.unb.br · funcionamento do kernel o kernel lida com números...

38
1 Programação no kernel Linux Programação no kernel Linux Felipe W Damasio

Upload: others

Post on 28-Jul-2020

33 views

Category:

Documents


0 download

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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;