Você está na página 1de 78

Estilo de codificação do Linux

O kernel tem um recurso para a documentação de geração automática.


É baseado no GNOME- doc, mas ligeiramente modificado e renomeado
como Kernel- doc. Para criar a documentação independente no formato
HTML, execute

Ou para postscript

Você pode usar o sistema para documentar suas funções seguindo


um formato especial para seus comentários:

Para obter mais informações, consulte Documentation/kernel-doc-nano-HOWTO.txt.

Definições de tipo
A comunidade de desenvolvedores do kernel do Linux emprega uma
forte antipatia do typedef opera-tor.

n typedef oculta o tipo real de estruturas de dados.


n Como o tipo é oculto, o código é mais propenso a fazer coisas ruins, como
transmitir uma estrutura por valor na pilha.
n typedef está apenas sendo preguiçoso.

Portanto, para evitar o ridículo, evite o typedef.


Claro, existem alguns bons usos de typedefs: ocultar uma implementação
específica de arquitetura de uma variável ou fornecer compatibilidade com
versões posteriores quando um tipo pode mudar. Decida cuidadosamente se
o typedef é realmente necessário ou se existe apenas para reduzir o número
de caracteres que você precisa digitar.
www.it-ebooks.info
402 Capítulo 20 Patches, Hacking e a Comunidade

Usar Rotinas Existentes


Não reinventar a roda.O kernel fornece funções de manipulação de
string, rotinas de compactação e uma interface de lista vinculada, então
use-as.
Não envolva interfaces existentes em interfaces genéricas. Muitas
vezes você vê o código que foi obviamente portado de um sistema
operacional para o Linux, e várias interfaces do kernel estão envolvidas
em alguma função de cola bruta. Ninguém gosta disso, então apenas use
as interfaces fornecidas diretamente.

Minimizar ifdefs na Origem


A colocação de diretivas de pré-processador ifdef diretamente na fonte C é
desaprovada.Você nunca deve fazer algo como o seguinte em suas
funções:

Em vez disso, defina foo() para nada se CONFIG_FOO não estiver definido:

Então, você pode chamar incondicionalmente foo(). Deixe o compilador fazer o


trabalho para você.

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.

Corrigindo O Código Ex Post Fato


Se uma pilha de código cair em seu colo que não consegue nem se parecer levemente
com o estilo de codificação do kernel do Linux, não se preocupe.Uma graxa de
cotovelo pequena e o utilitário de recuo podem tornar tudo perfeito. indent , um excelente
utilitário GNU encontrado na maioria dos sistemas Linux, formata a origem de acordo
com determinadas regras.As configurações padrão são para o estilo de codificação
GNU, que não é muito bonito.Para obter o utilitário para seguir o estilo do kernel do
Linux, execute o seguinte:

Isso instrui o utilitário a formatar o código de acordo com o estilo de


codificação do kernel. Alternativamente, o script scripts/Lindent invoca
automaticamente o indent com as opções desejadas.

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.

Enviando Relatórios de Erros


Se você encontrar um bug, o melhor curso de ação é escrever uma
correção, criar um patch, testá-lo e enviá-lo como discutido nas seções
seguintes. É claro que você também pode relatar o problema e fazer com
que alguém o corrija para você.

www.it-ebooks.info
404 Capítulo 20 Patches, Hacking e a Comunidade

A parte mais importante do envio de um relatório de erro é descrever


completamente o problema. Descreva os sintomas, qualquer saída do
sistema e um oops totalmente decodificado (se houver um oops). Mais
importante, se possível, fornecer etapas para reproduzir o problema de
forma confiável e uma breve descrição do hardware.
Decidir para quem enviar o relatório de erro é o próximo passo.O arquivo MAINTAINERS,
na raiz da árvore de origem do kernel, lista os indivíduos associados a cada driver e
subsistema—eles devem receber quaisquer problemas relacionados ao código que eles
mantêm. Se você não encontrar uma parte interessada, envie o relatório para a lista de
distribuição do kernel do Linux em linux-ker-nel@vger.kernel.org. Mesmo se você encontrar um
mantenedor, CC a lista de discussão do kernel.
Os arquivos REPORTING-BUGS e Documentation/oops-tracing.txt fornecem mais
informações.

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:

Isso é normalmente feito em algum lugar em sua casa, e não


/usr/src/linux para que você não precise ser root.The -u flag especifica que
o formato diff unificado deve ser usado.Sem isso, o patch é feio e não
legível por humanos.The -rogif instruts para recursivamente diff todos os diretórios, e o -
N flag especifica que novos arquivos na árvore mod-ificada devem ser incluídos no diff.
Alternativamente, se você precisa comparar apenas um único arquivo, você
pode fazer

Você precisa sempre diferenciar as árvores de um diretório abaixo das árvores de


origem.Isso cria um patch que pode ser usado por outros, mesmo que os nomes de
diretório sejam diferentes.Para aplicar um patch feito nesse formato, faça o seguinte a
partir da raiz da árvore de origem:

Neste exemplo, o patch é nomeado como my-patch e é criado um


diretório abaixo do atual.O flag -p1 instrui o primeiro diretório a remover o primeiro
diretório do patch.Isso permite que você aplique um patch independentemente da convenção
de nomeação de diretório usada pelo criador do patch.
www.it-ebooks.info
Correções 405

Um utilitário útil é o diffstat, que gera um histograma das alterações de um


patch (adições e remoções de linha).Para gerar a saída em um dos patches,
faça

Geralmente, é útil incluir essa saída quando você publica um patch


no lkml. Como o programa patch(1) ignora todas as linhas até que uma
comparação seja detectada, você pode até incluir uma breve descrição na
parte superior do patch.

Gerando Patches com o Git


Se você usa o Git para gerenciar sua árvore de origem, você precisa usar o Git para, da
mesma forma, gerar seus patches - não há razão para passar por todas as etapas manuais
acima mencionadas e suportar a complexidade do Git. Gerar patches com o Git é um
processo fácil de duas partes. Primeiro, você precisa criar e depois confirmar localmente
suas alterações. Fazer alterações em uma árvore do Git é o mesmo que uma árvore de
origem padrão.Você não precisa fazer nada de especial para editar um arquivo armazenado
no Git. Depois de fazer as alterações, você precisa confirmá-las no repositório do Git:

O sinalizador -a instrui o Git a confirmar todas as suas alterações. Se


você só deseja confirmar as alterações em um arquivo específico,
você também pode fazer isso:

Mesmo com osinalizador -a, no entanto, o Git não confirmará novos


arquivos até que eles sejam explicitamente adicionados ao
repositório.Para adicionar um arquivo e depois confirmá-lo (e todas as
outras alterações), emita os dois comandos a seguir:

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:

Isso gera patches para todos os commits no repositório e não na árvore


original. O Git cria os patches na raiz da árvore de origem do kernel. Para
gerar patches somente para os últimos N commits, você pode executar o
seguinte:

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!

Livros sobre design de sistema operacional


Esses livros abordam o design de SO como discutido em um curso de
graduação. Todos eles lidam com os conceitos, algoritmos, problemas e
soluções envolvidos no projeto de um sistema operacional funcional. Eu
recomendo todos, mas se eu tivesse que escolher apenas um, o livro de Deitel é
abrangente e agradavelmente legível.
Deitel, H., P. Deitel e D. Choffnes. Sistemas operacionais. Prentice Hall,
2003.Um passeio de força admirável sobre a teoria dos sistemas
operacionais, com alguns excelentes estudos de caso colocando a teoria
em prática.
Tanenbaum, Andrew. Sistemas operacionais modernos. Prentice Hall, 2007.Uma
visão geral sólida dos problemas de design do sistema operacional padrão, além de
discussão sobre muitos dos conceitos usados nos sistemas operacionais modernos
de hoje, como UNIX e Windows.
Tanenbaum, Andrew. Sistemas operacionais: projeto e implementação.
Prentice Hall, 2006. Um grande trabalho introdutório sobre o design e
implementação de um sistema tipo Unix, Minix.
Silberschatz, A., P. Galvin e G. Gagne. Conceitos do Sistema
Operacional. John Wiley and Sons, 2008. Também conhecido como "o
livro de dinossauros", pelos dinossauros aparentemente irrelevantes na
capa. Uma grande introdução ao design de SO. O livro tem revisões
frequentes; qualquer um deles deve fazer bem.

Livros sobre Kernels Unix


Estes livros abordam o design e a implementação de núcleos Unix.Os primeiros cinco
discutem um sabor específico do Unix, e os dois últimos focam em questões comuns a
todas as variantes Unix. Se você fosse comprar apenas dois desses livros, eu insistiria
nesses dois últimos.
Bach, Maurice. O design do sistema operacional Unix. Prentice Hall,
1986.Uma boa discussão sobre o design do Unix System V Release 2.
www.it-ebooks.info
408 Bibliografia

McKusick, M., K. Bostic, M. Karels e J. Quarterman. O Projeto e


Implementação do Sistema Operacional 4.4BSD. Addison-Wesley, 1996. Uma
boa discussão sobre o design do sistema 4.4BSD pelos designers do sistema.
McKusick, M. e G. Neville-Neil. O Projeto e Implementação do Sistema
Operacional FreeBSD. Addison-Wesley, 2004.Uma boa discussão sobre o
design e implementação do FreeBSD 5.2.
McDougall, R e J. Mauro. Solaris Internals: Solaris e arquitetura de
kernel OpenSolaris. Prentice Hall, 2006. Uma discussão interessante
sobre os principais subsistemas e algoritmos no kernel do Solaris.
Cooper, C., e C. Moore. Internas do HP-UX 11i. Prentice Hall,
2004.Uma olhada nos internos do HP-UX e da arquitetura PA-RISC.
Vahalia, Uresh. Unix Internals: As Novas Fronteiras. Prentice Hall, 1995. Um livro
soberbo sobre recursos modernos do Unix, como o gerenciamento de threads e a
preempção do kernel.
Schimmel, Curt. Sistemas UNIX para Arquiteturas Modernas: Multiprocessamento
Simétrico e Cache para Programadores Kernel.Addison-Wesley, 1994.Um livro soberbo
sobre os perigos de sup-portar um Unix moderno em uma arquitetura moderna. Altamente
recomendado.

Livros sobre os kernels Linux


Estes livros, como este, discutem o kernel Linux.There não são muitos
bons livros nesta categoria.Estes dois, no entanto, eu recomendo.
Benvenuti, Christian. Compreendendo os internos da rede Linux.
O’Reilly and Associates, 2005.Um mergulho profundo nas redes Linux.
Corbet, J., A. Rubini e G. Kroah-Hartman. Drivers de dispositivo Linux. O’Reilly e
Asso-ciates, 2005.Uma excelente discussão sobre como escrever drivers de dispositivo
para o kernel 2.6, com foco nas interfaces de programação que suportam vários tipos
de dispositivos.

Livros sobre outros núcleos


Entender a concorrência nunca é prejudicial.Esses livros discutem o
design e a implementação de sistemas operacionais diferentes do Linux.
Veja o que eles acertaram e o que eles erraram.
Kogan, M. e H. Deitel. The Design of OS/2.Addison-Wesley,
1996.Uma interessante olhada no OS/2 2.0.
Singh, Amit. Mac OS X Internals:A Systems Approach.Addison-Wesley Professional,
2006.A trata sobre todo o sistema Mac OS X que é tão profundo quanto é largo.
Solomon, D., e M. Russinovich. Windows Interno: cobrindo o Windows
Server 2008 e o Windows Vista. Microsoft Press, 2009.Uma olhada
interessante em um sistema operacional não-Unix.
www.it-ebooks.info
Sites 409

Livros sobre a API Unix


Discussões aprofundadas sobre o sistema Unix e sua API são importantes não apenas para
escrever programas poderosos de espaço de usuário, mas também para entender as
responsabilidades do kernel.
Com amor, Robert. Programação do sistema Linux. O’Reilly and
Associates, 2007. Meu próprio trabalho em nível de sistema de programação
Linux, cobrindo a chamada do sistema Linux e API libc e atenção para
truques e dicas específicas do Linux.
Stevens, W.R. e S. Rago. Programação avançada no ambiente UNIX. Addison-Wesley,
2008.Uma excelente, senão discussão definitiva sobre a interface de chamada do sistema
Unix.
Stevens, W. Richard. UNIX Network Programming, Volume 1 (em
inglês). Prentice Hall, 2004.Um texto clássico sobre a API de soquetes
usada pelos sistemas Unix.

Livros sobre a linguagem de programação C


O núcleo Linux, juntamente com grande parte do sistema Linux, está
escrito em C. Estes dois livros possuem esse assunto.
Kernighan, B. e D. Ritchie. A linguagem de programação C. Prentice
Hall, 1988.O livro definitivo sobre linguagem de programação C, escrito
pelo autor de C e seu colega de trabalho.
van der Linden, Peter. Programação C Especializada. Prentice Hall, 1994.Uma grande
discussão sobre alguns dos detalhes menos compreendidos em C.O autor tem um
maravilhoso senso de humor.

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

Operações atômicas de 64 bits, 180-181

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,

Veja mapas de comportamento comparado, 179

assintótico, algoritmos, 109 interrupções


assíncronas, 114 contexto atômico, 115

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

BSTs (árvores de pesquisa caches de página, 323-326


binárias), 104 caches de objeto address_space, 326-328
buffer, 330-331 buffers, operações address_space, 328-330
blocos, 291-294 hash global, 330
relatórios de erros, árvore radix, 330
envio, 403-404 cache de página, arquivos
Rotina BUG(), 370 de sistema de arquivos,
BUG_ON() rotina, 370 326 caches de gravação,
bugs 324 caches write-through,
solicitando, 370-371 324
intervalo de, 364 cdevs Consulte dispositivos de
reproduzindo, 363-364 caracteres
edifício Programador de E/S CFQ
Booleanos, 14-15 (Complete Fair Queuing),
303
kernel, 13-16
Agendadores CFS, nós de
módulos, 340-342
dispositivo de 172 caracteres,
minimização de ruído, 15
dispositivos de 337
gerando vários trabalhos, 16
caracteres, 289, 337
looping ocupado, temporizadores, 225-
226 caracteres, tamanho da

ordem de bytes, 389-391 palavra, 381 tarefas filhas,


reparenting, 38 Choffnes,

A David R., 407 listas vinculadas


circulares, algoritmo
Biblioteca C, 5
clarividente 86-87, 325
chamadas do sistema, 70-71
classes, agendador de
C Linguagem De Programação, O, 399,
409 processo, função cli() 46-47,

comentários no estilo C++, 400 128

remoção de cache, 324-325 relógios, relógio em tempo real (RTC), 217

acertos de cache, 323 função clone(), sinalizadores, 34-35

erros de cache, 323 chamada do sistema clone(), 32-34

caches, 246 clusters, 290

erro de cache, 323 bloqueio grosseiro, 172

armazenamento em cache código, código de interrupção segura, 168

armazenamentos auxiliares, códigos, bloqueios, comparados, 186


323 estilo de codificação
caches de buffer, 330-331 chaves, 398-399
remoção de cache, 324-325 comentários, 400-401
acertos de cache, 323 consistência, 396
cache de página, 324 rotinas existentes, 402
que fixa ex post fato, 403
funções, 400
diretivas de pré-processador ifdef,
402 importância de, 396

www.it-ebooks.info
estruturas de dados

recuo, 396 segmentos contestados, 184


comprimento da linha, 399-400 contenção, bloqueios, 171
convenções de nomenclatura, contexto
400 interrupções, 115
produtividade, 396 processos, 29
espaçamento, 397-398 chamadas do sistema, 78-81
inicializadores de estrutura, função switch() de contexto, 62
402-403
método context_switch(), 380
instruções switch, 396-397
alternância de contexto, programador de
typedefs, 401 processo, 62
comandos controlando interrupções, 127-130
modprobe, 343 convertendo operações atômicas, 177
SysRq, 371 Cooper, Chris, 408
Comentários, estilo de codificação, multitarefa cooperativa, programador de
recursos de ajuda da comunidade 400- processos, 41-42
401, depuração, função complete() 377, páginas COW (copy-on-write, cópia na gravação),
31
198
função copy_process(), 32
Completamente Fair
Corbet, Jonathan, 408
Scheduler, 43 variáveis de
contadores, implementação, operações
conclusão, simultaneidade
atômicas, 177 semáforos de contagem,
197-198
191-192 páginas COW (cópia na
causas, 167
gravação), 31
interrupções, 167
arquivo CREDITS, 403
kernel, 21
regiões críticas, vários segmentos de
preempção do kernel,
execução, 162
167 pseudo-
diretório de criptografia, árvore de
concorrência, 167
origem do kernel, 13 ctime() library
dormindo, 167 softirqs,
call, 221
167
data e hora atuais, 207, 220-221
multiprocessamento
CVS, 11
simétrico, 167 tasklets, 167
cilindros, 290
simultaneidade real, 167
programação concorrente,
D
threads, função 33
D-BUS, Camada de Evento Kernel, 361
cond_resched(), 226 variáveis de
seção de dados (processos), 23
condição, depuração, 374
estruturas de dados
condicionais, UIDs, opções 373-
árvores binárias, 103-104
374 CONFIG, configuração 168,
BSTs (árvores de pesquisa binárias),
kernel, 14-15
104
opções de configuração, módulos,
árvores de pesquisa
gerenciamento, 344-346
binárias balanceadas
congestionamento, evitando com automaticamente, 105-
vários threads, 334-335 108
www.it-ebooks.info
416 estruturas de dados

escolhendo, 108 pid_t, 384


sistemas de arquivos, 285-288 portabilidade, 384
liberando, camadas de laje, tipos de dados especiais, 384-385
245-252 uid_t, 384
listas vinculadas, 85 regras de uso, 384
adicionando um nó a, 90-91 desativando temporizadores,
listas vinculadas circulares, programador de E/S com
86-87 prazo final 223, 300-302
definindo, 89-90 deadlocks
excluindo um nó de, 91-92 ABBA, 170
listas duplamente
segmentos, 169-171
vinculadas, 85-86 iterando
depuradores no depurador
ao contrário, 94 iterando ao do kernel, 372-373
remover, 95 implementação depuração, 363-364, 378
do kernel, 88-90 atomicidade, 370
manipulando, 90-92 nós em pesquisa binária, 376-377
movimento, 92 navegando, Rotina BUG(), 370
87-88 listas com vínculo bugs
único, 85-86 nós de solicitando, 370-371
emenda, 92 atravessando, reprodução, 363-364
93-96 recursos de ajuda da
mapas, 100-101 comunidade, 377 variáveis
UIDs (identificação exclusiva de condição, 374
números), 100-103 dificuldade de, 363
filas, 96-97 informações de despejo,
criando, 97-98 370-371 dump stack()
desenfileirando dados, 98 rotina, 371 opções de
destruindo, 99 kernel, 370
enfileirando dados, 98 Comandos da tecla
kfifo, 97- 100 Magic SysRq, 371-372
obtendo tamanho de, 98 limitação de
redefinindo, 99 ocorrências, 375-376
VFS (Virtual Filesystem, sistema oops, 367-369
de arquivos virtual), 265-266
kallsyms, 369-370
tipos de dados kysmoops 369
atômico_t, 384 panic() rotina, 371
caractere, 386 imprimindo, 364-367
dev_t, 384 limite de taxa, 375-376
tipos de dados de tamanho bloqueios de rotação, 186
explícito, 385-386 gid_t, 384 estatísticas, 374
tipos de dados opacos, 384 UID como condicional, 373-374
www.it-ebooks.info
do função timer(),

declarando ksets, 351


kobjects; 352- 353 ktypes, 350- 351
listas vinculadas, 88 ponteiro de nome, 349
tasklets, 144-145 ponteiro pai, 350
versão decodificada, contagens de referência, 353-355
oops, 369 deferências, incrementando e
definição de 92 decrescente, 354
operações atômicas, 177 estrutura kref, 354-355
listas vinculadas, 89-90 ponteiro sd, 350
Deitel, Harvey, 407-408 estruturas, 351-352
Deitel, Paulo, 407 dispositivos, 337
função del_timer_sync(), 223 dispositivos de bloco,
atrasos, temporizadores, 226-227 289-290
indicando chamadas do sistema, 73-74 cabeçotes, 291
dentries, sysfs, 355 buffers, 291-294
objeto dentry, VFS (Virtual Filesystem, setores, 290-291
sistema de arquivos virtual), 265, 275- dispositivos de caracteres, 289, 337
276 drivers, 114
caches, 276-277 dispositivos glock, 337
operações, 278-279 dispositivos diversos, 338
estados, 276 dispositivos de rede, 338
desenfileirando dados, 98 Dijkstra, Edsger Wybe, 192
design, camadas de laje, 246-252 diretórios, 264
Design e implementação do sistema objeto de diretório, VFS (Virtual
operacional 4.4BSD, The, 408 Sistema de arquivos), 265
Projeto do OS/2, The, 408 listas sujas, 324
Design do sistema operacional página suja write-back, 331
Unix, The, 407
disable irq nosync() function,
tipo de dados dev_t, 384
129 disable irq() function, 129-
kernel de desenvolvimento, 8-10
130 disable_irq() function, 130
manutenção, 403 disable_irq_nosync() function,
modelo do dispositivo 130 disabling
benefícios, 348-349
metades inferiores, 157-159
kobjects; 349- 350
interrupções, 127-129
declarando, 352-353
preempção do kernel, 201-202
incorporação, 350
função do mmap(), 318-319
gerenciando, 352-353
do função softirq(), 138-141
sistema de arquivos sysfs,
do função timer(), 218
355-362

www.it-ebooks.info
418 documentação documentação

estilo de codificação, 396


documentação autogerada, 401 função exec(), 31
arquivos executáveis, 29
Diretório de documentação, árvore
de origem do kernel, 13 execuções, softirqs, 138-
palavras duplas, 382 140 exokernel, 7
listas duplamente vinculadas, 85-86 Programação C Especialista, 409

função down interruptible(), função tipos de dados explicitamente

193-194 down trylock(), função dimensionados, 385-386 símbolos

193-194 down(), função 194 exportados, módulos, 348


downgrade write(), 195
função do_exit(), 36 E
função do_IRQ(), 123-125 fair scheduling, árvore
função do_munmap(), 320 genealógica 48-50,
função do_timer(), 218 processos, 29-30
drivers, 114 campos, descritor de memória,
Driver RTC (relógio em tempo real), atributos de arquivo 307-308,
120-122 kobjects, 358-359
diretório drivers, árvore de origem do
convenções, 360-361
kernel, 13 informações de despejo,
criando, 359-360
depuração, função dump_stack() 370-
destruindo, 360
371, temporizadores dinâmicos 371,
metadados do arquivo, 264
207, 222
objeto de arquivo, VFS (Virtual
Filesystem, sistema de arquivos
E virtual), 265, 279-280

função printk() inicial, 365


operações, 280-284
mapeamento com backup em arquivo, 318
elementos, 85
arquivos, 263
elevadores, programadores de
I/O, 299-300 kobjects
arquivos de cabeçalho, 17
embutidos, 350 função
kobjects, adicionando
enable_irq(), 130 interrupções
a, 358-361 metadados,
264
habilitadas, 127-128 dados
sistema de arquivos
enfileirados, 98
camada de abstração,
estrutura de entidade,
interface 262-263,
programador de processo, 50
261-262 sistemas de
pontos de entrada, programador,
arquivos UNIX, 264
57-58 época, 220
blocos do sistema de arquivos, 290
Dispositivos Ethernet. Ver eventos
arquivos de sistema de
de dispositivos de rede, relação
arquivos, cache de página,
com o tempo, 207 despejo (cache),
interface de sistema de
324-325 exceções, 114
arquivos 326, 261
sistemas de arquivos, 263, 264. Consulte Linux, suporte, 288
também VFS (Virtual Filesystem, sistema de
arquivos virtual) metadados, 264
estruturas de dados, 285-288

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

idle process, sistemas diretório include, árvore de origem do kernel, 13

operacionais, 6 patches incrementais, 12

idr_destroy() function, incrementos, operações atômicas, 175-176


103 utilitário de recuo, 403

IEEE (Institute of Electrical recuo, estilo de codificação, 396


and Electronics Engineers), índices, softirqs, 140-141
70 função init complete(), 198
diretivas de pré- diretório init, árvore de origem
processador ifdef,
do kernel, 13 inicialização,
estilo de codificação,
402 semáforos, 192 funções em
implementação linha, 400

manipuladores de interrupção, GNU C, 18-19


123-126 inode, 264
softirqs, 137-140 objeto inode, VFS (Virtual Filesystem,
chamadas do sistema, 74-78 sistema de arquivos virtual), 265, 270-
274
tasklets, 142-144
inodes, caches de página, 331
temporizadores, 224
instalação
filas de trabalhos, 149-153
kernel, 16
implementando
módulos, 342
chamadas do
código-fonte, 12
sistema, 82-83 na
função interrupt(), 130

www.it-ebooks.info
422 operações atômicas de inteiro

operações atômicas de número inteiro, velocidade de, 122


176-179
temporizador, 217-220
Operações atômicas de 64 bits,
metade superior, 115
180-181
metades superiores, 133
interfaces
quando usar, 135
operações atômicas, 176
escrevendo, 118-119
sistema de arquivos, 261-262
solicitação de interrupção (IRQ), 114
camadas de laje, 249-252
rotina de interrupção de serviço (ISR).
encapsulamento, 402
Consulte manipuladores de
representação interna, unifica interrupção
variável global, 213-214
pilhas de interrupção, 122
valores internos, temporizadores, 222 código de interrupção segura,
comunicação entre processos (IPC) 168 interrupções, 5, 113-114,
mecanismo, 7
117, 131
contexto de interrupção, 5
assíncrono, 114
kernels, 122
simultaneidade, 167
espaço de pilha, 122-123
contexto, 115
manipuladores de interrupção, 5, 113
controlando, 127-130
metades inferiores, 115-116,
desativar a função irq nosync
benefícios 133-135, 134-
(), 130 desativar, 127- 129
135
habilitar função irq(),
Interface BH, 135-136
130 habilitando, 127-
softirqs, 136-141
128
filas de tarefas, 135
na função interrupt(),
tasklets, 136
130 na função irq(), 130
controlando interrupções, 127-
função irqs disabled(),
130
função 130 irq disable()
função do_IRQ(), 123-125
local, função 130 irq enable()
sinalizadores, 116-117
local, função 130 irq save()
liberando, 118
local, 130 síncrona, 114
função free_irq(), 118
função de, 114-115 temporizadores, frequências,

implementação, 123-126 209

código de interrupção segura, método ioctl(), 284


168 IPC (comunicação entre processos)
mecanismo, 7
limitações, 133
diretório ipc, árvore de origem
travas, 185-186
do kernel, 13 IRIX (SGI), 2
reentrância, 119
IRQ (interrupt request), 114
registrando, 116
função irqs_disabled(), 130
função request_irq(), 118
ISR (interrupção de rotina de
Driver RTC (relógio em tempo
serviço), 114 listas vinculadas
real), 120-122 compartilhado,
iterativas, 94-95
119-120
www.it-ebooks.info
mensagens do kernel

J implementando, listas vinculadas, 88-90


jiffies, 391
instalando, 16
origens do termo, 212- contexto de interrupção, 5
213 bloqueios manipuladores de interrupção, 5
sequenciais, 200
falta de proteção da memória, 20
módulos, 7
unifica variável global, 212-213
monolítico, 7
Valores de HZ, 216
representação interna, 213- convenções de nomenclatura, 9
portabilidade, 21
214 enrolamento, 214-216
preempção, simultaneidade, 167
produtor e consumidor
K padrão, 96
kallsyms, 369-370 diretórios raiz, 12-13
Karels, Michael J., 408 regras, 16-21
sistema de compilação do kbuild, pequeno, tamanho fixo, 21
módulos de construção, 340- 342
árvore de origem, 12-13
ALERTA KERN loglevel, função printk(), 366
kernel estável, 8-9, 11
KERN CRIT loglevel, função printk(), 366
estrutura, 88
KERN DEBUG loglevel, função printk(), 366
sincronização, 21
KERN EMERG loglevel, função printk(), 366
chamadas do sistema, 71
KERN ERR loglevel, função printk(), 366
kernels do fornecedor, 14
KERN INFO loglevel, função printk(), 366
diretório kernel, código-fonte kernel
KERN NOTICE loglevel, função printk(), 366 árvore, 13
AVISO KERN loglevel, função printk(), Camada de Evento do Kernel
366
D- BUS, 361
kernel
kobjects; 361- 362
aplicativos,
netlink, 361
relacionamento, 6 edifício,
parâmetros, 362
13-16
cargas úteis, 361
C biblioteca, 17
strings verbais, 361
simultaneidade, 21 configurando,
função kernel locked(), 199
14-15 recursos de ajuda para
mantenedor do kernel, 403
depuração, 377 definidos, 4
mensagens do kernel
kernel de
daemon klogd, 367
desenvolvimento, 8-10
buffer de log, 366-367
download, 11 pilha de
opa, 367-370
tamanho fixo, 20
daemon syslogd, 367
instruções de ponto
flutuante, 20 hardware, 5
relacionamento, 6

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

natureza não-recursiva, 185 VMAs (áreas de memória virtual), 312


lançando, 193 mapeamentos (memória alta), 253
semáforos, 190-191 mapeamentos permanentes,
semáforos binários, 191- 254 mapeamentos
192 contagem de temporários, 254-255
semáforos, 191-192 mapas, UIDs (números de
criação, 192-193 identificação exclusivos),
100
implementação, 193-194
inicialização, 192
alocando, 101-102
procurando, 102
semáforos leitor-escritor,
removendo, 103
bloqueios sequenciais 194-195,
Mauro, Jim, 408
bloqueios de rotação 200-201,
mb() function, 204-205
183-187
McCreight, Edward M., 327
metades inferiores, 187-188
McDougall, Richard, 408
depuração, 186
McKusick, Marshall Kirk,
métodos, 184-187
408 mdelay() function, 227
bloqueios de rotação de leitor-
gravador, 188-190 memory
uso em manipuladores de alocação, 231, 260
interrupção, 185-186 método de escolha,
versus código, 186 259
voluntário, 166 mapeamentos de alta
buffers de log, mensagens do kernel, memória,
366-367 loglevels, função printk(), 365- 253-255
366 função kfree (), 243- 244
pesquisando UIDs (números de função kmalloc (), 238- 244
identificação exclusivos), 102- páginas, 231- 232, 235- 237
103 alocações por CPU, 255-
Amor, Robert, 409 258 camadas de laje, 245-
LRU (menos usado recentemente), 252
remoção de cache, 325
alocando
estaticamente na
O pilha, 252-253
Mac OS X Internals: sistemas A função vmalloc(), 244-
Abordagem, 408 245 zonas, 233-235
comandos de chave Magic SysRq, memória alta, 393
371-372 lista vinculada, 313
mantenedores, 403 áreas de memória, 305-306
função malloc(), 238, 306 descritor de memória, 306
sinalizadores de tipo de mapa, 319 campo mmap, 313
mapeamento, 100 MMUs (memory
mapeamento anônimo, 318 management units), 231
mapeamento com backup em objetos, fixados, 353
arquivo, 318
www.it-ebooks.info
módulos 427

páginas, 231-233 ioctl (), 284


liberando, 237 readpage(), 328
obtendo, 235-244 bloqueios de rotação, 184-187
páginas zeradas, 236-237 switch_mm(), 380
zonas, 233-235 switch_para(), 380
espaço de endereço de métodos de sincronização, 175
processo, 305 árvore Operações atômicas de 64
vermelho-preta, 313 bits, 180-181 operações
VMAs (áreas de memória atômicas, 175-179 barreiras,
virtual), 309-310, 314- 203-206
315
operações atômicas bitwise,
sinalizadores, 311-312
181-183 BKL (Big Kernel Lock),
listas, 313-314
198-199 variáveis de conclusão,
localizando, 316-317
197-198 mutexes, 195-197
operações, 312-313
operações de bit não
mapeamento particular, 312
atômico, 183 pedidos,
mapeamento
203-206 desativação de
compartilhado, 312
preempção, 201-202
árvores, 313-314
semáforos, 190-195
áreas de memória, 314-315. Consulte
também VMAs (áreas de memória bloqueios sequenciais,
virtual) 200-201 bloqueios de
listas, 313-314 spin, 183-190
manipulando, 315-318 página(s) de gravação, 328
árvores, 313-314 designs de microkernel, designs
descritor de memória, 306 monolíticos, comparados, 7
alocando, 308 microkernels, mensagem
destruindo, 309 passando, 7 threads de
campos, 307-308 migração, 66 dispositivos
threads do kernel, 309 diversos, 338
estrutura mm, 309 mm diretório, árvore de origem do kernel, estrutura

mapas de memória, 306 unidades de 13 mm, descritor de memória, função mmap() 309,

de gerenciamento de memória 306, 319

(MMU), 6 proteção de memória, MMUs (memory management units,


kernel, falta de, 20 unidades de gerenciamento de
leituras/gravações de memória, memória), 6, 231 mod função timer(),
203-206 função memset(), 353 223
funções de mesclagem, programador de Sistemas operacionais
I/O, 298-299 modernos, comando
mensagem passando, 7 modprobe 407, 343
arquivos de metadados, 264 módulos, 14, 337-338
métodos edifício, 340-342
switch_de_contexto(), 380
opções de dependências, geração, 342
configuração,
gerenciando,
344-346

www.it-ebooks.info
428 módulos

símbolos exportados, 348 NET_RX_SOFTIRQ tasklet,


Olá, Mundo!, 338-340 140 NET_TX_SOFTIRQ
instalando, 342 tasklet, 140 netlink, Kernel
kernel, 7 Event Layer, 361
vivendo externamente da dispositivos de rede, 338
árvore de origem do Neville-Neil, George V., 408
kernel, 342 nice values, processos, 44
carregando, 343-344 nice() function, 66 nodes, 85
parâmetros, 346-347
listas vinculadas
removendo, 343
adicionando a, 90-91
árvores de origem, 340-342
excluindo de, 91-92
macro MODULE_AUTHOR(),
movendo, 92
macro 340
união, 92
MODULE_DESCRIPTION(), função
operações de bit não atômico,
340 module_exit(), macro 339
183 Noop I/O scheduler,
module_init(), macro 339
notação 303-304, notação
MODULE_LICENSE(), 340
Húngara, 400 números,
kernel monolítico, designs de
chamadas do sistema, 72
microkernel, comparados, 7
Moore, Chris, 408
Morton, Andrew, 9
O
sinalizadores de montagem, 286 O(1) scheduler, 42-43 modelo de
pontos de montagem, 263 dispositivo orientado a objeto,

chamadas do sistema de Linux, 8 objetos


multiplexação, 74 fixado, 353
multiprocessamento, simétrico VFS (Virtual Filesystem,
multiprocessamento, 161
sistema de arquivos
simultaneidade, 167 virtual), 265-266 dentry,
multitarefa, 41-42
265, 275-279 diretory, 265
função munmap(), 320
arquivo, 265, 279-284
mutexes, 191, 195-197
inode, 265, 270-274
operações, 265
N superblock, 265-269
ponteiro de nome, modelo de limitação de ocorrência, depuração,
dispositivo, 349
375-376 oops, mensagens do kernel,
estrutura de dados de namespace, 287-
367-370 tipos de dados opacos, 384
288
operações, VMAs (áreas de memória
espaços para nomes, 263
virtual), 312-313
convenções de nomenclatura
função open softirq (), 141
estilo de codificação, 400
função open(), 5
kernel, 9
diretório net, árvore de origem do
kernel, 13
www.it-ebooks.info
patches 429

chamada de sistema open(), page global diretory (PGD), 321


261 Operating System page middle diretory (PMD), 321
Concepts, 407 sistemas sinalizadores de proteção de
operacionais, 4 página, 319
atividades gerais, 5 tamanho da página,
processo ocioso, 6 arquiteturas, tabelas de 391-
espaço do kernel, 5 392 páginas, 320-322
multitarefa, 41 possibilidades futuras de
portabilidade, 379-380 gestão, 322 níveis, 320-321
escalabilidade, 171 write-back de página, 323
supervisor, 4 thread do kernel bdflush,
chamadas do sistema, 5 write-back de página suja
operações sem tickless, 212 333-334, thread do kernel
Sistemas operacionais, 407 331 kupdated, modo de
Sistemas operacionais: design e laptop 333-334, 333
Implementação, 407 thread de kernel pdflush, 333-334
objeto operations, VFS configurações, 332
(Virtual Filesystem,
memória paginável do kernel, 8
sistema de arquivos
virtual), 265 páginas (memória), 231-233
preservação da ordem, 100 liberando, 237
ordenação obtendo, 235-236
atomicidade, comparada, 179 função kfree (), 243- 244
operações de barreira, 179 função kmalloc (), 238- 244
leituras/gravações de função vmalloc(), 244-245
memória, 203-206 páginas zeradas, 236-237
OS News. com, 409 tamanho da palavra, 381
zonas, 233-235
P função panic(), 371
paralelismo, threads, 33
PAE (Physical Address Extension),
passagem de parâmetro, chamadas do sistema, 74
caches de 253 páginas, 323-326
parâmetros
objeto address_space, 326-
Camada de Evento Kernel, 362
328 operações
address_space, 328-330
módulos, 346-347
caches de buffer, 330-331
chamadas do sistema, verificando, 75-
78
arquivos de sistema de
ponteiro pai, modelo de
arquivos, 326 threads de
dispositivo, 350 tarefas sem
liberação, 331-335
pai, 38 a 40 patches
hash global, árvore
gerando, 404-405
radix 330, método
incremental, 12
readpage() 330, método
enviando, 406
writepage() 328, 328
função page_count(), 232
www.it-ebooks.info
430 payloads, Camada de evento do preempção do kernel,
kernel 393
Linux, 380-381
payloads, Camada de evento sistemas operacionais,
379-380
de kernel, thread kernel 361
pdflush, tarefa pdflush 333-
334, 35
alocações por CPU, 255-256
interface percpu, 256-258
dados por CPU
benefícios, 258-259
sobrecarregando o cache, 258
interface percpu, 256-258
em tempo de compilação, 256-
257
em tempo de execução, 257-
258
desempenho, chamadas do sistema,
72 mapeamentos permanentes de
memória alta, 254 PGD (page global
diretory), 321
PID (identificação do
processo), tipo de dados 26
pid_t, 384 objetos fixados,
353
PIT (programmable interrupt timer,
temporizador de interrupção
programável), 217
PMD (diretório do meio da página), 321
Ponteiros, desreferências, 92
política (programador), 43-46
Processos vinculados à E/S,
programação 43-44 com base
em prioridades, 44 processos
vinculados ao processador,
43-44 intervalos de tempo, 45
chamada de sistema poll(), 211
polling, 113
estourando, temporizadores, 208
portabilidade, 21, 379
ordem de bytes, 389-391
alinhamento de dados, 386-389
tipos de dados, 384
memória alta, 393
implicações do, 393
função printf(), 5, 17, 364
níveis de log, 365-366
transposição, 367
arquitetura de tamanho de página, 391
impressão, depuração,
pedidos de processadores, 392
função printk() 364-367, 17,
programador, 380 375
SMP (multiprocessamento simétrico),
depuração, 364-366
393 vezes, 391
níveis de log, 365-366
tamanho da palavra, 381-384
não robustez de, 365
POSIX, chamadas do sistema, 70
robustez do, 365
preempt count() function, 202 preempt
transposição, 367
disable() function, 202
programação baseada em prioridade, 44
preempt enable no resched() function, 202
mapeamento privado, VMAs (áreas
preempt enable() function, 202 preempção de memória virtual), 312
kernel, simultaneidade, 167 /proc/interrompe o arquivo,
programador de processos, 62 126-127 espaço de
preempção do kernel, 63-64 endereço de processo
preempção do usuário, 62-63 intervalos de endereço
desativação de preempção, 201-202 criando, 318-319
multitarefa preventiva, programador removendo, 320
de processos, 41

www.it-ebooks.info
programação regular, 48-50

plano versus segmentado, 305


áreas de memória, manipulação,
315-318 descritores de memória,
306-308
alocando, 308
destruindo, 309
threads do kernel, 309
mm struct, 309
visão geral, 305
tabelas de páginas, 320-322
VMAs (áreas de memória
virtual), 309-310, 314-
315
sinalizadores, 311-312
listas, 313-314
operações, 312-313
árvores, 313-314
descritores de processo
alocando, 25-26
estados, 27-29
armazenando, 26-27
lista de tarefas, 24
TASK_INTERRUPTIBLE
processo, 27
TASK_RUNNING processo,
27 TASK_STOPPED
processo, 28
TASK_UNINTERRUPTIBLE
processo, 28
descritores de processo (lista de
tarefas), programador de
processo 24-25, 41
algoritmo, 46-50
classes, 46-47
Agendador
Completamente Fair
Scheduler, 43
mudança de contexto, 62
multitarefas cooperativas,
41-42 estrutura de
entidades, 50 pontos de
entrada, 57-58
evolução, 42-43
process contabilização de tempo, 50-52
os fatias de tempo, 42
Sistemas Unix, 47-48
execução, 50-59, 61 tempo de execução virtual, 51-52
Programador O(1), 42-43 produzindo, 42
política, 43-46 estados do processo, 27-29
Processos processos
vinculados à E/S, adicionando a árvores, 54-55
programação 43-44 espaço de endereço, 23
com base em contexto, 29
prioridades, 44 criando, 31
processos estruturas de dados, 286-288
vinculados ao definido, 23
processador, 43-44 Processos vinculados a I/O, 43-44
intervalos de tempo, ciclo de vida de, 24
45 valores de nice, 44
preempção, 62-64 tempo real, 44
multitarefa preventiva, 41 processos em tempo real, 44
seleção de processos, 52-57 remoção das árvores, 56-57
políticas de programação em recursos, 23-24
tempo real, 64-65 processos executáveis, 41
Prazo final da escada rotativa escalabilidade, 171
agendador, 43 lista de tarefas, 24
chamadas do sistema, 65-67

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

Rago, Stephen, 409 prioridade em tempo real, 44


elevar função softirq irqoff(), 141 políticas de programação em tempo real,
64-65
função raise softirq (), 141
árvores binárias vermelho-preto, 105-106
limite de taxa, depuração, 375-376
árvores rubro-negras, memória, 313
árvores-mães, 106-108
reentrância, manipuladores de
RCU_SOFTIRQ, 140 interrupção, 119
a barreira de leitura depende() da função, contagens de referência, modelo de
204- 205 bloqueio de leitura função irq(), 189 dispositivo, 353-355
read lock irqsave() function, 189 registro, manipuladores de interrupção,
116
read lock() function, 189 read
tempo relativo, 207
seqbegin() function, 220
reparando tarefas filhas, 38
leia a função seqretry(), 220
ARQUIVO REPORTING-BUGS, 404
ler desbloquear função irq(), 189
filas de solicitação, camada de bloco de
função read unlock irqrestore(), 189
I/O, 297
ler função unlock(), 189
função request_irq(), 118
função read(), 326
Ritchie, Dennis, 1-3, 399, 409
chamada do sistema read(), 261
função rmb(), 204-205
semáforos leitor-escritor, 194-195

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

Solaris Internals: Solaris e arquitetura


de kernel OpenSolaris, 408
Salomão, Davi, 408
classificando funções, programador de
I/O, 298-299
diretório de som, árvore de origem do
kernel, 13
código fonte, 11-12
árvores de origem, 12-13
módulos, 340-342
estilo de codificação de
espaçamento, tipos de dados
especiais 397-398, método
locked() 384-385 spin, método
init() 187 spin lock, função
irq() 186 spin lock, método
irqsave() 186 spin lock,
bloqueios 187 spin, 183-186
metades inferiores, 187-188
depuração, 186
métodos, 184-187
mutexes, comparado, 197
bloqueios de rotação de leitor-
gravador, 188-190
spin try lock() method, 186
spin unlock() method, 187
spin_is_locked() method, 187
spin_lock() method, 187
spin_lock_init() method, 187
spin_lock_irq() method, 186
spin_lock_irqsave() method,
185 spin_trylock() method, 187
spin_unlock_irq() method, 187
spin_unlock_irq() method
método spin_unlock_irqrestore(), 185-
187 spins, 184
kernel estável, 8-10
manutenção, 403
pilhas
contexto de interrupção,
122-123 pilhas de
interrupção, 122
métodos de sincronização objeto superblock, VFS (Virtual
Filesystem, sistema de arquivos
virtual), 265-269
instruções, instruções switch,
Swift, Jonathan, 390
estilo de codificação, 396-
397 instruções switch, estilo de
alocando memória codificação, método switch_mm()
estaticamente na pilha, 396-397, método switch_to() 380,
252-253 multiprocessamento simétrico 380
estatísticas, depuração, 374 simultaneidade, 167
Stevens, W. Richard, 409 introdução de, 161-162
armazenando descritores de processo, multiprocessador simétrico (SMP),
26-27
8 sincronização, 162-168, 172
preenchimento de estrutura,
alinhamento de dados, 387-389 kernel, 21
função strcpy(), 5 motivos, 162-163
FLUXOS, 8 métodos de sincronização, 175
inicializadores de estrutura, operações atômicas, 175
estilo de codificação, envio operações de 64 bits,
de 402-403 180-181 operações de
relatórios de erros, 403-404 bit a bit, 181-183
patches, 406 conversões, 177
inscrevendo-se na LKML contra-implementação, 177
(Linux Kernel Mailing definindo, 177
List), 395 incrementos, 175-176
estrutura de dados de superbloco, 264

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

kernel 74-78, multiplexação 71, 74 secundários, 71

números, passagem de 72 parâmetros, verificando, 75-


desempenho 74, 72 POSIX, 70 78
agendador de processos, temporizadores do sistema,
afinidade de processador 65- 207-208, 217 tempo de
67, tempo de processador 66, atividade do sistema, 207-
produtividade, 66 prós e 208

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

hora estrutura de dados timespec, 220


tempo absoluto, 207 diretório tools, código-fonte do kernel, 13
metades superiores, manipuladores de
data e hora atuais, 220-221 interrupção, 115, 133
HZ, 391 Torvalds, Linus, 3
importância de, 207 transposição, função printk(), 367
conceito de kernel de, 208 percorrendo listas vinculadas, 93-96
tempo relativo, 207 árvores
contabilização de tempo, programador de
processos, 50-52 adicionando processos a, 54-55
complexidade de tempo, algoritmos, 110-111 removendo processos de, 56-57
VMAs (áreas de memória virtual), 313-
contador de carimbo de data/hora (TSC), 217 314
chamada do sistema time(), 221 tristados, 14
tempos limite, filas de espera, repouso, 229 Tru64 (Digital), 2
interrupção do temporizador, 207-208 simultaneidade real, 167
manipulador de interrupção do temporizador,
217-220 tentar função wake up(), 61
estratégia de duas listas, remoção de
Tarefa TIMER_SOFTIRQ, 140 cache, 325-326
temporizadores sinalizadores de tipo, 241-242
looping ocupado, 225-226 typedefs, estilo de codificação, 401
adiando a execução, 225-230
excluindo, 223 E
temporizadores dinâmicos, 207, 222
função udelay(), 227
atingindo, 208 UIDs (números de identificação
exclusivos), 100
implementação, 224-230
alocando, 101-102
valores internos, 222
procurando, 102
manipulador de interrupção, 217-220
removendo, 103
interrupções, frequências, 209
tipo de dados uid_t, 384
kernel, 136
Compreendendo internos de rede Linux, 408
modificando, 223 Universidade da Califórnia em Berkeley,
BSD
estourando, 208 (Berkeley Software Distributions), 2
popularidade de, 222 Unix, 1
finalidade do, 222 características, 2-3
condições de corrida, 224 criadores, 1
histórico de desenvolvimento, 1-
pequenos atrasos, 226-227 2
temporizador do sistema, 217 evolução, 3
usando, 222-223 sistemas de arquivos, 263-264
contagem de timeslice, processos, 211 Linux, comparado, 6-8
fatias de tempo popularidade de, 1
programador de processos, 42 Unix Internals: As Novas Fronteiras, 408
política do agendador de processos,
45 Sistemas Unix, agendamento, 47-48

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

função worker thread(), 151 manipuladores de

threads de trabalho, 149 tasklet, 145


wrap, jiffies variáveis globais, 214-216
variável xtime, 220-221
interfaces de empacotamento, 402
cache de gravação, 324
yield() chamada do sistema, 67
write lock irq() function, 189 write lock
produzindo
irqsave() function, 189 write lock()
programador de processos, 42
function, 189 write trylock() function,
tempo do processador, 66
190
função write unlock irq(), 189
Z
função write unlock irqrestore(), 190
páginas zeradas, obtenção, 236-
função write unlock(), 189
237 modificadores de zona,
função write(), 5
sinalizadores gfp_mask, 240
write() chamada do sistema, 261
zonas, 234
caches write-through, 324
páginas, 233-235
método writepage(), 328
ZONE_DMA, 233-235
escreve famintas, 300
ZONA_DMA32, 233
gravação
ZONE_HIGHMEM, 233
ZONA_NORMAL, 233

www.it-ebooks.info

Você também pode gostar