Módulos del Kernel

53
www.GUL.es odulos del Kernel Roberto Mu ˜ noz G ´ omez [email protected] Grupo de Usuarios de Linux Universidad Carlos III de Madrid 2 de marzo de 2010 Roberto Mu ˜ noz (Jornadas Marzo ’10) odulos del Kernel 2 de marzo de 2010 1 / 53

description

Presentación del curso de Introducción a los módulos del kernel de las Jornadas Técnicas de Marzo de 2010 organizadas por el Grupo de Usuarios de Linux de la UC3M http://www.gul.es

Transcript of Módulos del Kernel

Page 1: Módulos del Kernel

www.GUL.es

Modulos del Kernel

Roberto Munoz [email protected]

Grupo de Usuarios de LinuxUniversidad Carlos III de Madrid

2 de marzo de 2010

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 1 / 53

Page 2: Módulos del Kernel

www.GUL.es

Contenido

1 Introduccion

2 Modulo de ejemplo

3 Como funcionan los modulos

4 Drivers de dispositivos

5 Comunicacion espacio kernel ⇔ espacio usuario

6 Sistema de ficheros /proc

7 Como hablar con dispositivos

8 Una TTY

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 2 / 53

Page 3: Módulos del Kernel

www.GUL.es

Introduccion

Contenido

1 Introduccion

2 Modulo de ejemplo

3 Como funcionan los modulos

4 Drivers de dispositivos

5 Comunicacion espacio kernel ⇔ espacio usuario

6 Sistema de ficheros /proc

7 Como hablar con dispositivos

8 Una TTY

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 3 / 53

Page 4: Módulos del Kernel

www.GUL.es

Introduccion Que es

¿Que es un modulo del Kernel?

Trozo de codigo que se carga en el nucleo bajo demanda.Amplian sus capacidades sin necesidad de reiniciar.Un driver es un modulo del kernel, por ejemplo ETTY.

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 4 / 53

Page 5: Módulos del Kernel

www.GUL.es

Introduccion Por que

¿Por que escribir modulos?

Por diversion.Para ganar dineroPara aprender como funcionan los entresijos.Por que puedes.

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 5 / 53

Page 6: Módulos del Kernel

www.GUL.es

Introduccion Por que

¿Vale pero por que de Linux?

Porque es libre y el codigo fuente esta disponiblePor la inmensa comunidad que tiene alrededor¿He dicho ya que es divertido?

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 6 / 53

Page 7: Módulos del Kernel

www.GUL.es

Introduccion Como

¿Como se meten los modulos en el kernel?

¿Que modulos estoy usando ahora mismo? lsmod

¿Como cargo uno? modprobe

¿Y para descargarlo? rmmod

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 7 / 53

Page 8: Módulos del Kernel

www.GUL.es

Modulo de ejemplo

Contenido

1 Introduccion

2 Modulo de ejemplo

3 Como funcionan los modulos

4 Drivers de dispositivos

5 Comunicacion espacio kernel ⇔ espacio usuario

6 Sistema de ficheros /proc

7 Como hablar con dispositivos

8 Una TTY

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 8 / 53

Page 9: Módulos del Kernel

www.GUL.es

Modulo de ejemplo Hola Mundo

Hola Mundo

#include <linux/module.h>#include <linux/kernel.h>int init_module(void){printk(KERN_INFO ’Hola Mundo.\n’);return 0;

}void cleanup_module(void){printk(KERN_INFO ’Adios mundo cruel.\n’);

}

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 9 / 53

Page 10: Módulos del Kernel

www.GUL.es

Modulo de ejemplo Como se compila

Como se compila

obj-m += holamundo.oall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 10 / 53

Page 11: Módulos del Kernel

www.GUL.es

Modulo de ejemplo Como se compila

Ver ejemplo 1

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 11 / 53

Page 12: Módulos del Kernel

www.GUL.es

Modulo de ejemplo Como se le pasan argumentos

Como se le pasan argumentos

argc/argv han pasado a mejor vidamodule param(nombre,tipo,permisos)

Nombre de la variableTipo de variablebool/invbool un bit verdadero o falso.

charp cadenaint entero

long entero largoshort entero corto

uint. . . sin signoPermisos sysfs (ver man 2 open)

insmod mimodulo.ko miparametro=5

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 12 / 53

Page 13: Módulos del Kernel

www.GUL.es

Modulo de ejemplo Como se le pasan argumentos

Ver ejemplo 2

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 13 / 53

Page 14: Módulos del Kernel

www.GUL.es

Como funcionan los modulos

Contenido

1 Introduccion

2 Modulo de ejemplo

3 Como funcionan los modulos

4 Drivers de dispositivos

5 Comunicacion espacio kernel ⇔ espacio usuario

6 Sistema de ficheros /proc

7 Como hablar con dispositivos

8 Una TTY

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 14 / 53

Page 15: Módulos del Kernel

www.GUL.es

Como funcionan los modulos

Como se ejecutan los modulos

No hay main()No tienen un flujo determinado.

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 15 / 53

Page 16: Módulos del Kernel

www.GUL.es

Como funcionan los modulos

Funciones disponibles

No hay printf, malloc, strcmp, atoi. . .No hay libc!!!!¿Entonces me tengo que picar toooodo lo que haga?Sı.Bueno,casi todo.Se pueden usar todas las funciones que exporta el kernel./proc/kallsyms

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 16 / 53

Page 17: Módulos del Kernel

www.GUL.es

Como funcionan los modulos

Memoria dinamica en el kernel

kmalloc#include <linux/slab.h>void *kmalloc(size t size, int flags)flags: GFP KERNELflags: GFP ATOMICflags: . . .

kfree(void *ptr)

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 17 / 53

Page 18: Módulos del Kernel

www.GUL.es

Como funcionan los modulos

Espacio de Kernel vs Espacio de Usuario

Objetivo del kernel:gestion de los recursos.Tarjeta de videoDisco duroMemoria. . .

Competicion por los recursosModos de ejecucion

Modo supervisorModo usuario

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 18 / 53

Page 19: Módulos del Kernel

www.GUL.es

Como funcionan los modulos

Espacio de nombres

Variables localesVariables globales

Corrupcion del espacio de nombres (namespace pollution)

El kernel es un unico espacio de nombres/proc/kallsyms

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 19 / 53

Page 20: Módulos del Kernel

www.GUL.es

Como funcionan los modulos

Espacio de codigo

Gestion de memoria uffffViolacion de SegmentoPunteros = Direcciones de memoria fısicas?NOPunteros = Direcciones de memoria logicas.Espacio de codigo del kernel = modulosSegfault del modulo ⇒ Segfault del kernel

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 20 / 53

Page 21: Módulos del Kernel

www.GUL.es

Como funcionan los modulos

Tienes un problema

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 21 / 53

Page 22: Módulos del Kernel

www.GUL.es

Drivers de dispositivos

Contenido

1 Introduccion

2 Modulo de ejemplo

3 Como funcionan los modulos

4 Drivers de dispositivos

5 Comunicacion espacio kernel ⇔ espacio usuario

6 Sistema de ficheros /proc

7 Como hablar con dispositivos

8 Una TTY

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 22 / 53

Page 23: Módulos del Kernel

www.GUL.es

Drivers de dispositivos Los nodos

Nodos de dispositivo

Que son? Ficherosmajor

/proc/devices

minorTipos de dispositivos

CaracteresBloques

Para crear unomknod <nombre> bc<b|c> major minor

/usr/src/linux/Documentation/devices.txt

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 23 / 53

Page 24: Módulos del Kernel

www.GUL.es

Drivers de dispositivos Dispositivos de caracteres

Estructura file operations

struct file_operations {struct module *owner;loff_t (*llseek) (struct file *,loff_t, int);ssize_t (*read) (struct file *,char __user *,size_t,loff_t *);ssize_t (*write) (struct file *,const char __user *,size_t, loff_t *);int (*readdir) (struct file *,void *,filldir_t);unsigned int (*poll) (struct file *,struct poll_table_struct *);int (*ioctl) (struct inode *,struct file *,unsigned int,unsigned long);int (*open) (struct inode *,struct file *);int (*flush) (struct file *,fl_owner_t id);int (*fsync) (struct file *,struct dentry *,int datasync);};

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 24 / 53

Page 25: Módulos del Kernel

www.GUL.es

Drivers de dispositivos Dispositivos de caracteres

Uso de file operations

struct file_operations fops = {.owner = THIS_MODULE,.read = midispositivo_read,.write = midispositivo_write,.open = midispositivo_open,.release = midispositivo_release

};

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 25 / 53

Page 26: Módulos del Kernel

www.GUL.es

Drivers de dispositivos Dispositivos de caracteres

Otras estructuras importantes

Estructura file

Estructura cdev

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 26 / 53

Page 27: Módulos del Kernel

www.GUL.es

Drivers de dispositivos Dispositivos de caracteres

Registrar un dispositivo

cdev alloc

cdev addint cdev add(struct cdev *dev, dev t num, unsignedint count);

cdev del

struct cdev *my_cdev = cdev_alloc( );my_cdev->owner = THIS_MODULE;my_cdev->ops = &my_fops;ret=cdev_add(my_cdev, my_major, my_count);...cdev_del(my_cdev);

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 27 / 53

Page 28: Módulos del Kernel

www.GUL.es

Drivers de dispositivos Dispositivos de caracteres

Ver ejemplo 3

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 28 / 53

Page 29: Módulos del Kernel

www.GUL.es

Comunicacion espacio kernel⇔ espacio usuario

Contenido

1 Introduccion

2 Modulo de ejemplo

3 Como funcionan los modulos

4 Drivers de dispositivos

5 Comunicacion espacio kernel ⇔ espacio usuario

6 Sistema de ficheros /proc

7 Como hablar con dispositivos

8 Una TTY

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 29 / 53

Page 30: Módulos del Kernel

www.GUL.es

Comunicacion espacio kernel⇔ espacio usuario Usuario a Kernel

Pasar datos del usuario al kernel

ssize t (*write) (struct file *,const char user*,size t, loff t

*);

unsigned long copy from user(void *to,const voiduser *from,unsigned long count);

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 30 / 53

Page 31: Módulos del Kernel

www.GUL.es

Comunicacion espacio kernel⇔ espacio usuario Kernel a Usuario

Pasar datos del kernel al usuario

ssize t (*read) (struct file *,char user*,size t,loff t *);

unsigned long copy to user(void user *to,constvoid *from,unsigned long count);

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 31 / 53

Page 32: Módulos del Kernel

www.GUL.es

Comunicacion espacio kernel⇔ espacio usuario Kernel a Usuario

Ver ejemplo 4

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 32 / 53

Page 33: Módulos del Kernel

www.GUL.es

Sistema de ficheros /proc

Contenido

1 Introduccion

2 Modulo de ejemplo

3 Como funcionan los modulos

4 Drivers de dispositivos

5 Comunicacion espacio kernel ⇔ espacio usuario

6 Sistema de ficheros /proc

7 Como hablar con dispositivos

8 Una TTY

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 33 / 53

Page 34: Módulos del Kernel

www.GUL.es

Sistema de ficheros /proc Creacion y uso

Como crear un fichero en /proc

<linux/proc fs.h>

int (*read proc)(char *page, char **start, off t offset, int

count,int *eof, void *data);

struct proc dir entry *create proc read entry(const char *name,

mode t mode, struct proc dir entry *base, read proc t *read proc,

void *data);

remove proc entry

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 34 / 53

Page 35: Módulos del Kernel

www.GUL.es

Sistema de ficheros /proc Creacion y uso

Ver ejemplo 5

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 35 / 53

Page 36: Módulos del Kernel

www.GUL.es

Como hablar con dispositivos

Contenido

1 Introduccion

2 Modulo de ejemplo

3 Como funcionan los modulos

4 Drivers de dispositivos

5 Comunicacion espacio kernel ⇔ espacio usuario

6 Sistema de ficheros /proc

7 Como hablar con dispositivos

8 Una TTY

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 36 / 53

Page 37: Módulos del Kernel

www.GUL.es

Como hablar con dispositivos La forma normal

Read y Write

Dispositivos logicos ⇔ Dispositivos fısicosPara leer: read o midispositivo read

Para escribir: write o midispositivo write

¿Y si solo quiero hablar con el dispositivo logico?Configurar baudios, paridad, bloquear una puerta, autodestruccion,. . .

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 37 / 53

Page 38: Módulos del Kernel

www.GUL.es

Como hablar con dispositivos La forma avanzada

Ioctl

IOCTL:Input Output ConTroLUsuario: int ioctl(int fd, unsigned long cmd,...????);

Cada ioctl es distinta, desestructurado, no documentado, noportable, . . .En resumen: no usarMejor otros metodos; sobre todo sysfs

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 38 / 53

Page 39: Módulos del Kernel

www.GUL.es

Como hablar con dispositivos La forma avanzada

Ver ejemplo 6

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 39 / 53

Page 40: Módulos del Kernel

www.GUL.es

Una TTY

Contenido

1 Introduccion

2 Modulo de ejemplo

3 Como funcionan los modulos

4 Drivers de dispositivos

5 Comunicacion espacio kernel ⇔ espacio usuario

6 Sistema de ficheros /proc

7 Como hablar con dispositivos

8 Una TTY

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 40 / 53

Page 41: Módulos del Kernel

www.GUL.es

Una TTY Que es

¿Que es una TTY?

OriginalmenteTTY: Teletypewriter teletipoConexion fısica o virtual

ActualmenteCualquier puerto serieTerminalesUSB-to-serialModemsBluetooth

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 41 / 53

Page 42: Módulos del Kernel

www.GUL.es

Una TTY Como se crea

Como se hace un driver tty

<linux/tty driver.h>

struct tty driver

alloc tty driver(tty minors)

struct tty operations

tty set operations

tty registrer driver

tty registrer device

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 42 / 53

Page 43: Módulos del Kernel

www.GUL.es

Una TTY Como se crea

Ejemplo de tty operations

static struct tty_operations serial_ops = {.open = tiny_open,.close = tiny_close,.write = tiny_write,.write_room = tiny_write_room,.set_termios = tiny_set_termios,

};

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 43 / 53

Page 44: Módulos del Kernel

www.GUL.es

Una TTY Como se crea

Ejemplo de inicializacion de driver

tiny_tty_driver->owner = THIS_MODULE;tiny_tty_driver->driver_name = "tiny_tty";tiny_tty_driver->name = "ttty";tiny_tty_driver->major = TINY_TTY_MAJOR,tiny_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,tiny_tty_driver->subtype = SERIAL_TYPE_NORMAL,tiny_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS,tiny_tty_driver->init_termios = tty_std_termios;tiny_tty_driver->init_termios.c_cflag = B9600 | CS8;tty_set_operations(tiny_tty_driver, &serial_ops);

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 44 / 53

Page 45: Módulos del Kernel

www.GUL.es

Una TTY Como se crea

struct termios

struct termios tty_std_termios = {.c_iflag =ICRNL | IXON,.c_oflag =OPOST | ONLCR,.c_cflag =B38400 | CS8 | CREAD | HUPCL,.c_lflag =ISIG | ICANON | ECHO | ECHOE

| ECHOK |ECHOCTL | ECHOKE | IEXTEN,.c_cc = INIT_C_CC

};

Configuracion inicial de la ttyman termios

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 45 / 53

Page 46: Módulos del Kernel

www.GUL.es

Una TTY ¿Y la funcion read?

¿No hay funcion read?

No es necesariaDrivers tty envıan datos al hardwareDatos recibidos tty flip buffer

tty flip buffer push

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 46 / 53

Page 47: Módulos del Kernel

www.GUL.es

Una TTY ¿Y la funcion read?

Ejemplo

for (i = 0; i < data_size; ++i) {if (tty->flip.count >= TTY_FLIPBUF_SIZE)tty_flip_buffer_push(tty);

tty_insert_flip_char(tty, data[i], TTY_NORMAL);}tty_flip_buffer_push(tty);

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 47 / 53

Page 48: Módulos del Kernel

www.GUL.es

Una TTY Resto de TTY

Mas sobre una tty

Tan compleja como se deseeFunciones tiocmget y tiocmsetioctls propias de una tty.

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 48 / 53

Page 49: Módulos del Kernel

www.GUL.es

Una TTY Resto de TTY

Ver ejemplo etty

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 49 / 53

Page 50: Módulos del Kernel

www.GUL.es

Preguntas ¿Te atreves a preguntar algo?

¿Alguna pregunta?

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 50 / 53

Page 51: Módulos del Kernel

www.GUL.es

Bibliografıa

Bibliografıa

[Peter Jay Salzman, 2005] Linux Kernel Module ProgrammingGuide.The Linux Documentation Project (www.tldp.org).

[O’Reilly, 2005] Linux Device Drivers Third Edition

[Imagenes]Tux: tux.crystalxp.netLogo: www.gul.es

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 51 / 53

Page 52: Módulos del Kernel

www.GUL.es

Agradecimientos ¡Gracias por venir!

Agradecimientos

Gracias al gul por organizar estas jornadasGracias a David por convencerme de dar esta charlaGracias a todos vosotros por venir

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 52 / 53

Page 53: Módulos del Kernel

www.GUL.es

Agradecimientos ¡Gracias por venir!

Roberto Munoz (Jornadas Marzo ’10) Modulos del Kernel 2 de marzo de 2010 53 / 53