Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Primeiro módulo de kernel

Primeiro módulo de kernel

Avatar for Diego Ramos Ruggeri

Diego Ramos Ruggeri

May 16, 2014
Tweet

More Decks by Diego Ramos Ruggeri

Other Decks in Programming

Transcript

  1. 0 – Hello World • Olá mundo! • Diego Ramos

    Ruggeri • http://vai.la/62u3
  2. 0 – Hello World • Linux é monolítico • Módulos

    carregados em tempo de execução • Ciclo de vida • Básico: Inicializar e Limpar
  3. 0 – Hello World Porque? • Hardware livre • Entender

    o Linux • OOP em C • Projeto de software livre
  4. 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");
  5. 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
  6. 1 – Char Dev • ioctls • net • /dev

    • /sys • /dev • Block device • Character device • Major Minor
  7. 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); }
  8. 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); }
  9. 3 - Ramdisk • Char device + • Misc api

    + • Aloca memória (slab) + • open, close, read, write
  10. static int __init hello_module(void) { disk = (char*) kzalloc(DISK_SIZE *

    sizeof(char), GFP_KERNEL); /*…*/ } static void __exit goodbye_module(void) { kfree(disk); /*...*/ }
  11. 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) }