Cada tópico e subtópicos tem uma estimativa de horas, descrição e comentários a respeito. 0. Revisão Estimativa: 2 horas Comentários: Revisão curta e rápida. Cada tópico conterá uma introdução com uma revisão mais profunda de algum conceito quando necessário. Exemplo: aprofundaremos mais sobre memória virtual quando falarmos sobre gerenciamento de memória no Linux. 0.1 Arquiteturas de Computadores Estimativa: 30 minutos Conceitos sobre arquiteturas de computadores. Hierarquia de memória: memória cache, memória virtual. Modo supervisor, níveis de proteção. Interrupções, pilha, etc. 0.2 Sistemas Operacionais Estimativa: 30 minutos Conceitos sobre Sistema Operacionais, suas funcionalidades, visão de máquina extendida e de gerenciador de recursos. Gerenciamento de processos e concorrência. Gerenciamento de memória. Gerenciamento de dispositivos. 0.3 Unix, POSIX, GNU e Linux Estimativa: 30 minutos Como esses nomes se encaixam: padrões, projetos, software. Um pouco de história, um pouco da arquitetura de um sistema utilizando GNU e Linux e outras opções para cada componente, como kernel, biblioteca padrão, compilador, etc. Também um pouco sobre a interface de programação POSIX para userspace. 0.4 Software Livre e GPL Estimativa: 30 minutos O que é software livre, história, mitos. O que é a licença GPL, licença utilizada pelo Linux, os mitos, as verdades e as controvérsias. 1. Introdução ao Linux Kernel Estimativa: 5 horas Comentários: Um pouco sobre a história do desenvolvimento do Linux, as mudanças que ocorreram no código e no processo. O processo de desenvolvimento atual, os mecanismos para controle de versão, contribuição. Ferramentas necessárias e utilizadas. Como compilar, carregar e passagem de parâmetros. A parte de startup foi movida para outra seção. 1.1 História do Desenvolvimento Estimativa: 15 minutos Como o Linux cresceu da versão 1.0 até a versão 2.6, como era o modelo de desenvolvimento antigo, as ferramentas que foram utilizadas. 1.2 Modelo de Desenvolvimento Estimativa: 15 minutos Como o modelo de desenvolvimento funciona hoje em dia. As ferramentas que são utilizadas, o processo para incluir correções e melhorias no mainline. 1.3 Ferramentas básicas Estimativa: 30 minutos Utilização de ferramentas como diff, patch, quilt e ketchup para manipulação de patches e download de diferentes versões do Linux. 1.4 Árvore do diretório do Linux Estimativa: 15 minutos Onde cada subsistema se encontra. O suporte a arquiteturas e máquinas diferentes; o núcleo do sistema; o gerenciamento de memória; as bibliotecas utilitárias utilizadas; os drivers de dispositivos, barramentos e outros; os sistemas de arquivos; os cabeçalhos; subsistema de rede e protocolos; algoritmos de criptografia; sistemas de segurança; ferramentas para compilação e manipulação de código; software de user space; entre outros. 1.5 Ferramentas de navegação no código Estimativa: 30 minutos Ferramentas para navegação no código, utilizando [ce ]tags, cscope, lxr, vim, emacs, entre outros. 1.6 Coding Standards Estimativa: 15 minutos O padrão de codificação para o Linux, incluindo bons e maus exemplos. Ferramentas para identar e auditar código. 1.7 Usango git Estimativa: 1 hora Comentários: É uma rápida introdução, considerando que um curso completo sobre git poderia tomar umas 8 horas. Rápida introdução sobre a utilização da ferramenta. Seu funcionamento, diversos comandos, técnicas e práticas utilizadas para execução de certas tarefas. 1.8 Configurando Linux Estimativa: 1 hora Comentários: Há um número muito grande de configurações no Linux e não seria viável ver cada uma em detalhes. Será dada uma visão geral das configurações, e algumas configurações serão vistas em maiores detalhes em outros momentos do curso. Como exemplo, veremos opções de configuração de depuração no tópico sobre depuração. Como utilizar o menu de configuração, como ler e buscar configurações e suas dependências. Os menus e submenus, seu layout e como encontrar alguns itens. Como utilizar configurações padrões. Como configurar para uma outra arquitetura. Como reaproveitar uma configuração antiga e apenas responder sobre as novas configurações ao atualizar a versão. 1.9 Compilando Linux Estimativa: 15 minutos Comentários: após configurar, os comandos necessários para compilação são rápidos e pequenos. O processo de compilação em si, pode tomar bastante tempo. Geralmente, há algumas opções para esse intervalo: fazer intervalo para almoço ou lanche, aguardar enquanto outros tópicos são vistos, utilizar uma imagem já pré-compilada. Como compilar o Linux após sua configuração, gerando diferentes opções de imagens, módulos. A instalação e o layout da instalação dos módulos. 1.10 Iniciando o Linux Estimativa: 45 minutos Comentários: não serão vistos aqui os internos de como o Linux recebe e trata os parâmetros, ou como ele inicia seus vários subsistemas, mas apenas uma visão superficial do trabalho do bootloader e do initrd. Comentários: não é viável ver todos os parâmetros. Alguns são relevantes para subsistemas e serão vistos no tópico apropriado. Comentários: será visto como o Linux carrega o initrd em memória RAM, a descompressão de um initramfs, os dispositivos que ele cria e acessa e os processos que ele inicia. O processo de inicialização, passando pelo bootloader, como os parâmetros são passados ao Linux, e alguns desses parâmetros. A carga do initrd, como o Linux executa e inicia o primeiro processo do sistema e o trabalho feito geralmente pelo initrd para iniciar o sistema, além da explicação de sua necessidade em diversas situações. 2. Compilando o Primeiro Módulo Estimativa: 1 hora Comentários: visão geral de como escrever e compilar um módulo bem simples. Ferramentas de manipulação de módulos, Makefile, cabeçalhos, macros, printk, init/exit, parâmetros, etc. 3. Visão Geral de Estruturas de dados do kernel Estimativa: 2 horas e meia 3.1 Contadores de Referência Estimativa: 1 hora Visão geral de kref/kobject/kset e uso de sua API. 3.2 Conversões entre tipos Estimativa: 15 minutos A conversão entre diferentes tipos e estruturas, e como a manipulação de endereços de structs funciona. Exemplos: container_of, offset_of, etc. 3.3 Endianness Estimativa: 15 minutos Funções para conversão de endianness, como be16_to_cpu, cpu_to_be16, le16_to_cpu, cpu_to_le16, etc. 3.4 Listas Estimativa: 30 minutos 3.5 Hashs e Árvores Estimativa: 30 minutos Visão de algumas estruturas de dados utilizadas em códigos no Linux, como árvores rubro-negras e outras árvores balanceadas, e alguns usos de estruturas de hash. 4. Dispositivos de Caractere Estimativa: 2 horas e meia 4.1 VFS e estruturas Estimativa: 30 minutos Uma visão das estruturas de dados struct inode, struct file e struct file_operations. 4.2 Alocação de números de dispositivo Estimativa: 30 minutos Como alocar e registrar números de dispositivos. Alocação estática e dinâmica e processo de registro de números. 4.3 Registro de um dispositivo Estimativa: 15 minutos Como registrar um dispositivo de caractere e suas operações. 4.4 Operações em um dispositivo Estimativa: uma hora e 15 minutos Como implementar as diversas operações em um dispositivo de caractere, incluindo open, release, read, write, ioctl, etc. 5. Depuração Estimativa: 2 horas Visão geral de alguns métodos de depuração. 5.1 Utilizando printk Estimativa: 30 minutos Algumas outras opções para depuração, como dev_dbg, pr_debug, etc. Utilização de opções de configuração para printk dinâmico, entre outros. 5.2 procfs e seqfile Estimativa: 1 hora e 15 minutos Utilizando arquivos no /proc, e a biblioteca seqfile para imprimir dados de forma sequencial. 5.3 Visão geral de outros mecanismos Estimativa: 15 minutos Apontar para outras opções de depuração, como tracers, kprobes, kgdb, suas capacidades, vantagens e desvantagens, onde obter mais informações. 6. Processos no Linux Estimativa: 1 hora Uma visão geral sobre o sistema de escalonamento no Linux, os diferentes contextos: de processo, interrupção, bottom handler, etc. Diferenças entre sistemas UP e SMP e efeitos da preempção do kernel. 7. Concorrência Estimativa: 5 horas 7.1 Condições de corrida Estimativa: 30 minutos O que são condições de corrida, exemplos de como acontecem. Ocasiões em que interrupções, softIRQs e preempção estão desabilitados e como fazê-lo. 7.2 Semáforos e mutexes Estimativa: 1 hora Como e quando utilizar o mecanismo de semáforos e mutexes, e as suas diferenças. 7.3 Spinlocks Estimativa: 1 hora Como e quando utilizar spinlocks, e as suas diferenças de mutexes e semáforos. 7.4 Operações Atômicas Estimativa: 30 minutos Como utilizar operações atômicas e suas vantagens em relação a outros mecanismos. 7.5 Per-CPU Counters Estimativa: 30 minutos Variáveis por CPU, ocasiões em que podem ser utilizadas, cuidados necessários, e suas vantagens. 7.6 RCU Estimativa: 1 hora Como utilizar o sistema de RCU para tratar concorrências, vantagens de sua utilização, como utilizá-lo para manipular diferentes estruturas de dados. 7.7 Outros mecanismos Estimativa: 30 minutos Outros mecanismos para lidar com a concorrência, incluindo rwlocks, seqlocks, entre outros. 8. Temporização Estimativa: 5 horas 8.1 Jiffies e o escalonador Estimativa: 1 hora Como o Linux mede o tempo, utilizando temporizadores por hardware, e como ler esse tempo. Como utilizar a família schedule de comandos para acionar o escalonador. 8.2 Busy waiting Estimativa: 30 minutos Como utilizar busy waiting para aguardar a passagem do tempo, suas vantagens e desvantagens e quando utilizá-lo. 8.3 Timers Estimativa: 1 hora Como utilizar timers, seu contexto, suas vantagens e desvantagens. 8.4 Tasklets Estimativa: 30 minutos O que são tasklets, quando devem ser utilizados, como funcionam e como usá-los. 8.5 Work queues Estimativa: 1 hora Como utilizar work queues, suas diferenças para timers e tasklets, sua API. 8.6 High Resolution Timers Estimativa: 1 hora Para certas aplicações, é necessária maior resolução no tempo. Como hrtimers são utilizados, o que pode ser esperado deles. 9. Alocação de Memória Estimativa: 8 horas Memória Física, Paginamento e Zonas de Memória (DMA, NORMAL, HIGHMEM) Buddy System vmalloc/vfree, vmap/ioremap/vunmap, kmap/kunmap, kmap_atomic/kunmap_atomic Slab Allocator e Slob Allocators kmalloc/kfree kmem_cache_alloc/kmem_cache_free kcalloc kzalloc Per CPU-Caches e TLB Control Virtual Process Address Space Layout de um Processo na Memoria Copy-On-Write Copiando dados entre Kernel e User Space Laboratório 10. Interrupções Estimativa: 2 horas Hardware IRQs Bottom Handlers SoftIRQs Wait Queues, Completions Laboratório 11. Mapeamento de Memória e DMA Estimativa: 4 horas Coerência de Memória DMA controllers Device DMA memory Mapping DMA memory mmap Laboratório 12. Modelo de Dispositivos Estimativa: 4 horas Devices Device drivers Bus drivers Device Classes Devices Interfaces kobjects e sybsystems sysfs filesystem Laboratório 13. Comunicação com Hardware Estimativa: 4 horas Barreiras de Memória Requisição de recursos Portable communication: io{read,write}{8,16,32} Laboratório 14. Drivers PCI Estimativa: 2 horas Configuração API para requisição de recursos Laboratório 15. Drivers USB Estimativa: 2 horas HCD URB Laboratório 16. Dispositivos de Bloco Estimativa: 3 horas 17. Dispositivos de Rede Estimativa: 3 horas 17.1 Utilizando SKBs Como funcionam os socket buffers, como são manipulados, sua alocação de memórias, entre outros. 17.2 Dispositivos de Rede As operações a serem implementadas por dispositivos de rede, o comportamento dos dispositivos em relação à pilha de rede, entre outros. 18. Protocolos de Rede Estimativa: 2 horas Como implementar novas famílias de protocolos de rede, as operações necessárias, como bind, connect, recv, send, entre outros. Referências: http://kroah.com/ http://www.wil.cx/matthew/lca2003/paper.pdf Embedded Linux Primer Linux Device Drivers Understanding the Linux Kernel Understanding Linux Network Internals Linux Kernel in a Nutshell Operating Systems: Design and Implementation Structured Computer Organization http://gnu.org/philosophy/ /usr/src/linux/Documentation/