Primeiro módulo de kernel

Embed Size (px)

Citation preview

Escreva seu primeiro

MDULO DE KERNEL

(LINUX)

Em quatro atos

Hello World!

Character driver

Miscellaneous driver

Ramdisk

0 Hello World

Ol mundo!

Diego Ramos Ruggeri

http://vai.la/62u3

0 Hello World

Linux monoltico

Mdulos carregados em tempo de execuo

Ciclo de vida

Bsico: Inicializar e Limpar

0 Hello World

Porque?Hardware livre

Entender o Linux

OOP em C

Projeto de software livre

static int __init hello_module(void){printk(KERN_INFO "Hello World!\n");return 0;}

static void __exit goodbye_module(void){printk(KERN_INFO "Adios\n");}

module_init(hello_module);module_exit(goodbye_module);

MODULE_LICENSE("GPL");MODULE_AUTHOR("Diego Ruggeri");MODULE_DESCRIPTION("Hello World module");

0 Hello World

obj-m += hello.o

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

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

0 Hello World

modinfo

insmod

lsmod

rmmod

dmesg

1 Char Dev

ioctls

net

/dev

/sys

/devBlock device

Character device

Major Minor

static struct file_operations fops = {.read = device_read,.write = device_write,.open = device_open,.release = device_release};

static int __init hello_module(void){major = register_chrdev(0, DEVICE, &fops);/* */}

static void __exit goodbye_module(void){unregister_chrdev(major, DEVICE);}

2 Misc Dev

mknod /dev/fisl15 c $MAJOR $MINOR

udev

Miscellaneous API

static struct file_operations fops = { /*...*/ };static struct miscdevice mdev = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE, .fops = &fops,};

static int __init hello_module(void){misc_register(&mdev)/* */}

static void __exit goodbye_module(void){misc_deregister(&mdev);}

3 - Ramdisk

Char device +

Misc api +

Aloca memria (slab) +

open, close, read, write

static int __init hello_module(void){disk = (char*) kzalloc(DISK_SIZE * sizeof(char), GFP_KERNEL);/**/}

static void __exit goodbye_module(void){kfree(disk);/*...*/}

static ssize_t device_read(struct file *filp, char *buffer, size_t length,loff_t * offset){/*...*/copy_to_user(buffer, message, len);/*...*/}

static ssize_t device_write(struct file *filp, const char *buff, size_t len, loff_t * off){copy_from_user(disk, buff, len)}

Obrigado

[email protected]://github.com/diegor2