1 Cada tópico e subtópicos tem uma estimativa de horas, descrição e
2 comentários a respeito.
8 Comentários: Revisão curta e rápida. Cada tópico conterá uma
9 introdução com uma revisão mais profunda de algum conceito quando
10 necessário. Exemplo: aprofundaremos mais sobre memória virtual quando
11 falarmos sobre gerenciamento de memória no Linux.
13 0.1 Arquiteturas de Computadores
15 Estimativa: 30 minutos
17 Conceitos sobre arquiteturas de computadores. Hierarquia de memória:
18 memória cache, memória virtual. Modo supervisor, níveis de
19 proteção. Interrupções, pilha, etc.
21 0.2 Sistemas Operacionais
23 Estimativa: 30 minutos
25 Conceitos sobre Sistema Operacionais, suas funcionalidades, visão de
26 máquina extendida e de gerenciador de recursos. Gerenciamento de
27 processos e concorrência. Gerenciamento de memória. Gerenciamento de
30 0.3 Unix, POSIX, GNU e Linux
32 Estimativa: 30 minutos
34 Como esses nomes se encaixam: padrões, projetos, software. Um pouco de
35 história, um pouco da arquitetura de um sistema utilizando GNU e Linux
36 e outras opções para cada componente, como kernel, biblioteca padrão,
37 compilador, etc. Também um pouco sobre a interface de programação
40 0.4 Software Livre e GPL
42 Estimativa: 30 minutos
44 O que é software livre, história, mitos. O que é a licença GPL,
45 licença utilizada pelo Linux, os mitos, as verdades e as
48 1. Introdução ao Linux Kernel
52 Comentários: Um pouco sobre a história do desenvolvimento do Linux, as
53 mudanças que ocorreram no código e no processo. O processo de
54 desenvolvimento atual, os mecanismos para controle de versão,
55 contribuição. Ferramentas necessárias e utilizadas. Como compilar,
56 carregar e passagem de parâmetros. A parte de startup foi movida para
59 1.1 História do Desenvolvimento
61 Estimativa: 15 minutos
63 Como o Linux cresceu da versão 1.0 até a versão 2.6, como era o modelo
64 de desenvolvimento antigo, as ferramentas que foram utilizadas.
66 1.2 Modelo de Desenvolvimento
68 Estimativa: 15 minutos
70 Como o modelo de desenvolvimento funciona hoje em dia. As ferramentas
71 que são utilizadas, o processo para incluir correções e melhorias no
74 1.3 Ferramentas básicas
76 Estimativa: 30 minutos
78 Utilização de ferramentas como diff, patch, quilt e ketchup para
79 manipulação de patches e download de diferentes versões do Linux.
81 1.4 Árvore do diretório do Linux
83 Estimativa: 15 minutos
85 Onde cada subsistema se encontra. O suporte a arquiteturas e máquinas
86 diferentes; o núcleo do sistema; o gerenciamento de memória; as
87 bibliotecas utilitárias utilizadas; os drivers de dispositivos,
88 barramentos e outros; os sistemas de arquivos; os cabeçalhos;
89 subsistema de rede e protocolos; algoritmos de criptografia; sistemas
90 de segurança; ferramentas para compilação e manipulação de código;
91 software de user space; entre outros.
93 1.5 Ferramentas de navegação no código
95 Estimativa: 30 minutos
97 Ferramentas para navegação no código, utilizando [ce ]tags, cscope,
98 lxr, vim, emacs, entre outros.
102 Estimativa: 15 minutos
104 O padrão de codificação para o Linux, incluindo bons e maus
105 exemplos. Ferramentas para identar e auditar código.
111 Comentários: É uma rápida introdução, considerando que um curso
112 completo sobre git poderia tomar umas 8 horas.
114 Rápida introdução sobre a utilização da ferramenta. Seu funcionamento,
115 diversos comandos, técnicas e práticas utilizadas para execução de
118 1.8 Configurando Linux
122 Comentários: Há um número muito grande de configurações no Linux e não
123 seria viável ver cada uma em detalhes. Será dada uma visão geral das
124 configurações, e algumas configurações serão vistas em maiores
125 detalhes em outros momentos do curso. Como exemplo, veremos opções de
126 configuração de depuração no tópico sobre depuração.
128 Como utilizar o menu de configuração, como ler e buscar configurações
129 e suas dependências. Os menus e submenus, seu layout e como encontrar
132 Como utilizar configurações padrões. Como configurar para uma outra
133 arquitetura. Como reaproveitar uma configuração antiga e apenas
134 responder sobre as novas configurações ao atualizar a versão.
138 Estimativa: 15 minutos
140 Comentários: após configurar, os comandos necessários para compilação
141 são rápidos e pequenos. O processo de compilação em si, pode tomar
142 bastante tempo. Geralmente, há algumas opções para esse intervalo:
143 fazer intervalo para almoço ou lanche, aguardar enquanto outros
144 tópicos são vistos, utilizar uma imagem já pré-compilada.
146 Como compilar o Linux após sua configuração, gerando diferentes opções
147 de imagens, módulos. A instalação e o layout da instalação dos módulos.
149 1.10 Iniciando o Linux
151 Estimativa: 45 minutos
153 Comentários: não serão vistos aqui os internos de como o Linux recebe
154 e trata os parâmetros, ou como ele inicia seus vários subsistemas, mas
155 apenas uma visão superficial do trabalho do bootloader e do initrd.
157 Comentários: não é viável ver todos os parâmetros. Alguns são
158 relevantes para subsistemas e serão vistos no tópico apropriado.
160 Comentários: será visto como o Linux carrega o initrd em memória RAM,
161 a descompressão de um initramfs, os dispositivos que ele cria e acessa
162 e os processos que ele inicia.
164 O processo de inicialização, passando pelo bootloader, como os
165 parâmetros são passados ao Linux, e alguns desses parâmetros. A carga
166 do initrd, como o Linux executa e inicia o primeiro processo do
167 sistema e o trabalho feito geralmente pelo initrd para iniciar o
168 sistema, além da explicação de sua necessidade em diversas situações.
170 2. Compilando o Primeiro Módulo
174 Comentários: visão geral de como escrever e compilar um módulo bem
177 Ferramentas de manipulação de módulos, Makefile, cabeçalhos,
178 macros, printk, init/exit, parâmetros, etc.
180 3. Visão Geral de Estruturas de dados do kernel
182 Estimativa: 2 horas e meia
184 3.1 Contadores de Referência
188 Visão geral de kref/kobject/kset e uso de sua API.
190 3.2 Conversões entre tipos
192 Estimativa: 15 minutos
194 A conversão entre diferentes tipos e estruturas, e como a manipulação de
195 endereços de structs funciona. Exemplos: container_of, offset_of, etc.
199 Estimativa: 15 minutos
201 Funções para conversão de endianness, como be16_to_cpu, cpu_to_be16,
202 le16_to_cpu, cpu_to_le16, etc.
206 Estimativa: 30 minutos
210 Estimativa: 30 minutos
212 Visão de algumas estruturas de dados utilizadas em códigos no Linux,
213 como árvores rubro-negras e outras árvores balanceadas, e alguns usos
214 de estruturas de hash.
216 4. Dispositivos de Caractere
218 Estimativa: 2 horas e meia
222 Estimativa: 30 minutos
224 Uma visão das estruturas de dados struct inode, struct file e struct
227 4.2 Alocação de números de dispositivo
229 Estimativa: 30 minutos
231 Como alocar e registrar números de dispositivos. Alocação estática e
232 dinâmica e processo de registro de números.
234 4.3 Registro de um dispositivo
236 Estimativa: 15 minutos
238 Como registrar um dispositivo de caractere e suas operações.
240 4.4 Operações em um dispositivo
242 Estimativa: uma hora e 15 minutos
244 Como implementar as diversas operações em um dispositivo de caractere,
245 incluindo open, release, read, write, ioctl, etc.
251 Visão geral de alguns métodos de depuração.
253 5.1 Utilizando printk
255 Estimativa: 30 minutos
257 Algumas outras opções para depuração, como dev_dbg, pr_debug, etc.
258 Utilização de opções de configuração para printk dinâmico, entre outros.
262 Estimativa: 1 hora e 15 minutos
264 Utilizando arquivos no /proc, e a biblioteca seqfile para imprimir dados
267 5.3 Visão geral de outros mecanismos
269 Estimativa: 15 minutos
271 Apontar para outras opções de depuração, como tracers, kprobes, kgdb,
272 suas capacidades, vantagens e desvantagens, onde obter mais informações.
274 6. Processos no Linux
278 Uma visão geral sobre o sistema de escalonamento no Linux, os diferentes
279 contextos: de processo, interrupção, bottom handler, etc. Diferenças
280 entre sistemas UP e SMP e efeitos da preempção do kernel.
286 7.1 Condições de corrida
288 Estimativa: 30 minutos
290 O que são condições de corrida, exemplos de como acontecem. Ocasiões em
291 que interrupções, softIRQs e preempção estão desabilitados e como
294 7.2 Semáforos e mutexes
298 Como e quando utilizar o mecanismo de semáforos e mutexes, e as suas
305 Como e quando utilizar spinlocks, e as suas diferenças de mutexes e
308 7.4 Operações Atômicas
310 Estimativa: 30 minutos
312 Como utilizar operações atômicas e suas vantagens em relação a outros
317 Estimativa: 30 minutos
319 Variáveis por CPU, ocasiões em que podem ser utilizadas, cuidados
320 necessários, e suas vantagens.
326 Como utilizar o sistema de RCU para tratar concorrências, vantagens de
327 sua utilização, como utilizá-lo para manipular diferentes estruturas de
330 7.7 Outros mecanismos
332 Estimativa: 30 minutos
334 Outros mecanismos para lidar com a concorrência, incluindo rwlocks,
335 seqlocks, entre outros.
341 8.1 Jiffies e o escalonador
345 Como o Linux mede o tempo, utilizando temporizadores por hardware, e
346 como ler esse tempo. Como utilizar a família schedule de comandos para
347 acionar o escalonador.
351 Estimativa: 30 minutos
353 Como utilizar busy waiting para aguardar a passagem do tempo, suas
354 vantagens e desvantagens e quando utilizá-lo.
360 Como utilizar timers, seu contexto, suas vantagens e desvantagens.
364 Estimativa: 30 minutos
366 O que são tasklets, quando devem ser utilizados, como funcionam e como
373 Como utilizar work queues, suas diferenças para timers e tasklets, sua
376 8.6 High Resolution Timers
380 Para certas aplicações, é necessária maior resolução no tempo. Como
381 hrtimers são utilizados, o que pode ser esperado deles.
383 9. Alocação de Memória
387 Memória Física, Paginamento e Zonas de Memória (DMA, NORMAL, HIGHMEM)
389 vmalloc/vfree, vmap/ioremap/vunmap, kmap/kunmap, kmap_atomic/kunmap_atomic
390 Slab Allocator e Slob Allocators
392 kmem_cache_alloc/kmem_cache_free
395 Per CPU-Caches e TLB Control
396 Virtual Process Address Space
397 Layout de um Processo na Memoria
399 Copiando dados entre Kernel e User Space
409 Wait Queues, Completions
412 11. Mapeamento de Memória e DMA
423 12. Modelo de Dispositivos
432 kobjects e sybsystems
436 13. Comunicação com Hardware
441 Requisição de recursos
442 Portable communication: io{read,write}{8,16,32}
450 API para requisição de recursos
461 16. Dispositivos de Bloco
465 17. Dispositivos de Rede
471 Como funcionam os socket buffers, como são manipulados, sua alocação de
472 memórias, entre outros.
474 17.2 Dispositivos de Rede
476 As operações a serem implementadas por dispositivos de rede, o
477 comportamento dos dispositivos em relação à pilha de rede, entre outros.
479 18. Protocolos de Rede
483 Como implementar novas famílias de protocolos de rede, as operações
484 necessárias, como bind, connect, recv, send, entre outros.
492 http://www.wil.cx/matthew/lca2003/paper.pdf
493 Embedded Linux Primer
495 Understanding the Linux Kernel
496 Understanding Linux Network Internals
497 Linux Kernel in a Nutshell
498 Operating Systems: Design and Implementation
499 Structured Computer Organization
500 http://gnu.org/philosophy/
501 /usr/src/linux/Documentation/