Linux (núcleo): diferenças entre revisões

Origem: Wikipédia, a enciclopédia livre.
Conteúdo apagado Conteúdo adicionado
Gustavob (discussão | contribs)
clean up, typos fixed: 03 de julho → 3 de julho (2) utilizando AWB
Linha 48: Linha 48:
Enquanto que Torvalds continua a lançar as versões de desenvolvimento mais recentes, a manutenção das versões "estáveis" mais antigas é delegada a outros, incluindo [[David Weinehal]] (2.0), [[Alan Cox]] e mais tarde [[Marc-Christian Petersen]] (2.2), [[Marcelo Tosatti]] e depois [[Willy Tarreau]] (2.4) e o próprio Torvalds, [[Andrew Morton]] e [[Adrian Bunk]] (2.6).
Enquanto que Torvalds continua a lançar as versões de desenvolvimento mais recentes, a manutenção das versões "estáveis" mais antigas é delegada a outros, incluindo [[David Weinehal]] (2.0), [[Alan Cox]] e mais tarde [[Marc-Christian Petersen]] (2.2), [[Marcelo Tosatti]] e depois [[Willy Tarreau]] (2.4) e o próprio Torvalds, [[Andrew Morton]] e [[Adrian Bunk]] (2.6).
Para além dos núcleos "oficiais", "árvores" alternativas podem ser obtidas de outras fontes. Distribuidores de sistemas operativos completos mantêm as suas próprias versões do Linux, onde, por exemplo, incluem conrtoladores de dispositivos (''drivers'') que não se encontram incluídos na versão oficial.
Para além dos núcleos "oficiais", "árvores" alternativas podem ser obtidas de outras fontes. Distribuidores de sistemas operativos completos mantêm as suas próprias versões do Linux, onde, por exemplo, incluem conrtoladores de dispositivos (''drivers'') que não se encontram incluídos na versão oficial.

bem pnb!pnb pnb pnb


===Versões iniciais===
===Versões iniciais===

Revisão das 16h20min de 9 de março de 2009

 Nota: Este artigo é sobre o kernel (núcleo) Linux. Para por sistemas baseado neste kernel, veja Linux.

Predefinição:Caixa de informação OS

O Linux é o núcleo (kernel) de um sistema operativo compatível com UNIX. Segundo Bach[1], Tanenbaum[2] e Silberschatz, Galvin e Gagne[3], sistema operacional (sistema operativo) e núcleo (quando monolítico) podem ser considerados sinônimos.

Foi criado por Linus Torvalds, do Departamento de Ciência da Computação da Universidade de Helsinki (Finlândia), com a ajuda de vários programadores voluntários por meio da Usenet em 1991, e subseqüentemente desenvolvido com a ajuda de programadores de todo o mundo como software livre (SL).

História

O kernel Linux foi originalmente escrito por Linus Torvalds, do Departamento de Ciência da Computação da Universidade de Helsinki, Finlândia, e posteriormente desenvolvido com a ajuda de vários programadores voluntários por meio da Usenet.

Torvalds começou o desenvolvimento do kernel como um projeto particular, inspirado pelo seu interesse no Minix, um pequeno sistema UNIX desenvolvido por Andrew S. Tanenbaum. Seus passos podem ser acompanhados pela lista de discussão comp.os.minix (cujas mensagens podem ser vistas em http://groups.google.com/group/comp.os.minix/topics).

Em 3 de julho de 1991 ele tentou obter a especificação POSIX[4].

Em 25 de agosto de 1991 anunciou que estava trabalhando num sistema operacional livre para plataformas Intel 386 e 486[5]. Também informou que seu sistema não utilizava código do Minix, e que não seria portável.

Finalmente, em 5 de outubro de 1991, Torvalds disponibilizou a versão 0.02 do kernel Linux no servidor nic.funet.fi (endereço IP 128.214.6.100). Na mensagem que divulgou essa disponibilização aparece um período bastante conhecido da comunidade (veja o texto original, em inglês[6]):

Você suspira pelos bons tempos do Minix-1.1, quando os homens eram homens e escreviam seus próprios controladores de dispositivos? Você está sem um bom projecto em mãos e deseja trabalhar num SO que possa modificar de acordo com as suas necessidades? Acha frustrante quando tudo funciona no Minix? Sem noites em claro para conseguir que um programa funcione? Então esta mensagem pode ser exactamente para você:-)

E continua:

Como eu mencionei há um mês(?) atrás, estou trabalhando numa versão livre de um sistema similar ao Minix para computadores AT-386. Ele finalmente atingiu um estágio em que poderá ser utilizado (embora possa não o ser, dependendo do que você espera), e eu estou disposto a disponibilizar o código-fonte para ampla distribuição. Está apenas na versão 0.02 (...), contudo eu tive sucesso ao executar o bash, gcc, gnu-make, gnu-sed, compress, etc. nele.

Inicialmente, Torvalds disponibilizou o Linux sob uma licença que proibia qualquer uso comercial[7]. Posteriormente foi adotada a Licença Pública Geral GNU[8].

Apesar de alguns dos programadores que contribuem para o kernel permitirem que o seu código seja licenciado com GPL versão 2 ou posterior, grande parte do código, incluídas as contribuições de Torvalds, menciona apenas a GPL versão 2. Isto faz com que o kernel como um todo esteja sob a versão 2 exclusivamente, não havendo previsões sobre a adopção da nova GPL versão 3.

Versões

Este diagrama, criado com o Free Code Graphing Project, é uma representação artística do núcleo Linux, na sua versão 2.4.0

Torvalds e sua equipe têm continuado a lançar novas versões, consolidando contribuições de outros programadores e introduzindo alterações suas. Antes do lançamento da versão 2.6, o número de versão menor (o segundo componente) par indicavam uma série estável: 1.0.x, 1.2.x, 2.0.x, 2.2.x e 2.4.x; os lançamentos com um número de versão menor ímpar correspondiam a versões de desenvolvimento. O terceiro componente do número de versão correspondia a correções (releases) da versão. A partir da versão 2.6, Torvalds alterou esse padrão, criando um quarto dígito. Assim, a árvore estável e a de desenvolvimento confundem-se. Atualmente, considera-se uma versão tanto mais estável quanto maior o quarto dígito. Enquanto que Torvalds continua a lançar as versões de desenvolvimento mais recentes, a manutenção das versões "estáveis" mais antigas é delegada a outros, incluindo David Weinehal (2.0), Alan Cox e mais tarde Marc-Christian Petersen (2.2), Marcelo Tosatti e depois Willy Tarreau (2.4) e o próprio Torvalds, Andrew Morton e Adrian Bunk (2.6). Para além dos núcleos "oficiais", "árvores" alternativas podem ser obtidas de outras fontes. Distribuidores de sistemas operativos completos mantêm as suas próprias versões do Linux, onde, por exemplo, incluem conrtoladores de dispositivos (drivers) que não se encontram incluídos na versão oficial.

bem pnb!pnb pnb pnb

Versões iniciais

Ver artigo principal: Anexo:Versões do kernel Linux
  • 0.01 - Setembro de 1991 - primeira versão (10.239 linhas de código).
  • 0.02 - Outubro de 1991 - primeira versão disponibilizada publicamente.
  • 0.12 - Janeiro de 1992 - primeira versão sob GPL (19.258 linhas de código).

Versões estáveis

Ver artigo principal: Anexo:Versões do kernel Linux
  • 1.0 - Março de 1994 - Suportava apenas máquinas monoprocessadoras i386 (176.250 linhas de código).
  • 1.2 - Março de 1995 - Adicionado suporte para Alpha, SPARC e MIPS(310.950 linhas de código).
  • 2.0 - Junho de 1996 - Adicionado suporte para mais processadores e foi incluído suporte para SMP (777.956 linhas de código).
  • 2.2 - Janeiro de 1999 (1.800.847 linhas de código).
  • 2.4 - Janeiro de 2001 (3.377.902 linhas de código).
  • 2.6 - Dezembro de 2003 (5.929.913 linhas de código).

Características técnicas

Um diagrama simplificado do núcleo Linux, mostrando seus componentes principais e as camadas que o cercam

As características analisadas nesta seção, particularmente as partes referentes a processos e sistemas de arquivos, são descritas com mais detalhes por Bovet e Cesati[9]; o texto sobre gerenciamento de memória baseia-se em Gorman[10].

Arquitetura

O Linux é um kernel monolítico. Isto significa que as funções do kernel (agendamento de processos, gerenciamento de memória, operações de entrada e saída, acesso ao sistema de arquivos) são executadas no espaço do kernel, compiladas estaticamente ou usando módulos carregáveis. Herdou da linhagem UNIX a capacidade de multitarefa, multiprocessamento, uso de encadeamentos no kernel (kernel threading), preempção do kernel, suporte a aplicações multi-encadeadas (multithreaded application support, por meio de processos leves -- LWP), sistema de arquivos baseado em VFS (Virtual File System).[9]

Todo acesso ao núcleo por uma aplicação deve ser efetuado por meio de chamadas de sistema. Uma chamada de sistema é uma função que permite a criação de processos, solicitação de memória, operação com arquivos, etc.

Já a comunicação do núcleo com o hardware ocorre, basicamente, de dois modos: (i) o núcleo reconhece e gerencia o hardware usando drivers de dispositivos; (ii) o hardware comunica-se com o núcleo por meio de interrupções.

Os controladores (drivers) de dispositivos e extensões do núcleo correm tipicamente no espaço do kernel, juntamente com o restante do núcleo, com acesso total ao hardware. Diferentemente dos núcleos monolíticos tradicionais, os controladores de dispositivos podem ser configurados como módulos (LKM - loadable kernel modules (em inglês)), que são bibliotecas compiladas fora do kernel propriamente dito, o que permite que sejam carregados e descarregados enquanto o sistema corre.

Também podem ser interrompidos (preempted (em inglês)) sob certas condições. Esta característica foi adicionada para lidar com interrupções de hardware corretamente e para melhorar o suporte ao multiprocessamento.

O facto do Linux não ser microkernel foi tema duma famosa discussão entre Linus Torvalds e Andy Tanenbaum no grupo de discussão comp.os.minix na Usenet em 1992. Esse debate foi descrito por DiBona, Ockman e Stone[11].

Processos

Um processo é uma instância de um programa em execução[2]. Todo processo no Linux tem um pai (processo criador) e um número identificador (PID). O pai de todos os processos num ambiente Linux é o init, cujo PID é 1. Este processo é criado pelo processo 0, que é um encadeamento (thread) do próprio núcleo. O processo init irá permanecer em execução até o desligamento do sistema, e sua função é monitorar e criar os processos que implementam as camadas exteriores do sistema operacional.

Os processos são criados pela chamadas de sistema fork() (processos tradicionais ou heavy weight) e clone() (processos leves ou light weight). Para otimizar a criação de processos tradicionais, o Linux usa o recurso de copy-on-write: quando um processo-filho é criado, ele compartilha as mesmas páginas de memória do pai. Quando um dos dois tenta escrever na memória, é gerada uma interrupção para o núcleo, que então copia o conteúdo das páginas de memória para novas molduras de páginas, e estas são atribuídas ao processo que efetuou a escrita.

Para manter um ambiente multitarefa e possibilitar o multiprocessamento, o Linux mantém algumas estruturas importantes, das quais podemos citar duas: (i) o descritor do processo (task_struct), que contém todas as informações relativas ao processo; (ii) uma fila (runqueue) de processos por processador. Quando o sistema possui mais de um processador, o agendador do Linux faz o balanceamento de carga entre as filas.

Agendamento

Para poder fazer um adequado compartilhamento de tempo do processador, o Linux usa duas classificações para avaliar qual a prioridade que um processo deve ter: (i) determina a responsividade do processo (tempo real, interativo, em segundo plano); (ii) verifica se o processo usa muito tempo de processador (CPU-bound) ou faz muitas operações de entrada e saída (I/O-bound).

Essas duas classes são razoavelmente independentes. Um processo pode executar em segundo plano (um daemon, por exemplo) e ser consumidor de recursos de entrada e saída (um servidor de banco de dados) ou usar muito tempo de processador (um compilador). Um processo que executa em tempo real foi assim definido pelo seu programador, mas o agendador do Linux necessita fazer uma análise heurística para saber se um processo é interativo ou está executando em segundo plano.

O Linux utiliza um sistema de prioridades, onde um processo que possui prioridade maior tem precedência sobre um de prioridade menor para obter o processador. A identificação da prioridade de um processo pode ser estática ou dinâmica e varia de 1, a maior prioridade, a 139, a menor. Os números 1 a 99 são atribuídos a processos de tempo real e 100 a 139 são atribuídos a processos tradicionais (interativos e segundo plano).

Um processo em tempo real é classificado em FIFO (first-in, first-out) ou RR (Round-Robin) e somente será retirado do processador nos seguintes casos: (i) fim de execução; (ii) para ser substituído por um processo de maior prioridade; (iii) executar uma operação de bloqueio; (iv) espontaneamente; (v) é RR e esgotou seu quantum de processamento.

Um processo tradicional tem inicialmente atribuída uma prioridade estática (em geral 120) que determina o seu quantum de processamento, mas pode ter uma prioridade dinâmica, que é o valor analisado pelo agendador quando percorrer a lista de processos para determinar qual irá usar o processador. A prioridade dinâmica pode alterar o valor da prioridade estática em 5 pontos, para mais (penalidade) ou para menos (bônus), dependendo do passado do processo. O passado irá beneficiar o processo se o mesmo ficou muito tempo fora do processador (sleep time). Caso este tempo seja pequeno, o processo será penalizado.

Obs.: essa estrutura acima pode ser modificada a partir da release 2.6.23 ou posterior, com a introdução do CFS (completely fair scheduler).

Gerenciamento de memória

O Linux utiliza memória virtual, que possui, pelo menos, 4 funções básicas: (i) assegurar que cada aplicação (processo) tenha seu próprio espaço de endereçamento, começando em zero -- problema de relocação[2][12]; (ii) proteção de memória, para impedir que um processo utilize um endereço de memória que não lhe pertença[12]; (iii) compartilhamento de memória -- processos diferentes podem compartilhar código ou dados[12]; (iv) possibilitar que uma aplicação utilize mais memória do que a fisicamente existente (essa é a função mais óbvia).

Seu código divide-se em duas partes. Uma é dependente da arquitetura, onde são definidos o endereçamento –- virtual e físico, o tamanho de página e o tratamento das tabelas de páginas. Na parte independente ficam o controle de alocação e liberação de memória e o esquema de substituição páginas.

O Linux utiliza tamanhos de páginas de acordo com a arquitetura. Os processadores x86 utilizam páginas de 4 KiB (padrão), 2 MiB (caso seja utilizado o recurso de PAE –- Page Address Extension –- da Intel) ou de 4 MiB. Nas arquiteturas RISC o tamanho padrão é de 8 KiB, mas não é o único.

O endereçamento virtual é dividido em espaço do usuário e espaço do kernel. O primeiro é privativo de cada processo, com início no endereço lógico zero e terminando no endereço determinado pela macro PAGE_OFFSET (v. figura 1). O espaço do kernel é único e começa depois do espaço do usuário. Na arquitetura x86 PAGE_OFFSET determina um valor de 3 GiB para o espaço do usuário e 1 GiB para o espaço do kernel.

(Figura 1: está faltando)

O código do Linux é carregado no início do espaço do kernel, sendo seguido pela área fisicamente mapeável (mem_map, estrutura que indexa as páginas físicas, e as páginas propriamente ditas). Na arquitetura x86, os últimos 128 MiB do espaço do kernel são reservados para alocação de memória não contígua e memória alta, limitando a memória física endereçável pelo Linux, na compilação padrão, a 896 MiB.

Um endereço virtual no Linux (v. figura 2), é dividido em 5 campos: diretório de páginas (PGD), diretório superior de páginas (PUD), diretório intermediário de páginas (PMD), tabela de páginas (PTE) e deslocamento (offset). A arquitetura x86 possui um espaço de endereçamento de 32 bits; quando são utilizadas páginas de 4 KiB (o padrão) o PUD e o PMD não são utilizados; o PGD e o PTE usam 10 bits cada, e o deslocamento usa 12 bits.

(Figura 2: está faltando)

O esquema de substituição de páginas no Linux usa o algoritmo LRU (por aproximação) mantendo duas listas de envelhecimento (aging). A primeira (active_list) contém as páginas atualmente em uso (as páginas mais recentemente referenciadas estarão mais próximas do início da lista) e a segunda (inactive_list) contém as candidatas a paginação (page out).

A paginação para disco pode ocorrer sob demanda, quando algum processo solicitar página e não houver alguma disponível. Neste caso, a página no final da lista inactive_list é liberada. Entretanto, existe um processo chamado kswapd, inicializado pelo núcleo, que verifica, periodicamente, o número de páginas livres. Caso este número seja menor que pages_low, kswapd é acordado para liberar páginas. Se o valor chegar a pages_min, kswapd entra num regime síncrono para agilizar a liberação. Quando o valor de páginas livres atingir pages_high, kswapd vai dormir.

Sistema de arquivos

O gerenciamento de arquivos no Linux baseia-se num esquema de vários níveis, onde a camada principal é o VFS (Virtual File System), que esconde da aplicação as características dos diversos sistemas de arquivo reconhecidos pelo Linux. Quando uma aplicação solicita uma operação sobre algum arquivo, essa solicitação é encaminhada para o VFS, que reenvia a solicitação para um dos SA registrados.

O VFS utiliza uma estrutura chamada superbloco para manter as informações referentes aos diversos sistemas de arquivos montados (tipo, ponto de montagem, dispositivo de bloco utilizado, arquivos abertos). Também utiliza nós-i, semelhantes aos nós-i do EXT2, com as informações sobre os arquivos (permissões, blocos utilizados, dono, etc.).

Os sistemas de arquivos registrados no VFS podem ser classificados em 3 grupos: (i) dispositivos de blocos (EXT2, EXT3, Reiserfs, XFS, VFAT); (ii) associados a rede (NFS, SMB); (iii) dispositivos especiais (procfs, tempfs). Todos esses sistemas podem ser carregados como módulos.

O Ext2 está deixando de ser o padrão, particularmente por sua deficiência quando ocorre uma pane. Neste caso, o sistema operacional deve executar uma varredura completa para verificar o estado do sistema (fsck). Outros sistemas foram criados para sanar essa deficiência, utilizando um recurso chamado journaling, que é a utilização de um registro (log) de alterações (journal). Os sistemas de arquivos desse tipo mais importantes são: Ext3, Reiserfs, XFS e JFS.

Pânico do núcleo (kernel panic)

Um pânico é um erro de sistema não-recuperável detectado pelo núcleo, ao contrário dos erros de impressão e utilização por código do espaço de utilizador. É possível que o código do núcleo indique essa condição ao invocar a função panic localizada no ficheiro-cabeçalho sys/system.h. No entanto, grande parte dos pânicos são o resultado de excepções do processador não-lidadas no código do núcleo, tal como referências a moradas de memória inválidas. São normalmente não indicativo de erros algures na cadeia de chamadas que levam ao pânico.

Portabilidade

Embora Linus Torvalds não tenha tido como objetivo inicial tornar o Linux um sistema portável, ele evoluiu nessa direção. O Linux é hoje, o kernel de sistema operacional com maior portabilidade, correndo em sistemas desde o iPaq, um computador portátil, até o IBM S/390, um denso e altamente custoso mainframe.

De qualquer modo, é importante notar que os esforços de Linus foram também dirigidos a um diferente tipo de portabilidade. Portabilidade, de acordo com Linus, era a habilidade de facilmente compilar aplicações de uma variedade de códigos fonte no seu sistema; portanto o Linux originalmente tornou-se popular em parte devido ao esforço para que os códigos fonte GPL ou outros favoritos de todos corressem em Linux.

O Linux hoje funciona em dezenas de plataformas, desde mainframes até um relógio de pulso, passando por várias arquitecturas: x86 (Intel, AMD), x86-64 (Intel EM64T, AMD64), ARM, PowerPC, Alpha, SPARC etc., com grande penetração também em sistemas embarcados, como handhelds, PVR, vídeo-jogos e centros multimídia, entre outros.

Miscelânea

Mascote

Tux, símbolo do projeto

O mascote do Linux (núcleo e tudo que é relacionado) é um pinguim chamado Tux, criado por Larry Ewing. O motivo pelo qual a mascote é um pinguim é, como Torvalds disse, "O Linus gosta de pinguins. É isso." O nome Tux foi sugerido para representar Torvalds' Unix, e ficou assim.

Termos de licenciamento

Inicialmente, Torvalds lançou o Linux sob uma licença que proibia qualquer exploração comercial, mas mais tarde adoptou a GPL (versão 2 exclusivamente). Esta licença permite a distribuição e até a venda de versões do Linux mas exige que todas essas cópias sejam lançadas sob a mesma licença e que sejam acompanhadas com o código-fonte. Torvalds descreveu o licenciamento do Linux sob a GPL como "a melhor coisa que fez desde sempre." Uma dúvida que é levantada na aplicação da GPL no Linux é a consideração sob a lei de direitos de autor de módulos carregáveis como sendo ou não "trabalho derivado" e, consequentemente, serem submetidos aos termos da GPL. Torvalds declarou que módulos que usam apenas um conjunto público e limitado do interface do núcleo podem, por vezes, ser trabalho não-derivado, assim permitindo alguns drivers distribuídos apenas em formato binário e outros módulos que não respeitem os termos da GPL. Contudo, nem todos os contribuintes do núcleo concordam com esta interpretação e até Torvalds concorda que muitos módulos do núcleo são claramente obras derivadas.

Referências

  1. BACH, Maurice J. The design of the Unix operating system. New Jersey: Prentice Hall. 1990.
  2. a b c TANENBAUM, Andrew. Sistemas operacionais modernos. Rio de Janeiro: LTC. 1999.
  3. SILBERSCHATZ, Avi; GALVIN, Peter B.; GAGNE, Greg. Operating system concepts. 7.ed. Hoboken: Wiley. 2005.
  4. TORVALDS, Linus. Gcc-1.40 and a posix-question. 03 de julho de 1991. Disponível em http://groups.google.com/group/comp.os.minix/msg/a4ea0f118ba82dd0. Acessado em 18 de janeiro de 2009.
  5. TORVALDS, Linus. What would you like to see most in minix?. 25 de agosto de 1991. Disponível em http://groups.google.com/group/comp.os.minix/msg/b813d52cbc5a044b. Acessado em 18 de janeiro de 2009.
  6. TORVALDS, Linus. Free minix-like kernel sources for 386-AT. 05 de outubro de 1991. Disponível em http://groups.google.com/group/comp.os.minix/msg/2194d253268b0a1b. Acessado em 18 de janeiro de 2009.
  7. TORVALDS, Linus. Notes for Linux release 0.01. Disponível em http://www.kernel.org/pub/linux/kernel/Historic/old-versions/RELNOTES-0.01. Acessado em 18 de janeiro de 2009.
  8. TORVALDS, Linus. Release notes for Linux v0.12. Disponível em http://www.kernel.org/pub/linux/kernel/Historic/old-versions/RELNOTES-0.12. Acessado em 18 de janeiro de 2009.
  9. a b BOVET, Daniel P.; CESATI, Marco. Understanding the Linux kernel. 3.ed. Sebastopol: O'Reilly. 2005
  10. GORMAN, Mel. Understanding the Linux virtual memory manager. New Jersey: Prentice Hall. 2004.
  11. DiBONA, Chris; OCKMAN, Sam; STONE, Mark. Open sources: voices from the open source revolution. Sebastopol: O'Reilly. 1999.
  12. a b c STALLINGS, William. Operating systems: internals and design principles. 5.ed. Upper Saddle River: Pearson Prentice Hall. 2005.

Ver também

  • TORVALDS, Linus; DIAMOND, David (2001). Just For Fun: The story of an accidental revolutionary. HarperBusiness. ISBN 0066620724 (hardcover); HarperAudio ISBN 0694525391 (audio tape, abridged ed., read by David Diamond) - on the beginnings of the Linux kernel; No Brasil: Só por Prazer. Campus. ISBN 85-352-0801-1.
Wikilivros
Wikilivros
O Wikilivros tem mais informações sobre Linux (núcleo)
Commons
Commons
O Commons possui imagens e outros ficheiros sobre Linux (núcleo)

Ligações externas