Import course "ementa" as a content index.
[cascardo/kernel/notes/.git] / content
1 Cada tópico e subtópicos tem uma estimativa de horas, descrição e
2 comentários a respeito.
3
4 0. Revisão
5
6 Estimativa: 2 horas
7
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.
12
13 0.1 Arquiteturas de Computadores
14
15 Estimativa: 30 minutos
16
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.
20
21 0.2 Sistemas Operacionais
22
23 Estimativa: 30 minutos
24
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
28 dispositivos.
29
30 0.3 Unix, POSIX, GNU e Linux
31
32 Estimativa: 30 minutos
33
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
38 POSIX para userspace.
39
40 0.4 Software Livre e GPL
41
42 Estimativa: 30 minutos
43
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
46 controvérsias.
47
48 1. Introdução ao Linux Kernel
49
50 Estimativa: 5 horas
51
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
57 outra seção.
58
59 1.1 História do Desenvolvimento
60
61 Estimativa: 15 minutos
62
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.
65
66 1.2 Modelo de Desenvolvimento
67
68 Estimativa: 15 minutos
69
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
72 mainline.
73
74 1.3 Ferramentas básicas
75
76 Estimativa: 30 minutos
77
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.
80
81 1.4 Árvore do diretório do Linux
82
83 Estimativa: 15 minutos
84
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.
92
93 1.5 Ferramentas de navegação no código
94
95 Estimativa: 30 minutos
96
97 Ferramentas para navegação no código, utilizando [ce ]tags, cscope,
98 lxr, vim, emacs, entre outros.
99
100 1.6 Coding Standards
101
102 Estimativa: 15 minutos
103
104 O padrão de codificação para o Linux, incluindo bons e maus
105 exemplos. Ferramentas para identar e auditar código.
106
107 1.7 Usango git
108
109 Estimativa: 1 hora
110
111 Comentários: É uma rápida introdução, considerando que um curso
112 completo sobre git poderia tomar umas 8 horas.
113
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
116 certas tarefas.
117
118 1.8 Configurando Linux
119
120 Estimativa: 1 hora
121
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.
127
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
130 alguns itens.
131
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.
135
136 1.9 Compilando Linux
137
138 Estimativa: 15 minutos
139
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.
145
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.
148
149 1.10 Iniciando o Linux
150
151 Estimativa: 45 minutos
152
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.
156
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.
159
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.
163
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.
169
170 2. Compilando o Primeiro Módulo
171
172 Estimativa: 1 hora
173
174 Comentários: visão geral de como escrever e compilar um módulo bem
175 simples.
176
177 Ferramentas de manipulação de módulos, Makefile, cabeçalhos,
178 macros, printk, init/exit, parâmetros, etc.
179
180 3. Visão Geral de Estruturas de dados do kernel
181
182 Estimativa: 2 horas e meia
183
184 3.1 Contadores de Referência
185
186 Estimativa: 1 hora
187
188 Visão geral de kref/kobject/kset e uso de sua API.
189
190 3.2 Conversões entre tipos
191
192 Estimativa: 15 minutos
193
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.
196
197 3.3 Endianness
198
199 Estimativa: 15 minutos
200
201 Funções para conversão de endianness, como be16_to_cpu, cpu_to_be16,
202 le16_to_cpu, cpu_to_le16, etc.
203
204 3.4 Listas
205
206 Estimativa: 30 minutos
207
208 3.5 Hashs e Árvores
209
210 Estimativa: 30 minutos
211
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.
215
216 4. Dispositivos de Caractere
217
218 Estimativa: 2 horas e meia
219
220 4.1 VFS e estruturas
221
222 Estimativa: 30 minutos
223
224 Uma visão das estruturas de dados struct inode, struct file e struct
225 file_operations.
226
227 4.2 Alocação de números de dispositivo
228
229 Estimativa: 30 minutos
230
231 Como alocar e registrar números de dispositivos. Alocação estática e
232 dinâmica e processo de registro de números.
233
234 4.3 Registro de um dispositivo
235
236 Estimativa: 15 minutos
237
238 Como registrar um dispositivo de caractere e suas operações.
239
240 4.4 Operações em um dispositivo
241
242 Estimativa: uma hora e 15 minutos
243
244 Como implementar as diversas operações em um dispositivo de caractere,
245 incluindo open, release, read, write, ioctl, etc.
246
247 5. Depuração
248
249 Estimativa: 2 horas
250
251 Visão geral de alguns métodos de depuração.
252
253 5.1 Utilizando printk
254
255 Estimativa: 30 minutos
256
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.
259
260 5.2 procfs e seqfile
261
262 Estimativa: 1 hora e 15 minutos
263
264 Utilizando arquivos no /proc, e a biblioteca seqfile para imprimir dados
265 de forma sequencial.
266
267 5.3 Visão geral de outros mecanismos
268
269 Estimativa: 15 minutos
270
271 Apontar para outras opções de depuração, como tracers, kprobes, kgdb,
272 suas capacidades, vantagens e desvantagens, onde obter mais informações.
273
274 6. Processos no Linux
275
276 Estimativa: 1 hora
277
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.
281
282 7. Concorrência
283
284 Estimativa: 5 horas
285
286 7.1 Condições de corrida
287
288 Estimativa: 30 minutos
289
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
292 fazê-lo.
293
294 7.2 Semáforos e mutexes
295
296 Estimativa: 1 hora
297
298 Como e quando utilizar o mecanismo de semáforos e mutexes, e as suas
299 diferenças.
300
301 7.3 Spinlocks
302
303 Estimativa: 1 hora
304
305 Como e quando utilizar spinlocks, e as suas diferenças de mutexes e
306 semáforos.
307
308 7.4 Operações Atômicas
309
310 Estimativa: 30 minutos
311
312 Como utilizar operações atômicas e suas vantagens em relação a outros
313 mecanismos.
314
315 7.5 Per-CPU Counters
316
317 Estimativa: 30 minutos
318
319 Variáveis por CPU, ocasiões em que podem ser utilizadas, cuidados
320 necessários, e suas vantagens.
321
322 7.6 RCU
323
324 Estimativa: 1 hora
325
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
328 dados.
329
330 7.7 Outros mecanismos
331
332 Estimativa: 30 minutos
333
334 Outros mecanismos para lidar com a concorrência, incluindo rwlocks,
335 seqlocks, entre outros.
336
337 8. Temporização
338
339 Estimativa: 5 horas
340
341 8.1 Jiffies e o escalonador
342
343 Estimativa: 1 hora
344
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.
348
349 8.2 Busy waiting
350
351 Estimativa: 30 minutos
352
353 Como utilizar busy waiting para aguardar a passagem do tempo, suas
354 vantagens e desvantagens e quando utilizá-lo.
355
356 8.3 Timers
357
358 Estimativa: 1 hora
359
360 Como utilizar timers, seu contexto, suas vantagens e desvantagens.
361
362 8.4 Tasklets
363
364 Estimativa: 30 minutos
365
366 O que são tasklets, quando devem ser utilizados, como funcionam e como
367 usá-los.
368
369 8.5 Work queues
370
371 Estimativa: 1 hora
372
373 Como utilizar work queues, suas diferenças para timers e tasklets, sua
374 API.
375
376 8.6 High Resolution Timers
377
378 Estimativa: 1 hora
379
380 Para certas aplicações, é necessária maior resolução no tempo. Como
381 hrtimers são utilizados, o que pode ser esperado deles.
382
383 9. Alocação de Memória
384
385 Estimativa: 8 horas
386
387 Memória Física, Paginamento e Zonas de Memória (DMA, NORMAL, HIGHMEM)
388 Buddy System
389 vmalloc/vfree, vmap/ioremap/vunmap, kmap/kunmap, kmap_atomic/kunmap_atomic
390 Slab Allocator e Slob Allocators
391 kmalloc/kfree
392 kmem_cache_alloc/kmem_cache_free
393 kcalloc
394 kzalloc
395 Per CPU-Caches e TLB Control
396 Virtual Process Address Space
397 Layout de um Processo na Memoria
398 Copy-On-Write
399 Copiando dados entre Kernel e User Space
400 Laboratório
401
402 10. Interrupções
403
404 Estimativa: 2 horas
405
406 Hardware IRQs
407 Bottom Handlers
408 SoftIRQs
409 Wait Queues, Completions
410 Laboratório
411
412 11. Mapeamento de Memória e DMA
413
414 Estimativa: 4 horas
415
416 Coerência de Memória
417 DMA controllers
418 Device DMA memory
419 Mapping DMA memory
420 mmap
421 Laboratório
422
423 12. Modelo de Dispositivos
424
425 Estimativa: 4 horas
426
427 Devices
428 Device drivers
429 Bus drivers
430 Device Classes
431 Devices Interfaces
432 kobjects e sybsystems
433 sysfs filesystem
434 Laboratório
435
436 13. Comunicação com Hardware
437
438 Estimativa: 4 horas
439
440 Barreiras de Memória
441 Requisição de recursos
442 Portable communication: io{read,write}{8,16,32} 
443 Laboratório
444
445 14. Drivers PCI
446
447 Estimativa: 2 horas
448
449 Configuração
450 API para requisição de recursos
451 Laboratório
452
453 15. Drivers USB
454
455 Estimativa: 2 horas
456
457 HCD
458 URB
459 Laboratório
460
461 16. Dispositivos de Bloco
462
463 Estimativa: 3 horas
464
465 17. Dispositivos de Rede
466
467 Estimativa: 3 horas
468
469 17.1 Utilizando SKBs
470
471 Como funcionam os socket buffers, como são manipulados, sua alocação de
472 memórias, entre outros.
473
474 17.2 Dispositivos de Rede
475
476 As operações a serem implementadas por dispositivos de rede, o
477 comportamento dos dispositivos em relação à pilha de rede, entre outros.
478
479 18. Protocolos de Rede
480
481 Estimativa: 2 horas
482
483 Como implementar novas famílias de protocolos de rede, as operações
484 necessárias, como bind, connect, recv, send, entre outros.
485
486
487
488
489 Referências:
490
491 http://kroah.com/
492 http://www.wil.cx/matthew/lca2003/paper.pdf
493 Embedded Linux Primer
494 Linux Device Drivers
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/