Módulos del Kernel

Post on 25-Jun-2015

434 views 1 download

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

www.GUL.es

Modulos del Kernel

Roberto Munoz Gomezroberto@gul.es

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

www.GUL.es

Agradecimientos ¡Gracias por venir!

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