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

Primeiro módulo de kernel

Primeiro módulo de kernel

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) }