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

Documentos relacionados

void - OpenCore

void - OpenCore Board reference: BOARD_DS_IMX53.pdf

Leia mais