Documenttd

Preview:

DESCRIPTION

Apresentação do meu trabalho de diploma. UNIFEI 2010

Citation preview

Um estudo nos drivers de dispositivo do Linux

Tiago Malutamaluta@unifei.edu.br

Monday, June 28, 2010

Evolução

1991 i386

2010

avr32, frv, m32r, microblaze, parisc, score, um,

alpha, blackfin, h8300, m68k, mips, powerpcsh, x86,

arm, cris, ia64, m68knommu, mn10300, s390, sparc, xtensa

Fonte: www.kernel.org

Monday, June 28, 2010

Como gerenciar este crescimento?

Monday, June 28, 2010

Monday, June 28, 2010

Controle de versão descentralizado

• Linus tem seu repositório:git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

• Recebe um e-mail do mantenedor do um subsistema “Linus, please pull from: ssh://master.kernel.org/pub/scm/linux/

kernel/git/mchehab/linux-2.6.git v4l_for_2.6.35”

• Ele [Linus] faz o merge no seu repositório no momento que achar adequado.

Linus

A B C

Monday, June 28, 2010

Módulos no kernel

Módulos de sistemas vfat - suporte ao filesystem FAT32

usbnet - subsistema de rede com USB Módulos de dispositivo

asix - controlador do conversor USB/Ethernet nvidia - placa de vídeo

Podem existir módulos proprietários, mas algumas interfaces são exclusivas para licenças livres

Monday, June 28, 2010

#include <stdio.h>

static int start(void) { printf(“Hello from userspace!”); return 0;}

int main(void) { return start();}

Monday, June 28, 2010

#include <stdio.h>

static int start(void) { printf(“Hello from userspace!”); return 0;}

int main(void) { return start();}

Monday, June 28, 2010

#include <stdio.h>

static int start(void) { printf(“Hello from userspace!”); return 0;}

int main(void) { return start();}

gcc -Wall main.c -o main

Monday, June 28, 2010

#include <linux/kernel .h> #include <linux/init .h>#include <linux/module.h>

static int __init start(void) {

printk(“Hello from kernelspace!”); return 0;}

staticvoid __exit stop(void) { }

module_init(start); module_exit(stop);

MODULE_AUTHOR(“”); MODULE_DESCRIPTION(“”); MODULE_LICENSE(“GPL”) ;

Monday, June 28, 2010

#include <linux/kernel .h> #include <linux/init .h>#include <linux/module.h>

static int __init start(void) {

printk(“Hello from kernelspace!”); return 0;}

staticvoid __exit stop(void) { }

module_init(start); module_exit(stop);

MODULE_AUTHOR(“”); MODULE_DESCRIPTION(“”); MODULE_LICENSE(“GPL”) ;

Monday, June 28, 2010

#include <linux/kernel .h> #include <linux/init .h>#include <linux/module.h>

static int __init start(void) {

printk(“Hello from kernelspace!”); return 0;}

staticvoid __exit stop(void) { }

module_init(start); module_exit(stop);

MODULE_AUTHOR(“”); MODULE_DESCRIPTION(“”); MODULE_LICENSE(“GPL”) ;

Monday, June 28, 2010

#include <linux/kernel .h> #include <linux/init .h>#include <linux/module.h>

static int __init start(void) {

printk(“Hello from kernelspace!”); return 0;}

staticvoid __exit stop(void) { }

module_init(start); module_exit(stop);

MODULE_AUTHOR(“”); MODULE_DESCRIPTION(“”); MODULE_LICENSE(“GPL”) ;

Monday, June 28, 2010

#include <linux/kernel .h> #include <linux/init .h>#include <linux/module.h>

static int __init start(void) {

printk(“Hello from kernelspace!”); return 0;}

staticvoid __exit stop(void) { }

module_init(start); module_exit(stop);

MODULE_AUTHOR(“”); MODULE_DESCRIPTION(“”); MODULE_LICENSE(“GPL”) ;

Monday, June 28, 2010

#include <linux/kernel .h> #include <linux/init .h>#include <linux/module.h>

static int __init start(void) {

printk(“Hello from kernelspace!”); return 0;}

staticvoid __exit stop(void) { }

module_init(start); module_exit(stop);

MODULE_AUTHOR(“”); MODULE_DESCRIPTION(“”); MODULE_LICENSE(“GPL”) ;

obj−m:= hello.o KDIR := /lib/modules/$(shell uname −r)/buildPWD := $(shell pwd) default : $(MAKE) −C $(KDIR) M=$(PWD) modulesclean : $(MAKE) −C $(KDIR) M=$(PWD) clean

Monday, June 28, 2010

Liga

BIOS/EFI

Bootloader (GRUB/Lilo/U-boot)

Kernel (modo real)

Kernel (modo protegido)

Processo init

Processos dos usuários

Monday, June 28, 2010

Liga

BIOS/EFI

Bootloader (GRUB/Lilo/U-boot)

Kernel (modo real)

Kernel (modo protegido)

Processo init

Processos dos usuários

Monday, June 28, 2010

Liga

BIOS/EFI

Bootloader (GRUB/Lilo/U-boot)

Kernel (modo real)

Kernel (modo protegido)

Processo init

Processos dos usuários

Monday, June 28, 2010

Sincronismo

• Spinlocks • Mutexes• Operações atômicas

Monday, June 28, 2010

Sincronismo

• Spinlocks • Mutexes• Operações atômicas

Monday, June 28, 2010

Sincronismo

• Spinlocks • Mutexes• Operações atômicas

#include <linux/spinlock .h>

spinlock t mylock = SPIN_LOCK_ULOCKED;

spin_lock(&mylock );/∗ região crítica ∗/ spin_unlock(&mylock );

Monday, June 28, 2010

Sincronismo

• Spinlocks • Mutexes• Operações atômicas

#include <linux/spinlock .h>

spinlock t mylock = SPIN_LOCK_ULOCKED;

spin_lock(&mylock );/∗ região crítica ∗/ spin_unlock(&mylock );

Monday, June 28, 2010

Sincronismo

• Spinlocks • Mutexes• Operações atômicas

#include <linux/spinlock .h>

spinlock t mylock = SPIN_LOCK_ULOCKED;

spin_lock(&mylock );/∗ região crítica ∗/ spin_unlock(&mylock );

#include <linux/mutex .h>

static DEFINE_MUTEX(mymutex);

mutex_lock(&mymutex);/∗ região crítica ∗/ mutex_unlock(&mymutex);

Monday, June 28, 2010

Facilitadores

• Udev - para gerenciamento de nós /dev• Sysfs - exportar informações para os processos do usuário.• Kobjects e Krefs - contador de referências

Monday, June 28, 2010

Udev

ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="ide-1:0", SYMLINK+="cdrom", ENV{GENERATED}="1"

ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="ide-1:0", SYMLINK+="cdrw", ENV{GENERATED}="1"

ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="ide-1:0", SYMLINK+="dvd", ENV{GENERATED}="1"

ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="ide-1:0", SYMLINK+="dvdrw", ENV{GENERATED}="1"

/etc/udev/rules.d/70-persistent-cd.rules

Monday, June 28, 2010

Udev

ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="ide-1:0", SYMLINK+="cdrom", ENV{GENERATED}="1"

ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="ide-1:0", SYMLINK+="cdrw", ENV{GENERATED}="1"

ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="ide-1:0", SYMLINK+="dvd", ENV{GENERATED}="1"

ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="ide-1:0", SYMLINK+="dvdrw", ENV{GENERATED}="1"

/etc/udev/rules.d/70-persistent-cd.rules

Monday, June 28, 2010

sysfs

/sys/class/mmc_host/mmc0/device/leds/mmc0::

$ echo “1” > brightness$ cat brightness

kernel-space user-space

Objetos Diretórios

Atributos Arquivos

Relações Links simbólicos

Monday, June 28, 2010

kobject krefs

Contador de referências, para o kernel gerenciar o número de

objetos associados em uma mesma estrutura.

struct kref { atomic_t refcount;}

struct kobject { const char *name;

struct list_head entry;

struct kobject *parent;

struct kset *kset; struct kobj_type *ktype;

struct sysfs_dirent *sd;

struct kref kref;}

Monday, June 28, 2010

Modelo de Driver do Linux

• Devices• Devices drivers• Bus drivers• Devices Classes• Devices Interfaces

O modelo propôs uma representação genérica de objetos:

Monday, June 28, 2010

Modelo de Driver do Linux

• Devices• Devices drivers• Bus drivers• Devices Classes• Devices Interfaces

O modelo propôs uma representação genérica de objetos:

Funções para operar e controlar cada tipo de objeto.

Monday, June 28, 2010

Modelo de Driver do Linux

• Devices• Devices drivers• Bus drivers• Devices Classes• Devices Interfaces

O modelo propôs uma representação genérica de objetos:

Funções para operar e controlar cada tipo de objeto.

Monday, June 28, 2010

Modelo de Driver do Linux

• Devices• Devices drivers• Bus drivers• Devices Classes• Devices Interfaces

O modelo propôs uma representação genérica de objetos:

Funções para operar e controlar cada tipo de objeto.

Um device driver implementa uma ou mais interfaces (devices interfaces) de uma classe de dispositivos (devices classes) para um grupo de dipositivos (devices) em um barramento (bus driver) específico.

Monday, June 28, 2010

USB/Ethernet

Controlador

Ethernet USB

asix.ko

Monday, June 28, 2010

USB/Ethernet

Preenchimento de estruturas:

Monday, June 28, 2010

USB/Ethernet

Preenchimento de estruturas:

Monday, June 28, 2010

USB/Ethernet

Preenchimento de estruturas:

static struct usb_driver asix_driver = { .name = "asix", .id_table = products, .probe = usbnet_probe, .suspend = usbnet_suspend, .resume = usbnet_resume, .disconnect = usbnet_disconnect, .supports_autosuspend = 1,};

Monday, June 28, 2010

USB/Ethernet

Preenchimento de estruturas:

static struct usb_driver asix_driver = { .name = "asix", .id_table = products, .probe = usbnet_probe, .suspend = usbnet_suspend, .resume = usbnet_resume, .disconnect = usbnet_disconnect, .supports_autosuspend = 1,};

Monday, June 28, 2010

USB/Ethernet

Preenchimento de estruturas:

static struct usb_driver asix_driver = { .name = "asix", .id_table = products, .probe = usbnet_probe, .suspend = usbnet_suspend, .resume = usbnet_resume, .disconnect = usbnet_disconnect, .supports_autosuspend = 1,};

static const struct net_device_ops ax88172_netdev_ops = { .ndo_open = usbnet_open, .ndo_stop = usbnet_stop, .ndo_start_xmit = usbnet_start_xmit, .ndo_tx_timeout = usbnet_tx_timeout, .ndo_change_mtu = usbnet_change_mtu, .ndo_set_mac_address = eth_mac_addr, .ndo_validate_addr = eth_validate_addr, .ndo_do_ioctl = asix_ioctl, .ndo_set_multicast_list = ax88172_set_multicast,};

Monday, June 28, 2010

USB/Ethernet

Operações:

Monday, June 28, 2010

USB/Ethernet

Operações:

Monday, June 28, 2010

USB/Ethernet

Operações:

asix_read_cmd

asix_write_cmd

asix_async_cmd_callback

asix_write_cmd_async

asix_rx_fixup

asix_tx_fixup

asix_status

asix_set_sw_mii

asix_set_hw_mii

asix_get_phy_addr

asix_sw_reset

asix_read_rx_ctl

asix_write_rx_ctl

asix_read_medium_status

asix_write_medium_mode

asix_write_gpio

asix_set_multicast

asix_mdio_read

asix_mdio_write

asix_get_phyid

asix_get_wol

asix_set_wol

asix_get_eeprom_len

asix_get_eeprom

asix_get_drvinfo

asix_get_link

asix_ioctl

asix_set_mac_address

ax88172_set_multicast

ax88172_link_reset

ax88172_bind

ax88772_link_reset

ax88772_bind

marvell_phy_init

marvell_led_status

ax88178_link_reset

ax88178_set_mfb

ax88178_change_mtu

ax88178_bind

Monday, June 28, 2010

Conclusão

Monday, June 28, 2010

Crescimento com

pouca manutenção do código.

Monday, June 28, 2010

Padronização das estruturas básicas.

Monday, June 28, 2010

Sistemas Embarcados

Monday, June 28, 2010

LKML et all;

Linux Kernel Mail List

Monday, June 28, 2010

--tmMonday, June 28, 2010