Escolar Documentos
Profissional Documentos
Cultura Documentos
Ou para postscript
Definições de tipo
A comunidade de desenvolvedores do kernel do Linux emprega uma
forte antipatia do typedef opera-tor.
Em vez disso, defina foo() para nada se CONFIG_FOO não estiver definido:
Inicializadores de Estrutura
Identificadores rotulados precisam ser usados para inicializar estruturas. Isso é
bom porque evita que alterações na estrutura resultem em inicialização
incorreta. Ele também permite que os valores sejam omitidos. Infelizmente, o
C99 adotou um formato bastante feio para identificadores rotulados, e o gcc está
depreciando o uso do antigo identificador rotulado estilo GNU, que era bastante
bonito. Consequentemente, o código do kernel precisa usar o novo formato de
identificador C99 rotulado, mesmo que seja feio:
Neste código, a e b são membros da struct fooogic e initial_A e b são seus valores
inicializados, respectivamente. Se um campo não for definido, ele será definido com
seu valor padrão por ANSI C (por exemplo, ponteiros são NULL, inteiros são zero e
flutuações são 0,0). Para exame-
www.it-ebooks.info
Enviando Relatórios de Erros
ple, se struct foo também tiver int c como membro, a instrução anterior
inicializaria c como zero.
Cadeia de comando
Os hackers do kernel são os desenvolvedores que trabalham no kernel.
Alguns fazem isso por salário, alguns como hobby, mas quase todos por
diversão. Os hackers do kernel com contribuições significativas são listados
no arquivo CREDITS na raiz da árvore de origem do kernel.
A maioria das partes do kernel tem um mantenedor associado.O mantenedor
é o indivíduo (ou indivíduos) que está encarregado de partes específicas do
kernel. Por exemplo, cada driver individual tem um mantenedor associado. Cada
subsistema do kernel — por exemplo, network-ing — também tem um
mantenedor associado. O mantenedor de um driver ou subsistema específico
geralmente é listado no arquivo MAINTAINERS, que também está localizado na raiz
da árvore de origem do kernel.
Há um tipo especial de mantenedor, conhecido como mantenedor do kernel. Este
indivíduo realmente mantém a árvore do kernel. Historicamente, Linus mantém o núcleo
de desenvolvimento (onde o verdadeiro divertimento é) e o núcleo estável por algum
período após o fim do desenvolvimento.
Pouco depois de um núcleo de desenvolvimento se tornar um núcleo estável, Linus passa a
tocha para um dos principais desenvolvedores do kernel. Esse desenvolvedor continua a
manter a árvore enquanto Linus começa a trabalhar na nova árvore de desenvolvimento.
Dada a "nova ordem mundial" em que o desenvolvimento em 2.6 continua em perpetuidade,
Linus continua a ser o mantenedor da série 2.6 kernel. Outro desenvolvedor mantém a série
2.4, que está em um modo estrito de correção de bugs somente.
www.it-ebooks.info
404 Capítulo 20 Patches, Hacking e a Comunidade
Correções
Todas as alterações no kernel do Linux são distribuídas na forma de patches, que
são a saída do programa GNU diff(1) em uma forma que é legível pelo programa patch(1).
Gerando Patches
A maneira mais simples de gerar um patch é ter duas árvores de origem, uma que é o
kernel de estoque de baunilha e outra que é a árvore de estoque com suas
modificações.Um esquema comum é nomear a árvore de estoque linux-x.y.z (que é o que o
tarball de origem extrai, inicialmente) e nomear sua árvore modificada simplesmente
linux.Then, para gerar um patch das duas árvores, emita o seguinte comando a partir de um
diretório abaixo de suas árvores:
Quando você executa o Git commit, o Git permite que você insira um log de
alterações. Torne esta entrada muito detalhada e completa, explicando completamente
o compromisso. (Abordamos exatamente o que incluir na próxima seção.) Você pode
criar várias confirmações em seu repositório.Graças ao design do Git, as confirmações
subsequentes podem até mesmo ser no mesmo arquivo, criando uma a partir da outra.
Quando você tem um commit (ou dois) em sua árvore, você pode gerar um patch para
cada com-mit, que você pode tratar à medida que faz os patches descritos na seção
anterior:
Por exemplo, este comando gera um patch somente para a última confirmação:
www.it-ebooks.info
406 Capítulo 20 Patches, Hacking e a Comunidade
Enviando Patches
Os patches devem ser gerados conforme descrito na seção anterior. Se o patch tocar
em um driver ou subsistema específico da spe, o patch deve ser enviado ao
mantenedor listado em MANTENEDOR. De qualquer forma, a lista de distribuição do kernel
do Linux em linux-kernel@vger.kernel.org deve ser copiada em carbono. O patch deve ser
enviado para o mantenedor do kernel (por exemplo, Linus) somente após uma
discussão extensa, ou se o patch for trivial e claramente correto.
Normalmente, a linha de assunto do e-mail que contém o patch tem o formato
"[PATCH] descrição resumida."O corpo do e-mail descreve em detalhes técnicos as
alterações feitas pelo patch e os motivos por trás delas. Seja o mais específico
possível. Em algum lugar no e-mail, observe a versão do kernel em relação à qual o
patch foi criado.
A maioria dos desenvolvedores do kernel quer ler seu patch em linha com seu e-mail e,
opcionalmente, salvar a coisa toda em um único arquivo. Consequentemente, é melhor
inserir o patch diretamente em linha no email, no final da sua mensagem. Esteja ciente de
que alguns clientes de e-mail podem quebrar linhas ou alterar a formatação; isso quebra o
patch e incomoda os desenvolvedores. Se o seu cliente de e-mail fizer isso, verifique se ele
tem um recurso "Inserir em linha", "Pré-formatar" ou semelhante. Caso contrário, a
anexação do patch como texto sem formatação também funcionará.
Se o patch for grande ou contiver várias alterações lógicas, você deverá dividi-lo
em partes, com cada parte representando uma alteração lógica. Por exemplo, se
você introduzir uma nova API e alterar alguns drivers para usá-la, poderá dividir as
alterações em dois patches (a nova API e, em seguida, a mudança do driver) e dois
e-mails. Se algum fragmento exigir um patch anterior, indique-o explicitamente.
Após a postagem, permaneça paciente e aguarde uma resposta. Não se deixe desanimar
por qualquer resposta negativa - pelo menos você recebeu uma resposta! Discuta os
problemas e forneça patches atualizados conforme necessário. Se você não receber
nenhuma resposta, tente descobrir o que estava errado e resolver os problemas. Solicite
comentários adicionais da lista de discussão e mantenedor.Com sorte, você pode ver suas
mudanças em uma versão futura do kernel—parabéns!
Conclusão
A qualidade mais importante de qualquer hacker é o desejo e a motivação — um
desejo de arranhar e a determinação de arranhá-lo.Este livro forneceu um tour das
principais partes do kernel, interfaces de discusão, estruturas de dados,
algoritmos e lógica. Forneceu uma visão do núcleo por dentro, de uma forma
prática, para satisfazer sua curiosidade ou tirar você do chão correndo em seus
empreendimentos do núcleo.
Mas, como já disse, a única maneira de começar é lendo e escrevendo
códigos. O Linux fornece uma comunidade que não apenas habilita, mas
também incentiva ambas as atividades — portanto, comece a ler e
codificar! Feliz hacking!
www.it-ebooks.info
Bibliografia
Esta bibliografia lista obras complementares a este livro. Note que o melhor absoluto
"leitura adicional" para complementar este livro é o kernel source.Working no Linux,
estamos todos dotados com acesso total e irrestrito ao código fonte para um sistema
operacional moderno inteiro. Não tome isso como certo. Mergulhe! Leia e escreva o
código!
Outras Obras
Esta é uma coleção de outros livros não estritamente relacionados com
sistemas operacionais, mas discutindo tópicos que, sem dúvida, os
afetam.
Hofstadter, Douglas. Gödel, Escher, Bach: Uma Eterna Trança
Dourada. Basic Books, 1999. Um olhar profundo e indispensável ao
pensamento humano que mergulha descontroladamente em múltiplas
disciplinas, incluindo a ciência da computação.
Knuth, Donald. The Art of Computer Programming, Volume 1 (em inglês).
Addison-Wesley, 1997. Um tomo inestimável sobre os algoritmos fundamentais
da ciência da computação, incluindo os algoritmos de melhor e pior ajuste
usados no gerenciamento de memória.
Sites
Kernel.org.The repositório oficial da fonte do kernel. Ele também é o lar
de um grande número de patches do hacker do núcleo do kernel.
www.kernel.org.
Linux Weekly News.Um excelente site de notícias com comentários inteligentes e
precisos sobre as notícias do Linux da semana, incluindo os acontecimentos do
kernel. Altamente recomendado. www.lwn.net.
Notícias sobre SO. Operating System News, juntamente com
artigos originais, entrevistas e comentários. www.osnews.com.
www.it-ebooks.info
www.it-ebooks.info
Esta página foi deixada em branco intencionalmente
www.it-ebooks.info
Índice
A
tempo absoluto, 207
camada de abstração, VFS (Virtual
Filesystem, sistema de arquivos virtual),
262-263
função account_process_tick(), 219
modificadores de ações, sinalizadores
gfp_mask, 239-240
string de ação, Camada de evento do
kernel, 361
função ativar tarefa(), 61
intervalos de endereço
criando, 318-320
removendo, 320
objeto address_space, caches de página,
326-328
operações address_space, caches de
página,
328-330
Programação avançada no UNIX
Ambiente, 409
fechaduras de aviso, 166
AIX (IBM), 2
algoritmos, 109-111
comportamento assintótico, 109
notação big-o, 109
notação big-theta, 109-110
clarividente, 325
complexidade, 109-110
complexidade de tempo, 110-
111
listagem de, 110-111
programador de processos, 46-
50
escalabilidade, 109
www.it-ebooks.info
412 algoritmos agendador de E/S de
previsão 318, 302-303
algoritmos de programação,
programação com base em
prioridade, 44
alinhamento de dados, 386-387
problemas, 387
tipos não padrão, 387
preenchimento de estrutura,
387-389
alloc pages() function, 236,
259 alloc_page() function,
236 alloc_percpu() function,
258 allocating
memória, 237-244
descritor de memória, 308
descritores de processo, 25-26
UIDs (números de identificação
exclusivos), 101-102
qual método usar, 259
alocando memória, 231, 237, 260
escolhendo método, 259
mapeamentos de alta memória,
253 mapeamentos
permanentes, 254
mapeamentos temporários,
254-255
função kfree (), 243- 244
função kmalloc (), 238- 244
sinalizadores gfp_mask, 238-
243
páginas, 231-232
obtendo, 235-237
alocações por CPU, 255-
256 camadas de laje, 245-
246
design, 246-249
interface, 249-252
alocação estática em
pilha, 252-253
função vmalloc(), 244-245
zonas, 233-235
permitir sinalizador de interrupções,
mapeamento anônimo de 127,
mapeamentos de memória
alta atômica, 254-255
operações atômicas, métodos
Temporizador APIC, 217 de sincronização, 175
APIs operações de 64 bits,
chamadas do sistema, 70 operações de 180 a 181
Programação de Rede UNIX, 409 bits, conversão de 181
aplicativos a 183, 177
hardware, relacionamento, 6 contra-implementação,
manipuladores de 177 definindo, 177
interrupção, escrevendo, incrementos, 175-176
118-119
operações de inteiros,
kernel, relação, 6
176-179 interfaces, 176
arch diretory, kernel source tree, 13
operações de bit não
argumentos, chamadas do sistema, 71
atômico, 183 vantagens
arrays, dados por CPU, 255
de sobrecarga, 179
Arte da programação de computador,
The, Volume 1, 409 testes, 177
tipo de dados atomic_t, 384
assembly, assembly embutido, 19 bugs
assertivos, 370-371 arrays associativos. atomicity, ordenação,
www.it-ebooks.info
estrutura biológica, camada de I/O
de bloco, 294-295
operações atômicas bit a bit, 181-183 BKL
B (Big Kernel Lock), 198-199 nós de
Bach, Maurice, 407 dispositivo de bloco, 337
armazenamentos auxiliares, 323
árvores de pesquisa binárias
balanceadas, árvores de pesquisa
binárias balanceadas
automaticamente
árvores-mães, 106-108
árvores rubro-negras, 105-106
operações de barreira,
ordenação, 179 função de
barreira(), 206 barreiras
funções, 204-205
leituras/gravações de
memória, 203-206
thread do kernel bdflush,
comportamentos 333-334,
chamadas do sistema, 71-72
Bell Laboratories, história do
desenvolvimento do Unix, 1
Benvenuti, cristão, 408
Distribuições de Software Berkeley
(BSD), interface 2 BH, tasklets, 148
sinalizadores bh_state
(buffers), ordenação de 292
bytes big-endian, notação big-
o 389-391, notação big-theta
109, 109-110
pesquisa binária, ferramenta de
gerenciamento de código-fonte git,
376-377
semáforos binários, 191-
192 árvores binárias, 103-
104
BSTs (árvores de pesquisa
binárias), 104 árvores de pesquisa
binárias balanceadas
automaticamente, 105
árvores-mães, 106-108
árvores rubro-negras, 105-
106
ligações de chamadas do sistema, 79-
81
anotação branch, GNU C Valor de BogoMIPS, 227
Booleanos, 14
dispositivos de bloco, 289-290, 337 Bostic, K., 408
cabeçotes, 291 metades inferiores
buffers, 291-294 desativando, 157-159
setores, 290-291 manipuladores de interrupção, 115,
133-135
diretório de bloco,
código-fonte do kernel,
benefícios, 134-135
camada de I/O de 13
Interface BH, 135-136
blocos, 290 filas de tarefas, 135
campo bi_cnt, 296 bloqueando entre, 157
campo bi_idx, 296 critérios de seleção do mecanismo,
156-157
campo bi_io_vecs, 295
softirqs, 136-141
campo bi_private, 296
bloqueios de rotação, 187-188
campo bi_vcnt, 295
tasklets, 136, 142-148
estrutura biológica, 294-295
terminologia da versão, 137
Vetores de E/S, 295-296
filas de trabalhos, 149-156
segmentos, 294
chaves, estilo de codificação,
versus cabeçotes de buffer,
anotação de ramificação 398-399,
296-297
blocos, 289-290, 337 GNU C, 19-20
BLOCK_SOFTIRQ, 140
www.it-ebooks.info
414 BSTs
www.it-ebooks.info
estruturas de dados
www.it-ebooks.info
418 documentação documentação
www.it-ebooks.info
mesclagem frontal/posterior,
programador de I/O, 299-300
diretório fs, árvore de origem do kernel, 13
Sistemas de arquivos
UNIX, 263 VFS (Virtual
Filesystem, sistema de
arquivos virtual)
estruturas de dados, 265-
266
objetos, 265-266
estrutura de dados files_struct, 287
método find_get_page(), 329
função find_vma(), 316-317
função find_vma prev(), 317
função find_vma_intersection(), 317
diretório do firmware, código-
fonte do kernel, 13
pilhas de tamanho fixo, 20
sinalizadores
função clone(),
manipuladores de
interrupção 34-35,
sinalizadores de tipo de
mapa 116-117, 319
sinalizadores de proteção de
página, 319
VMAs (áreas de memória
virtual), 311-312
espaços de endereço plano, 305
instruções de ponto flutuante, 20
função flush scheduling work(), 154
segmentos de limpeza, 331-335
liberando filas de trabalho, 154
função fork(), 24, 31-34
bifurcação, 32
listas livres, 245
função percpu() livre,
função 258 free_irq(),
118 liberando
estruturas de dados, camadas
de laje, 245-252 manipuladores
de interrupção, 118
liberando páginas, 237
frequências, interrupções do
temporizador, 209
funçõe exec (), 31
s find_vma prev(), 317
find_vma(), 316- 317
fs_struct estrutura de dados, 287 find_vma_intersection(), 317
chamada de biblioteca ftime(), 221 fork(), 31-32, 34
funções free_irq (), 118
account_process_tick(), 219 hello_init(), 339
cli(), 128 idr_destroy(), 103
clone(), 34-35 funções em linha, 18-19, 400
estilo de codificação, 400 in_interrupt(), 130
context_switch (), 62 in_irq(), 130
copy_process(), 32 irqs_disabled(), 130
disable_irq(), 129-130 função kfree (), 243- 244
disable_irq_nosync(), 130 kmalloc (), 238- 244
do_exit(), 36 sinalizadores gfp_mask, 238-243
do_IRQ(), 123-125 kthread_ create (), 36
do_mmap(), 318-320 provável(), 20
do_munmap(), 320 list_add(), 91
do_softirq(), 138 list_del(), 91
enable_irq(), 130 list_for_each(), 93
www.it-ebooks.info
420 funções
list_for_each_entry(), 96 G
list_move(), 92
Gagne, Greg, 407
list_splice(), 92
Galvin, Peter Baer, 407
local_bh_disable(), 157
gcc (Conjunto de
local_irq_disable(), 130
compiladores GNU), 18 gdb,
local_irq_enable(), 130
373
local_irq_restore (), 130
gerando patches, 404-405
local_irq_save(), 130
função get bh(), 293
malloc (), 238
obter função cpu(), 202
mmap(), 319-320
obter função sb(), 285
munmap (), 320
função get_cpu_var(), 258
nice (), 66
função get_free_page(), 236
open (), 5
função get_zeroed_page(), 237
panic(), 371
função gettimeofday(), 221
printf(), 5, 17, 364-367
gettimeofday() chamada do sistema, 221
printk(), 17, 364-367, 375
gfp_ mask sinalizadores, função kmalloc
raise_softirq(), 141
(), tipo de dados 238- 243 gid_ t, 384
read(), 326
ferramenta de gerenciamento de origem
relationship with time, git, 11-12
207 request_irq(), 118 pesquisa binária, 376-377
schedule_timeout(), gerando patches, 405
227-230 hash global, caches de
strcpy (), 5 página, 330 variáveis globais,
tasklet_disable(), 145 jiffies, 212-216 GNU C, 18
tasklet_disable_nosync(), 145
anotação de ramificação, 19-20
tasklet_enable(), 146 montagem em linha, 19
tasklet_kill(), 146 funções em linha, 18-19
tick_periódico(), 219 Depurador GNU, 372-373
improvável(), 20 Licença Pública Geral GNU
update_curr(), 51-52 (GPL), 4 Goüdel, Escher, Bach,
vfork (), 33- 34 granularidade 409, bloqueio, 171
vmalloc (), 244- 245
void local_bh_disable(), 158
A
void local_bh_enable(), 158
hackers, 403
espera(), 24
HAL (hardware abstraction layer),
wake_up_process(), 36
357 metades
write(), 5
divisão de trabalho, 134
manipuladores de interrupção,
115-116
www.it-ebooks.info
Processos vinculados à E/S, em comparação
com os processos vinculados ao
processador, 43-44
manipuladores, chamadas do sistema,
73-74
políticas rígidas de programação em
tempo real, 64
setores duros. Ver setores
hardware, aplicativos, relacionamento, 6
arquivos de cabeçalho, 17
cabeças, 290
Módulo Hello, World!,
função hello_init() 338-340,
tasklet 339 HI_SOFTIRQ,
140 memória alta, 393
mapeamentos de alta
memória, 253-255 ocorrências,
temporizadores, 208
Hofstadter, Douglas, 409 HP-
UX (Hewlett Packard), 2 HP-UX
11i Internals, 408
HRTIMER_SOFTIRQ tasklet,
140 notação húngara, valores
de 400 Hz, 208-212
unifica variável global, 216
I
Camada de bloco de I/O, filas de
solicitações, 297 blocos de I/O,
290
Programadores de I/O, 297-298
Programador de I/O antecipado,
302-303
Programador de E/S CFQ
(Complete Fair Queuing), 303
Programador de E/S de prazo,
300-302 mesclagem
frontal/traseira, 299-300 Linus
Elevator, 299-300 funções de
mesclagem/classificação, 298-
299 latência de leitura
minimizada, 302-303
Programador de E/S Noop, 303-
304 prevenção de inanição de
solicitação, 300-302 opções de
seleção, 304
instalação no depurador do kernel, 372-
373 na função in_interrupt(),
130 na função in_irq(), 130
www.it-ebooks.info
422 operações atômicas de inteiro
www.it-ebooks.info
424 Site do Kernel Newbies criando, 359-360
destruindo, 360
Site do Kernel Newbies, 395
objetos kernel,
preempção de kernel
337, 7, 393
dados por CPU, 256
programadores de
processo, 63-64
número aleatório do kernel
gerador, 338
threads do kernel, 35-36
descritor de
memória, 309 tarefa
pdflush, 35
temporizadores do
kernel. Ver
temporizadores Sítio
web do tráfego do
kernel, 395 kernel-space,
29 Kernel.org, 409
Kernighan, Brian, 399,
409 filas kfifo, 97-100
criando, 97-98
desenfileirando dados,
98
destruindo, 99
enfileirando dados, 98
obtendo tamanho de,
98
redefinindo, 99
função kfree (), 243-
244 kgdb, 373
servidor klogd, kernel
mensagens, 367
função kmalloc (), 238- 244, 259
sinalizadores gfp_mask,
238-243
Knuth, Donald, 409
kobjectsName
modelo de dispositivo,
349-350 gerenciando,
352-353 atributos de
arquivo, 358-359
convenções, 360-361
modo laptop, write-back de página,
pedido 333 last-in/first-out (LIFO),
94
sistema de arquivos sysfs,
menos usado recentemente (LRU),
355
remoção de cache, 325
adição e remoção
diretório lib, árvore de código-
de,
357-358 fonte do kernel, 13 funções libc,
adicionando 17
arquivos, 358- ciclo de vida, processos, 24
361 processos leves, threads,
dentaduras, 355 função 34 possible(), 20
Camada De limitações, manipuladores de
Eventos Do
interrupção, comprimento de
Kernel, 361-362
133 linhas, estilo de
diretórios raiz,
357 codificação, listas vinculadas
399-400, 85
função kobject_create(),
353 listas vinculadas circulares, 86-
Kogan, Michael, 408 87
depurador kqdb, 373
estrutura kref,
contagens de
referência do
modelo do www.it-ebooks.info
dispositivo, 354-
355
função kref_ put (), 354
Kroah-Hartman, Greg, 408
ksets, modelo de
dispositivo, 351
tarefa do ksoftirqd, 35
ksoftirqd
threads, tasklets,
processo kernel
146- 147
kthreadd, função
36 kthread_
create (), 36
ktypes, modelo
de dispositivo,
thread kernel
atualizado 350-
351, 333- 334
kysmoops, 369
E
Linux Kernel Mailing List (lkml), 10, 395
Programação do Sistema Linux, 409 Notícias
Semanais Linux, 395, 409
declarando, 88
definindo, 89-90
listas duplamente vinculadas,
85-86
iterando através de trás, 94
iterando ao remover, 95
implementação do kernel, 88-
90
manipulando, 90-92
memória, 313
navegando por, 87-88
nós
adicionando a, 90-91
excluindo de, 91-92
movendo, 92
união, 92
listas vinculadas
individualmente, 85-86
atravessando, 93-96
Linus Elevator, programadores de
I/O, 299-300 Linux, 1
história do desenvolvimento, 3
carga dinâmica, 8
sistemas de arquivos, suporte,
288
comunidade de
desenvolvimento kernel, 10
modelo de dispositivo
orientado a objeto, 8 status de
código aberto, 4 portabilidade,
380-381 natureza preemptiva,
8
escalabilidade, 171
multiprocessador simétrico (SMP), 8
implementação de thread, 33-
36
suporte a thread, 8
Unix, 3
versus kernel Unix, 6, 8
Drivers de dispositivo Linux,
408 comunidade kernel
Linux, 395
blo enable() function, 157-158
que local_irq_disable() function, 130
ios
local_irq_enable() function, 130
local_irq_restore() function, 130
local_irq_save() function, 130
lista para cada função each(), 93 lock contention, 171
função list move(), 92 função lock kernel(), 199
função list splice(), 92 bloqueio
listas, VMAs (áreas de memória virtual), bloqueio grosseiro, 172
313-314
granularidade, 171
função list_add(), 91
necessidade de proteção, 168-169
função list_del(), 91
condições de corrida, 165-166
list_for_each_entry()
bloqueio entre as metades
function, 96 little-endian
inferiores, 157 bloqueios, 165
byte order, 389-391 lkml
adquirindo, 193
(Linux Kernel Mailing
List), 10, 395 loading
consultivo, 166
(carregando)
BKL (Big Kernel Lock), 198-199
ocupando espera, 166
módulos, 343-344
gerenciando contenção, 171
opções de impasses, threads, 169-171
configuração, depuração, 186
344-346 funções, 193
local bh disable() mutexes, 195-197
function, 157 local bh
www.it-ebooks.info
426 bloqueios
mapas de memória, 306 unidades de 13 mm, descritor de memória, função mmap() 309,
www.it-ebooks.info
428 módulos
www.it-ebooks.info
programação regular, 48-50
www.it-ebooks.info
432 processos vários segmentos de
execução, 162
temporizadores, 224
tarefas, 24
encerrando, 24, 36-40
segmentos, 305
contagem de timeslice, 211
memória virtual, 23
processador virtual, 23
chamadas do sistema de
afinidade do processador,
pedido de 66 processadores,
tempo de 392 processadores,
produção, 66
processadores vinculados a
processadores versus processos
vinculados a E/S, 43-44
procfs sistema de arquivos virtual, 126-
127
padrão de programação do
produtor e do consumidor,
kernel, 96
programas, processos, 24
processos de pseudo-simultaneidade,
167
colocar função bh(), 293
função put_cpu_var(), 258
T
uma fatia quântica. Consulte fatias de
tempo
Quarterman, John S., 408
filas, 96-97
criando, 97-98
desenfileirando dados, 98
destruindo, 99
enfileirando dados, 98
kfifo, 97- 100
obtendo tamanho de, 98
redefinindo, 99
E
condições de corrida
Exemplo de
processamento ATM,
bloqueio de 163, 165-166
bloqueios de rotação de leitor-gravador,
188-190
método readpage(), 328
radix trees, page caches, 330 função read_barreira_depends(), 205
Rago, Stephen, 409 Árvores de driver de relógio de tempo real (RTC), 120-122,
raios, caches de páginas, 330 217
www.it-ebooks.info
mudança de contexto, 62
multitarefas cooperativas, 41-42
diretórios raiz, sistema de arquivos
estrutura de entidades, 50 pontos
sysfs, 357 Programador de data limite
de entrada, 57-58
da escada rotativa, 43 rotinas, estilo de
codificação, 402
Driver RTC (real-time clock), 120-122,
217 Rubini, Alessandro, 408 regras,
kernel, 16-21
run local timers() function, 219
run_local_timers() function, 224
run_timer_softirq() function, 224
runnable processes, 41
Russinovich, Mark, 408 rw lock
init() function, 190
E
diretório samples, código-fonte do
kernel, escalabilidade de 13, 171
algoritmos, 109
sched_getaffinity() chamada do
sistema, 66
sched_getparam() chamada do sistema,
66
sched_getscheduler() chamada do
sistema, 66
sched_get_priority_max() chamada do
sistema, 66
sched_get_priority_min() chamada do
sistema, 66
sched_setaffinity() chamada do
sistema, 66
sched_setparam() chamada do sistema,
66
sched_setscheduler() chamada do
sistema, 66
SCHED_SOFTIRQ tasklet, 140
sched_yield() chamada do sistema, 66-
67
função schedule delay work(), 154-155
agendador, 41
algoritmo, 46-50
classes, 46-47
Agendador
Completamente Fair
Scheduler, 43
Prazo final da escada rotativa
select() chamada do sistema
de 64 a 65
agendador, 43
evolução, 42-43
chamadas do sistema, 65-67
programação regular, 48-50
contabilização de tempo, 50-52
implementação, 50-61
fatias de tempo, 42
Programador O(1), 42-43
Sistemas Unix, 47-48
política, 43-46
tempo de execução virtual, 51-52
Processos
produzindo, 42
vinculados à E/S,
schedule_timeout() function, 227-
programação 43-44
230 scheduler_tick() function, 218-
com base em
219 scheduling
prioridades, 44
tasklets, 143-146
processos
filas de trabalhos, 153-154
vinculados ao
Schimmel, Curt, 408
processador, 43-44
diretório scripts, árvore de origem
intervalos de tempo,
do kernel, ponteiro sd 13, modelo
45
de dispositivo, 350 setores,
preempção, 62 dispositivos de bloco, diretório de
preempção do kernel, 63-64 segurança 290-291, origem do
preempção do kernel
usuário, multitarefa árvore, 13
preventiva de 62 a 63, espaços de endereço
seleção de 41 segmentados, 305 segmentos,
processos, políticas
camada de I/O de bloco, 294-295
de programação em
select() system call, 211
tempo real de 52 a 57,
www.it-ebooks.info
434 árvores de pesquisa binárias alocação de memória,
balanceadas automaticamente 245-252
princípios de, 246
árvores de pesquisa binárias espera, filas de espera, 229
balanceadas automaticamente, 105
árvores-mães, 106-108
árvores rubro-negras, 105-106
documentação autogerante,
função init() 401 sema, 193
semáforos, 190-191
semáforos binários, 191-
192 contagem de
semáforos, 191-192
criação, 192-193
implementação, 193-194
inicialização, 192
mutexes, comparado, 197
semáforos leitor-escritor,
194-195 upping, 192
seqlocks, 220
DYNIX/ptx sequente, 2
bloqueios sequenciais, 200-201
settimeofday() chamada do sistema, 221
configurações, write-back de página, 332
manipuladores de interrupção
compartilhados, 119-120
mapeamento compartilhado, VMAs
(áreas de memória virtual), 312
SIAM Journal of Computing,
327 efeitos colaterais,
chamadas de sistema, 71
Silberschatz, Abraham, 407
Singh, Amit, 408
pilhas de kernel de página única,
alocando memória estaticamente,
252-253
listas vinculadas individualmente, 85-86
alocador de slab, 25
"Alocador De Slab: Um Alocador De
Memória Kernel De Cache De
Objetos," 246
camadas de laje
design de, 246
exemplo de estrutura de dados
de inode, interface 247-249,
249-252
função smp_read_barreira_depends(),
206 políticas de soft real-time
scheduling, 64 softirqs
simultaneidade de sono, 167
atribuindo índices, mecanismo da
fechaduras, 192
metade inferior 140-141,
comportamentos, 191
mecanismo da metade inferior
mutexes, 195-197
137-138, execução, 140
versus semáforos, 197
mecanismo da metade
versus bloqueios de rotação, 197 inferior, atribuições de
semáforos, 190-191 índice, 140
semáforos binários, 191-192 metades inferiores,
contagem de semáforos, 191-192 136-141, 188
criação, 192-193 implementação, simultaneidade, 167
193-194 inicialização, 192 executando, 138-140
semáforos leitor-escritor, 194-195 manipulador, 138
versus bloqueios de rotação, 191 manipuladores, registrando, 141
SMP (multiprocessamento simétrico), 8 implementação, 137-140
portabilidade, 393 threads do ksoftirqd, 146- 147
função smp mb(), 205-206 elevando, 141
smp ler barreira depend() função, 205 smp tipos, 140
rmb() função, 205-206 smp wmb() função, Solaris (Sun), 2
205-206
www.it-ebooks.info
alocando memória estaticamente
ativado, 252-253
www.it-ebooks.info
436 métodos de sincronização chamadas do sistema, 5, 69
acessando, 71
operações de número
inteiro, 176-179
interfaces, 176
operações de bit não
atômico, 183 vantagens
de sobrecarga, 179
testes, 177
barreiras, 203-206
BKL (Big Kernel Lock), 198-
199 variáveis de conclusão,
197-198 mutexes, 195-197
ordenação, 203-206
preempção desabilitando,
201-202 semáforos, 190-
191
semáforos binários, 191-
192 contagem de
semáforos, 191-192
criação, 192-193
implementação, 193-194
inicialização, 192
semáforos leitor-escritor,
bloqueios sequenciais 194-195,
bloqueios de rotação 200-201,
183-186
metades inferiores, 187-188
bloqueios de rotação de leitor-
gravador, 188-190
interrupções síncronas, 114
syscalls Ver chamadas do sistema
sysfs, 337
sistema de arquivos sysfs, 355
adicionando e
removendo kobjects,
357-358
adicionando arquivos, 358-361
dentaduras, 355
Camada de Evento de
Kernel, 361-362
diretórios raiz, 357
daemon syslogd, mensagens do
kernel, 367 comandos SysRq,
função 371 system call(), 73
contras, 82 propósito
de, 69
return values, 71
acessando do espaço do usuário,
scheduler, 65-66
alternativas 81-82, 82-83
sched_getaffinity(), 66
API (Interface de programação de
aplicativo), 70 sched_getscheduler(), 66
argumentos, 71 sched_get_priority_max(),
comportamentos, 71-72 66 sched_setaffinity(), 66
ligação, 79-81 sched_setparam(), 66
C biblioteca, 70-71 clone(), 32 contexto, sched_setscheduler(), 66
78-81 denotando chamadas corretas, 73 sched_yield(), 67
manipuladores, implementação 73-74, efeitos
www.it-ebooks.info
sistema operacional sem tickless
T pdflush, 35
Tanenbaum, André, 407
dormindo, 58-61
tarball
acordando, 61
localidade temporal, 323
instalando, 12
mapeamentos temporários de
código-fonte, 11
alta memória, 254-255
listas de tarefas, 24-25
encerrando processos, 36-40
filas de tarefas, metades inferiores, 135
testando operações atômicas, 177
TASK_INTERRUPTIBLE processo, 27
seção de texto (processos), 23
TASK_RUNNING processo, 27
Thompson, Ken, 1, 3
processo TASK_STOPPED, 28
thrashing the cache per-CPU data,
task_struct, 24
258 thread support, Linux, 8
processo TASK_TRACED, 28
thread_info structure, 26 threads,
TASK_UNINTERRUPTIBLE
23, 34, 305 (sobrecarregando os
processo, 28 tasklet action()
dados por CPU, suporte a 258
function, 143 tasklet disable()
threads, Linux, 8 thread_info
function, 145 tasklet disable
structure, 26 threads, 23, 34, 305)
nosync() function, 145 tasklet
evitando o congestionamento, 334-335
enable() function, 146 tasklet
bdflush, 333-334
handlers, writing, 145 tasklet hi
programação concorrente, 33
action() function, 143 tasklet hi
contestado, 184
schedule() function, 143 tasklet kill()
criando, 34
function, 146
impasses, 169-171
função tasklet schedule(),
segmentos de limpeza, 331-335
143 tasklets, 137
kernel, 35-36
Interface BH, 148
ksoftirqd, 146- 147
mecanismo da metade kupdated, 333- 334
inferior, 142-143 metades
processos leves, 34
inferiores, 136
Implementação do Linux, 33-36
simultaneidade, 167
segmentos de migração, 66
declarando, 144-145
paralelismo, 33
implementando, 142-
pdflush, 333-334
144 threads ksoftirqd,
threads de trabalho, 149
146-147 agendando,
segmentos de execução, 23
143-146 tipos softirq,
regiões críticas, 162
140 estrutura, 142
definido, 161
TASKLET_SOFTIRQ tarefa,
condições de corrida, 162
140 tarefas, 24
taxa de tique, Hz (hertz), 208-212
ksoftirqd, 35
função tick_periódico(), 217, 219-
tarefas sem pais, 38-40
220 sistema operacional tickless,
212
www.it-ebooks.info
438 hora
www.it-ebooks.info
dentry, 265, 275-279
diretório, 265
Sistemas UNIX para arquiteturas
arquivo, 265, 279-284
modernas:
Multiprocessamento simétrico e cache, 408
expected() função, 20 unlock
kernel() função, 199 up()
função, 193-194 update_curr()
funções, 51-52
update_process_times() function, 218,
224 update_wall_time() function, 218
semáforos upping, 192
preempção do usuário, programador
de processo, 62-63 espaços do
usuário, jiffies variável global, 216
espaço do usuário, 5
acessando chamadas do
sistema, 81-82
diretório usr, árvore de origem
do kernel, 13 utilitários, diffstat,
405
V
Vahalia, Uresh, 408
van der Linden, Peter,
409 variáveis
variáveis de conclusão,
variáveis de condição 197-198,
depuração, variáveis globais
374, jiffies, 212-216 xtime, 220
kernels do fornecedor, 14
string de verbo, Camada de
evento Kernel, função 361
vfork(), 33-34
VFS (Virtual Filesystem, sistema de
arquivos virtual), 261
estruturas de dados, 265-266,
285-286 processos, 286-
288
estrutura de tipo de
sistema de arquivos,
interface 266, 261-262
sistemas de arquivos
Linux, 288
objetos, 265-266
bloqueios voluntários sinalizadores, 311-312
listas, 313-314
inode, 265, 270-274 operações, 312-313
mapeamento particular, 312
operações, 265
mapeamento compartilhado, 312
superblock, 265-269
árvores, 313-314
estrutura vfsmount, 285-286
tempo de execução virtual,
diretório virtual, código-
processos, pesquisa de endereço
fonte do kernel, 13
virtual para físico 51-52, função 321
drivers de dispositivo
vmalloc(), 244-245, 259
virtual, 338 Virtual
Filesystem (VFS) VMAs (áreas de memória virtual),
309-310, 314-315
objeto dentry, 275, 278
sinalizadores, 311-312
objeto file, 282
listas, 313-314
objeto inode, 270-272
localizando, 316-317
objeto superblock, 267
operações, 312-313
estrutura vfsmount, 266
mapeamento particular, 312
Sistema de arquivos virtual
(VFS). Consulte VFS
mapeamento compartilhado, 312
(Virtual Filesystem, árvores, 313-314
sistema de arquivos void local bh função disable(), 158
virtual)
void local bh função enable(), 158
memória virtual, VMAs
bloqueios voluntários, 166
(áreas de memória
virtual), 309-310, 314-315
www.it-ebooks.info
440 VSF implementação, 149-153
agendamento, 153-154
VSF
camada de abstração, 262-263
Sistemas de arquivos UNIX,
263-264
W-X-Y
função wait for completation(),
198 filas de espera, 58-59
dormindo, 229
função wait(), 24
função wake up(), 61
função wake_up_process(), 36
sites, LKML (Linux Kernel
Mailing List, lista de
distribuição do kernel Linux),
395
Windows Interno: cobrindo Windows
Server 2008 e Windows Vista, 408
função wmb(), 204-205
tamanho da palavra, 381-384
caracteres, 381
palavras duplas, 382
páginas, 381
regras de uso, 383
manipulador de filas de trabalhos, 153
filas de trabalhos, 137, 151
mecanismo da metade inferior,
149, 153 filas de tarefas
antigas, 155-156 criação de
filas, 154-155
relações entre estruturas de
dados, 152-153
função run_workqueue(),
151-152
estrutura de dados de
thread, 149 estruturas de
dados de thread, 150-151
criação de trabalho, 153
liberação de trabalho,
154
programação de trabalho,
153
criando, 154-155
manipulador de
interrupção, 118-119
www.it-ebooks.info