Primeiro módulo de kernel

download Primeiro módulo de kernel

If you can't read please download the document

Transcript of Primeiro módulo de kernel

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