documenttd
DESCRIPTION
Apresentação do meu trabalho de diploma. UNIFEI 2010TRANSCRIPT
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