Apesar de que parece que foi ontem que estávamos iniciando nossos primeiros sistemas Linux 2.4, o tempo passou e a equipe de desenvolvimento do kernel está próxima da conclusão do kernel v2.6. Este documento tentará descrever muitas das novas funcionalidades do kernel 2.6 (com um ênfase na versão para i386 do Linux). Diferente de todos os anúncios de pré-releases de softwares closed-source, todas as funcionalidades descritas aqui já estão disponíveis (algumas com menos bugs que outras) no kernel de desenvolvimento 2.5 do Linux (por tradição kerneis com número ímpar na versão são somente para os intrépidos). Dito isto, algumas das funcionalidades aqui descritas podem vir a ser removidas ou marcadas como "experimental" na versão final do 2.6. O desenvolvimento do kernel está atualmente em uma fase de congelamento de funcionalidades, e é provável que a versão final não irá desviar-se muito do que está descrito aqui. É preciso notar também que algumas das "novas" funcionalidades aqui discutidas podem vir a ser portadas para a versão 2.4 do Linux após aparecerem primeiro no Linux 2.6, ou de forma oficial, ou pelo trabalho de alguma distribuição.
Para tornar este documento um pouco mais complicado, a numeração exata da próxima versão do Linux ainda não foi decidida. O número de revisão mais provável é v2.6, mas existem algumas sugestões de que seja escolhido o número v3.0 devido à inclusão do suporte a NUMA e MMU-less nesta versão (mais que na anterior). Por conveniência, este documento irá sempre se referir à próxima versão do kernel como sendo v2.6, e no tempo presente.
O que você está lendo é o primeiro rascunho deste documento, do dia 13/7/2003, e baseado no kernel de desenvolvimento 2.5.75. Novas revisões serão liberadas, conforme o trabalho final no kernel seja completado, mas este documento não será "oficialmente" fechado senão após o lançamento da versão final do Linux. E, como este é o primeiro rascunho, pode conter erros ou omissões. Se você encontrar um ou outro e me avisar, eu ficarei feliz em corrigí-los.
O kernel do Linux foi iniciado em 1991 por Linus Torvalds como um Sistema Operacional Minix-like para seu 386. Linus originalmente quis nomear o novo sistema Freax, mas todos tivemos a sorte dele ter mudado de idéia. A primeira versão oficial do Linux 1.0 foi em março de 1994, que incluiu suporte oficial somente para o i386 e somente para máquinas com um único processador. O Linux 1.2 foi lançado em março de 1995 e foi a primeira versão a incluir suporte oficial para diferentes tipos de sistemas (especificamente, Alpha, Sparc, e MIPS). O Linux 2.0 foi lançado em junho de 1996 e incluiu suporte para um número de novas arquiteturas, mas principalmente foi a primeira revisão a suportar máquinas multi-processadas (SMP). O Linux 2.2 foi lançado em janeiro de 1999 como um melhoramento incremental que tinha uma performance muito melhorada em máquinas multi-processador e novamente suportava uma gama maior de hardware. E, finalmente, o Linux 2.4 foi lançado em janeiro de 2001 como um grande melhoramento de escalabilidade com o SMP, mas também incluindo a a integração de muitas funcionalidades de desktop na linha principal, incluindo USB, suporte a PC Card (aka PCMCIA), plug-and-play interno, etc. O Linux 2.6 não significará apenas um melhoramento nestas funcionalidades, mas também será outro "grande salto" à medida que o Linux trabalha bastante no melhoramento do suporte tanto a sistemas significativamente maiores e significativamente menores (PDAs e outros dispositivos).
Um dos pontos fortes dos Sistemas Operacionais Linux (como o GNU Operating System, o SO e ambiente C distribuído com o Linux e que geralmente não é reconhecido como uma entidade separada) é que ele suporta um amplo leque de hardware e plataformas. Todas as versões desde a 1.2 tem incluído suporte para novos tipos de processadores e funcionalidades. A versão 2.6 do kernel Linux não é exceção a esta tendência, e, enquanto esta pode não impactar diretamente o uso do Linux em sistemas Intel, é muito importante que o Linux esteja tão largamente disponível quando possível.
Uma das principais formas que o Linux 2.6 aumentou seu suporte para múltiplas plataformas foi pela aceitação de muito do projeto uClinux dentro do kernel principal. O projeto uClinux (possivelmente pronunciado "you-see-Linux", mas mais provavelmente pronunciado com o caracter Grego "mu") é o projeto Linux para Micro. Por muitos anos, este desdobramento do Linux tem sido um carro-chefe para o suporte de muitos processadores embarcados, e é excelente tê-lo mais integrado na linha principal do Kernel.
Diferente dos ports normais do Linux, os ports embarcados descritos aqui não tem todos as mesmas funcionalidades do Linux normal devido a limitações de hardware. A diferença principal é que estes ports contemplam processadores que não tem uma MMU (no mundo Intel, as MMUs foram introduzidas com o 386). Apesar destes sistemas serem sistemas Linux multi verdadeiros, eles não tem proteção de memória (de forma que qualquer programa pode causar falhas em qualquer outro programa) e algumas chamadas de sistema que tratam de novos processos estão desabilitadas. E como eles não tem proteção de memória (e também quase toda segurança), isto implica que eles não são úteis para sistemas multi-usuários.
Existem quatro linhas principais de processadores embarcados suportados pelo Linux 2.6. O primeiro destes novos ports é para a nova linha Motorola de processadores m68k embarcados. Estes processadores tem nomes como Dragonball e ColdFire e estão incluídos em sistemas e placas de teste feitas pela Motorola, Lineo, Arcturus, e outros. A maioria dos usuários Linux terão mais familiaridade com estes processadores já que estes estão dentro dos Palm Pilots, começando com o primeiro (o Palm 1000), até o Palm III. Infelizmente, o suporte para processadores m68k mais s antigos sem MMUs (como os 68000s usados pelos primeiros Macintoshes) ainda não está coberto por este software. Outras novas plataformas embarcadas suportadas incluem a séria H8/300 da Hitachi (ainda não inclui o H8S, mas pode vir a ser integrado em breve) e o processador Nec v850.
É difícil sub-enfatizar a principal mudança de arquitetura que está acontecendo com o suporte a sistemas sem MMU no Linux 2.6. Todas as versões anteriores do Linux foram derivadas, mesmo que indiretamente, das limitações inerentes ao trabalho inicial de Linus em um Intel 80386. Extrapolando nesta direção, é possível que outros hardwares mas antigos também possam vir a ser suportados no futuro (de fato, existem projetos trabalhando com este objetivo) e muitas e excitantes portas tem sido abertas. Diferente do trabalho em processadores embarcados modernos e em produção incluídos aqui, o suporte a processadores mais antigos será considerado um objetivo de hobby e provavelmente não muito úteis para usuários finais (e possivelmente não será considerado importante o suficiente para ser incluído nas versões oficiais do Linux no futuro).
Apesar de não ser tecnicamente uma parte da união com o uClinux (por que inclui uma MMU), versões recentes do Linux também incluem suporte aos processadores ETRAX CRIS ("Code Reduced Instruction Set") da Axis Communications (especificamente, o ETRAX 100LX e mais novos são suportados). O suporte para este processador foi incluída durante o ciclo de desenvolvimento do 2.4, mas foi introduzido após o 2.4.0, por isto merece uma menção. É um processador embarcado que é principalmente para uso com equipamentos de rede. O ETRAX100 é um processador relacionado mas sem MMU que é suportado pelo uClinux, mas o suporte para o mesmo na linha principal do kernel Linux não foi integrado.
Outro processador que foi integrado durante o ciclo de desenvolvimento do 2.4.x mas que merece ser mencionado aqui é o novo suporte do Linux para os chips AMD Opteron (baseados na arquitetura AMD64). Este é um novo chip com retro-compatibilidade com processadores clones de Intel existentes e que pode receber apoio até da Microsoft. Se este processador ou algum da família Itanium da Intel virá a se tornar o padrão de facto para produtos 64-bits é algo que ainda veremos.
Enquanto as últimas versões do kernel 2.4 suportam este processador, existem limitações que impedem que o mesmo esteja pronto para produção. A limitação mais crítica para os usuários high-end pode ser a de que as aplicações estão limitadas individualmente a 512 MB de RAM cada. Adicionalmente, o suporte para a execução de binários x86 (32-bit) na plataforma foi melhorado.
Além das várias novas arquiteturas de processador que o Linux 2.6 suporta, a nova versão do Linux também inclui um novo conceito chamado de "subarquiteturas". Anteriormente, o Linux partia da suposição de que os tipos de processadores e de hardware andavam juntos. Ou seja, que processadores descendentes do i386 eram somente utilizados em servidores descendentes do PC/AT. No Linux 2.4 esta hipótese foi abandonada para o i386 com a adição do suporte à Visual Workstation da SGI, uma plataforma "legacy-less" rodando um chip Intel (de fato, a hipótese foi abandonada bem antes em muitas outras arquiteturas - por exemplo, o m68k tem há muito tempo suportado Amigas, Macintoshes, e outras plataformas). A grande mudança no Linux 2.6 é que esta funcionalidade e conceito foi tornada padrão, de forma que todas as arquiteturas tratam este aspecto de forma similar, mais limpa, que permite uma separação mais clara somente dos componentes que precisam ser separados.
Com esta padronização vieram duas novas plataformas para suportar o i386. A primeira é a arquitetura Voyager da NCR. Esta é um sistema SMP (desenvolvido antes da especificação Intel MP que é o padrão atual) que suporta processadores 486-686 em configurações de até 32 processadores. O número real de configurações que foram vendidas com esta arquitetura é relativamente pequeno, e nem todas as máquinas tem suporte atualmente (as mais antigas não são mais suportadas). A segunda arquitetura suportada é a plataforma PC-9800, mais difundida, desenvolvida pela NEC na plataforma (praticamente) dominante no Japão até pouco tempo. As máquinas PC-9800 originais eram vendidas com um processador 8086 e a linha eventualmente evoluiu e amadureceu (em paralelo com os descendentes de AT) até possuir processadores da classe Pentium e suporte a SMP (obviamente, o suporte para Linux está limitado ao 80386 ou melhor). Apesar de ser completamente desconhecido nos EEUU, as versões dos produtos Microsoft até o Windows 95 foram portadas para serem executadas neste hardware. A linha foi oficialmente descontinuada pelo fabricante em favor de PCs mais "padronizados".
Ao formalizar o suporte Linux a estes tipos de hardware levemente diferentes, torna-se mais fácil permitir que o sistema operacional seja portado a outros sistemas, como equipamentos de armazenamento dedicados e outros componentes que usam tipos de processadores dominantes na indústria. Para ser claro, esta subdivisão não deve receber excessiva atenção. Estas sub foram separadas por que certos componentes de baixo nível do sistema (como o roteamento de IRQ) são um pouco ou radicalmente diferentes. Isto é diferente de executar o Linux em um X-Box, por exemplo, onde relativamente pouco mais que alguns drivers de hardware e algumas esquisitisses separam o sistema de um sistema i386 "genérico". O suporte ao X-Box não deverá ser uma sub.
Além do suporte a estes novos tipos de hardware, a nova versão do kernel Linux também inclui funcionalidades que o tornam mais aceitável em servidores maiores (alguns com processadores i386, outros não). Como este suporte é bem novo no Linux, muito trabalho de otimização ainda precisa ser feito. Esta é uma área em que o Linux está crescendo e amadurecendo rapidamente, e podemos esperar que ele venha a ser um forte contendor neste espaço em relativamente pouco tempo.
Uma das grandes mudanças neste respeito é o novo suporte do Linux para servidores NUMA. NUMA (ou "Non-Uniform Memory Access") está um passo adiante do SMP no mundo do multi-processamento e é um passo adiante para a performance em sistemas que possuem muitos processadores. Os sistemas SMP foram projetados com algumas das mesmas limitações de suas contra uniprocessadas. Uma das ramificações mais limitantes desta escolha de projeto é que é baseado em um único conjunto de memórias que é igualmente acessível a todos os processadores. Em um sistema multi-processado, existe uma taxa de contenção extremamente alta entre os múltiplos processadores para o único barramento de memória, levando a gargalos de performance. Os servidores NUMA vão além por introduzir o conceito que, para um processador específico, algumas memórias estão mais perto que outras. Uma maneira fácil (e não muito errada tecnicamente) de imaginar isto é que você tem um sistema com placas de expansão contendo CPUs, memória e possivelmente outros componentes (I/O, etc.). Existem muitas outras placas em um sistemas e mesmo que elas possam todas conversar entre si, é bem claro que as CPUs tem o melhor tempo quando se comunicam com a memória local (a memória na própria placa em vez de em uma placa separada). De várias formas, a nova arquitetura NUMA é um exemplo de um cluster bem unido.
Para suportar apropriadamente estas novas máquinas NUMA, o Linux teve que se adaptar em vários aspectos para tornar o novo modelo eficiente. Para começar, uma topologia de API interna foi criada para permitir que os componentes internos do kernel entendessem os relacionamentos de um processamento ou um conjunto de memórias aos dispositivos de I/O e entre si. Com este suporte, o escalonador de processos do Linux é agora capaz de entender estes relacionamentos e tentará otimizar as tarefas para o melhor uso dos recursos locais. Adicionalmente, muitas máquinas NUMA são construídas deforma que possuem "buracos" no espaço da memória linear "entre" os nós. O novo kernel é capaz de tratar estes casos de descontinuidade de uma forma bem razoável. Existem muitas outras mudanças internas que foram feitas para permitir ao Linux o suporte a estas máquinas de alto desempenho, e esta é definitivamente uma área de crescimento para o kernel como um todo. No decurso do próximo ano, podemos esperar este suporte eficiência e outros melhoramentos no suporte do Linux a estes sistemas de alto desempenho.
Além de suportar mais e novos tipos de hardware, o Linux 2.6 também oferece melhoramentos no suporte para as plataformas existentes conforme elas (e o Linux) evoluem. Estão aí incluídas as otimizações específicas de CPU para o Crusoe da Transmeta, o Pentium4 Xeon da Intel, o Pentium 3-M, o Pentium 4-M, e os processadores para dispositivos móveis AMD. As novas versões do Linux também são capazes de contornar um bug em alguns Athlons. E enquanto muitos usuários não percebem o bug, o Linux 2.6 também resolveu um problema em que alguns sistemas com mais de 16 processadores congelam ou reiniciam.
Apesar de não ser novo no Linux 2.6, o kernel começou incluindo suporte para "hyperthreading" nos processadores Intel P4 com a versão 2.4.17 (esta funcionalidade está incluída aqui porque ela não era parte da versão inicial do Linux 2.4 e também devido a grandes mudanças que ocorreram desde então). O hyperthreading é a capacidade de um único processador aparecer como dois (ou mais) processadores a partir da perspectiva do sistema operacional. A coisa mais incrível sobre isto é que o Linux foi o primeiro SO a trazer esta funcionalidade ao mercado, apesar de que processadores compatíveis terem sido lançados pela Intel quase um ano atrás. Existem boatos de que a Microsoft não está certa se vai cobrar a licença para um processador com hyperthreading como uma ou duas CPUs. O modelo aberto do Linux (e a ausência de licenças) permitiram ao Linux OS ser o primeiro a suportar esta nova funcionalidade. Obviamente, um único processador que finge ser dois ainda é um único processador e a performance não melhora muito.
Outra coisa que é nova no 2.5 é que o escalonador e outros componentes foram otimizados de forma que o hyperthreading em uma CPU pode representar um ganho. Sob o 2.4, isto não acontece sempre e algumas tarefas ficam mais lentas se o hyperthreading está habilitado.
Além do suporte ao NUMA, o Linux 2.6 também tem outras alterações para servidores Intel que estão no topo da cadeia alimentar. Primeiro e principalmente está o suporte completo para o PAE da Intel ("Physical Address Extension") que permite que a maioria dos novos sistemas 32-bit x86 acessem até 64 GiB de RAM, mas em um modo paginado. Além disso, através de um suporte melhorado ao APIC e outras mudanças, o balanceamento de IRQ melhorou significativamente em sistemas multiprocessados.
Em muitos outros aspectos, os limites internos tem sido aumentados quando possível. O número de usuários únicos em um sistema Linux saltou de 65.000 para mais de 4 bilhões (16-bit para 32-bit). Isto torna o Linux mais prático em grandes servidores de arquivo e autenticação, em que era possível atingir o limite anterior. De forma semelhante, o número de PIDs (Process IDs) antes de retornar ao início aumentou de 32.000 para 1 bilhão. Esta alteração, combinada com outras eficiências no subsistema PID, irá ajudar a melhorar a performance inicial de aplicações em sistemas bastante atarefados ou com vida longa. Apesar do número máximo de arquivos abertos não ter sido aumentado, com o kernel 2.6 o Linux não irá exigir que você pré-configure o limite, este número irá auto-escalar. E, finalmente, o Linux2.6 irá incluir um suporte 64-bit melhorado para dispositivos de bloco que suportarem o mesmo, mesmo em plataformas 32-bit como o i386. Isto permite filesystems de até 2TB.
Uma das áreas de foco do Linux 2.6 tem sido tornar o sistema mais responsivo para usuários de desktop e outros usos que necessitam de um alto grau de controle sobre quando os eventos acontecem. Cada um destes objetivos tem desafios bem diferentes, mas existem muitas alterações que podem beneficiar a ambos.
Uma alteração interna principal presente no kernel 2.6 que não pode ser subestimada é que o próprio kernel é agora preemptivo. Em todas as versões anteriores do Linux, quando o SO estava fazendo alguma coisa no kernel, ele não poderia ser interrompido (e em máquinas multi-processadas, isto era verdadeiro em uma base por-CPU). A partir do Linux 2.6, o kernel agora permite que seja interrompido em meio a uma tarefa de forma que as aplicações possam continuar a ser executadas mesmo se o kernel esteja fazendo alguma coisa complicada (para evitar as race conditions óbvias que esta funcionalidade pode causar, o kernel tem certas seções de código bloqueadas, de forma que não possam ser interrompidas enquanto em execução). O benefício primário desta alteração é que a performance interativa (para usuários de desktop, por exemplo) recebeu um melhoramento, e o sistema irá "parecer" mais rápido para coisas como entrada de usuário.
Uma outra mudança que irá ajudar a fazer do Linux um sistema operacional mais responsivo com aplicações que suportam o mesmo é a inclusão do suporte para novas "futextes" (ou "Fast User-Space Mutexes", se isto ajuda). Futexes são uma forma em que múltiplos processos ou threads podem serializar eventos de forma que eles não se atropelem (uma "race condition"). Diferente das operações mutex tradicionais que a maioria das bibliotecas de threading suportam, este é parcialmente baseado no kernel (mas somente no caso de contenção) e também suporta a configuração de prioridades para permitir que aplicações ou threads de prioridade elevada acessem o recurso concorrido primeiro. Ao permitir que um programa especifique que uma tarefa em espera é mais importante que outra, ele permite maior responsividade no que podem ser as áreas mais críticas de tempo de uma aplicação.
Os subsistemas de I/O também tem experimentado grandes alterações para permitir que se torne mais responsivos sob todos os tipos de carga. Estas alterações incluem uma reescrita completa do subsistema de escalonamento de I/O, o código do kernel que determina quais processos vão ler os dispositivos e quando. A camada recém reescrita tem agora uma melhor capacidade de garantir que nenhum processo fique travado aguardando em linha por I/O por muito tempo, ao mesmo tempo que permite as antigas otimizações que certificam-se que as leituras, por exemplo, aconteçam na ordem mais eficiente para o hardware.
Enquanto os programadores de aplicações "real time" (RTOS) irão beneficiar-se destas mudanças, o Linux 2.6 não será um kernel real-time completo. Entretanto, esta e outras mudanças criam as bases para que uma versão completamente RTOS do Linux seja possível, e patches externos tem sido disponibilizados (embora ainda não aprovados e integrados em uma versão oficial do kernel) que podem oferecer este suporte para usuários e programadores que precisam da mesma agora.
O susbsitema de módulos é outra área que avançou bastante com o advento do Linux 2.6. Muito do código foi reescrito com a intenção de melhorar a estabilidade e tornar o sistema mais transparente. Além destas alterações externas óbvias, muitas coisas mudaram internamente, na forma que o kernel vê e usa os módulos.
A primeira e mais óbvia mudança (pelo menos funcionalmente) nos drivers de dispositivos no Linux 2.6 é que a extensão dos arquivos mudou. Em vez de ser ".o" (uma extensão comum para arquivos "objeto", arquivos geralmente criados durante a compilação de qualquer programa, antes que a fase de linking seja feita para criar uma aplicação executável), a nova extensão é ".ko" ("kernel object"). Esta é uma alteração apenas cosmética, e apenas torna mais claro que os módulos não são realmente arquivos intermediários.
Completamente não cosmético é o trabalho extensivo para eliminar as race conditions que tem estado presentes no código por muitas revisões. O xis do problema é que era possível ter um dispositivo usando um módulo enquanto o mesmo estava sendo descarregado, mas após o módulo ter feito as verificações para garantir que ninguém o estava usando. O novo código de módulos do kernel torna esta condição mais difícil de disparar. Para levar esta solução um passo adiante, também é agora possível simplesmente desabilitar a descarga de módulos em geral.
Uma maior transparência é outra funcionalidade no novo subsistema de módulos. Em quase todas as versões anteriores do Linux, os módulos eram espertos o suficiente para detectar dispositivos que podiam suportar fazendo pesquisas nos barramentos (como o PCI, ISA PnP, e PC Card) por IDs de dispositivos que ele reconhecia. No Linux 2.6, muito deste suporte foi padronizado e tornado externo ao kernel, de forma que será fácil para programas externos e carregadores de módulos ver quais dispositivos um módulo em particular irá suportar. Isto irá permitir que os vários programas de gerenciamento de hardware (como o "kudzu" da RedHat) tomar decisões inteligentes sobre hardware, mesmo quando eles não estão familiarizados com os dispositivos em que estão trabalhando. E, no caso de você saber mais que a versão atual do driver, ainda é possível (via uma interface com o novo filesystem "sys", veja abaixo) forçar um driver a tentar trabalhar com um dispositivo específico, mesmo se ele não sabe que é suportado.
Além das muitas alterações descritas acima, existem outras mudanças internas genéricas no Linux que irão melhorar a performance em muitos casos. Estas incluem mais remoções do "Big Kernel Lock" (travas não granulares que eram usadas nos primórdios do suporte do Linux a multi-processadores), otimizações nas leituras e escritas do filesystem, e manipulação de pequenos arquivos, e outras.
Existe mais um problema de estabilidade que foi resolvido com o Linux 2.6: não é mais possível alocar mais que a quantia máxima de RAM (mais swap) que você tem no sistema. Anteriormente, o Linux iria permitir que a chamada a malloc() ("memory allocation") tivesse sucesso em alguns casos, mesmo quando não houvesse mais memória livre. A lógica de sobrecompromisso foi revisada e este caso deverá ser agora impossível (obviamente, se você usar toda a RAM do sistema, mesmo sem exceder o máximo, você tem problemas piores para se preocupar).
O Linux sempre foi um divulgador dos benefícios dos padrões abertos. Uma das grandes alterações internas é que a infraestrutura de threading do Linux foi reescrita para permitir que a Native POSIX Thread Library (NTPL) seja executada sobre ele. Isto representa um grande melhoramento de performance para o processador Pentium Pro e processadores superiores em aplicações que fazem uso extensivo de threading em muito dos grandões na área do "enterprise" tem pedido por isto (a RedHat fez um backport deste suporte para o Linux 2.4 e inclui o mesmo no RedHat 9.0). Isto inclui novos conceitos ao espaço de thread do Linux incluindo grupos de thread, memória local para threads individuais, sinais no estilo POSIX, e outras mudanças. Um dos maiores problemas é que aplicações (como o Java da Sun) que não foram escritas segundo padrões e que esperam o comportamento de antigos Linuxismos irão falhar se o novo suporte estiver habilitado. Como os benefícios superam o custo (e com tantos jogadores grandões no jogo), é claro que as aplicações mais importantes irão suportar as alterações não muito tempo depois que o novo kernel seja lançado.
E, finalmente, apesar de não haver um benefício direto para a maioria das aplicações do Linux, o kernel 2.6 agora inclui a capacidade de desabilitar completamente o suporte a swap durante a compilação. Isto irá permitir que o Linux seja executado com um consumo de memória um pouco menor e pode ser útil para dispositivos embarcados, em que é pouco provável que um dispositivo de swap venha a ser usado.
Geralmente visto como um componente separado de um sistema operacional, um modelo de dispositivo é essencial para um SO que seja projetado para executar em uma grande variedade de hardware. Em resumo, o modelo de dispositivos é a infraestrutura dentro do kernel que detecta e determina o uso de recursos de todos os componentes opcionais do sistema. Todos os sistemas operacionais (e algumas versões do Linux) possuem intrinsecamente algum conceito de dispositivo. Versões mais antigas do Linux (2.2 e anteriores), possuem apenas uma abordagem crua ao gerenciamento de dispositivos. Existem drivers para diferentes tipos de barramentos de hardware e os vários barramentos possuem várias e incompatíveis APIs para o tratamento de várias operações. O Linux 2.4 foi o primeiro estágio para um modelo de dispositivos "unificado" ao reunir PCI, PC Card e ISA Plug-and-Play em uma única estrutura de dispositivos com uma interface comum. O Linux 2.6 expandiu enormemente estes esforços para produzir uma visão completamente nova de como o kernel Linux vê o hardware em que está sendo executado e que é universal no sistema.
O núcleo central da nova infraestrutura de modelo de dispositivos é uma nova interface orientada a objetos que todos os tipos de dispositivos de baixo nível precisam usar. Esta estrutura de objetos dispositivos do kernel (chamada "kobject") inclui todas as interfaces para contagem de referência e para tratamento de sub-dispositivos. Os dispositivos de nível mais baixo (como barramentos de sistema) agora usam esta camada comum para apresentar uma visão unificada do sistema tanto no kernel como no user-space. Agora que tudo isto foi centralizado, é possível para o Linux fazer muitas coisas úteis com estas informações.
Com estas novas informações todas no kernel, é possível ao Linux oferecer um suporte melhorado para sistemas em que um conhecimento profundo do hardware é necessário. Um exemplo óbvio de onde esta informação é útil ocorre no gerenciamento de energia. O novo padrão de gerenciamento de energia nos últimos anos é o ACPI. O suporte a ACPI, "Advanced Configuration and Power Interface", foi introduzido inicialmente no Linux 2.4. Diferente do APM, os sistemas com esta nova interface devem informar individualmente todos os dispositivos compatíveis no sistema que eles precisam mudar seu estado de energia. O novo sistema do kernel é exatamente o que o doutor prescreveu para permitir que o sistema controle os dispositivos que precisam ser desligados ou que precisam de outras alterações. Um segundo exemplo onde esta informação é útil é com barramentos que suportem "hot plug". A capacidade de um dispositivo de ser acrescentado a um sistema depois da inicialização agora parece bastante comum e direta, mas o suporte real do Linux a estes dispositivos não apareceu até o Linux 2.2. Desde o Linux 2.4, este suporte foi melhorado e foi acrescentado suporte para fot-plugging de dispositivos PCI, PC Card, USB, e Firewire. A nova revisão do sistema centralizado de dispositivos do kernel expande este suporte ao remover as diferenças entre dispositivos hot-plug e dispositivos legados. Quando você inicia o seu computador, a rotina de detecção de dispositivos sistematicamente "pluga" todos os dispositivos em seu sistema. Como um objeto de kernel é criado para todos os objetos no sistema quando eles são descobertos, e como isto é essencialmente igual se o dispositivo é descoberto durante a inicialização ou mais tarde, muito da infraestrutura que trata dos dispositivos plugáveis foi simplificada.
Possivelmente, a mais óbvia ramificação visível ao usuário deste novo modelo de gerenciador é a criação de um novo filesystem de sistema (unindo-se ao 'proc' dos processos, 'devfs' para dispositivos, e 'devpts' para os pseudo-terminais UNIX98), chamado 'sysfs'. Este filesystem (que se pretende seja montado em '/sys') é uma representação visível da árvore de dispositivos, como o kernel vê a mesma. O kernel obtém toda a informação através do acoplamento com o subsistema de objetos de kernel: quando um objeto de kernel é criado, também é criado um arquivo ou diretório apropriado (é possível para um kobject explicitamente não ter um registro no sysfs, se houver uma razão para tal).
Uma vez que cada dispositivo (ou cada kobject) no sistema recebe uma única estrutura de diretório, o próximo passo lógico foi exportar os vários atributos conhecidos (nome do dispositivo, modo de energia, irq, e este tipo de coisas) do dispositivo para a árvore de forma que eles pudessem ser lidos e escritos por um administrador de sistema. Isto trouxe um efeito colateral benéfico (apesar de inicialmente confuso) de que muitos usos de /proc/sys específicos para dispositivos puderam ser movidos para /sys, ou o serão em uma data futura.
À medida que o Linux avançou pelos anos e em direção à popularidade, cada iteração do kernel pareceu um salto e estava melhor amarrada que as versões anteriores em termos dos tipos de dispositivos suportados tanto em termos de suporte a tecnologia emergentes (USB no 2.4) e de suporte a velhas tecnologias "legadas" (MCA no 2.2). Entretanto, quando chegamos no kernel 2.6, o número de dispositivos que o Linux não suporta é relativamente pequeno. Existem poucos, se os houver, ramos do universo de hardware PC ainda a conquistar. É por esta razão que a maior parte (mas certamente não a totalidade) do melhoramento no suporte a hardware PC (incluindo o modelo de dispositivos, descrito acima) está relacionado ao fortalecimento do suporte que já está presente.
Quase tão importante quanto o processador, os barramentos em um sistema são a cola que mantém as partes unidas. O mundo do PC tem sido abençoado com abundância das tecnologias de barramento, desde a velha ISA (encontrada no IBM PC original) aos barramentos seriais externos e wireless modernos. O Linux tem sido sempre rápido em se adaptar a novos barramentos e tipos de dispositivos conforme eles tem se tornado populares com os dispositivos comercializados, e significantemente menos rápido a se adaptar a tecnologias que são de relativamente pouco uso.
Um exemplo em que o Linux veio a suportar um tipo de barramento tardiamente foi quando finalmente foi incluído suporte à extensão ISA Plug-and-Play (PnP) no Linux 2.4, muito depois que os SOs comerciais populares incluíram suporte ao mesmo (era possível fazer com que o mesmo funcionasse utilizando alguns utilitários meia-boca de user-space antes do 2.4). O Linux 2.6 inclui uma atualização enorme neste subsistema, tornando-o praticamente completo no que toca a funcionalidades e melhor integrado com o resto do novo modelo de dispositivos. As novas funcionalidades incluem suporte completo a PnP BIOS, um banco de dados de nomes de dispositivos, e outras alterações que tornam o suporte mais robusto. A soma de todas estas modificações resulta que agora o Linux é um "verdadeiro" SO Plug-and-Play e pode ser configurado como tal em qualquer BIOS de máquinas compatíveis.
As alternativas (relativamente impopulares) ao PnP na era do ISA eram o MCA (ou Microchannel Architecture) e EISA (ou Extended Industry Standard Architecture). Os dois subsistemas receberam algumas atualizações durante o ciclo de desenvolvimento do 2.6 para suportar o novo modelo de dispositivo. Além disto, o EISA recebeu alguma padronização com os outros subsistemas através da inclusão de um banco de dados de dispositivos.
Além destes pontos importantes, houveram várias outras mudanças no suporte do Linux a barramentos de hardware. O barramento PCI do Linux, o mais prevalente e importante de todos os barramentos, recebeu um ênfase durante o desenvolvimento do Linux 2.6, incluindo um suporte melhorado a hot-plug e gerenciamento de energia. De forma semelhante, a nova versão também inclui suporte para sistemas com múltiplas AGPs ("accellerated graphics ports" -- um barramento de alta velocidade separado que também usa o protocolo PCI), como as workstations gráficas de alto desempenho. Em termos de suporte a estes aspectos internos do PC, o Linux está acompanhando as tendências de hardware do mercado.
Em acréscimo a todos os barramentos de dispositivos "reais", o Linux 2.6 acrescentou (pelo menos internamente) o conceito de barramento "legado". Este é um tipo de barramento que é específico a cada arquitetura que contém todos os dispositivos que se espera encontrar. Em um PC, por exemplo, este pode incluir portas on-board seriais, paralelas e PS/2 -- dispositivos que existem mas que não são enumerados por nenhum barramento real no sistema. Em algumas plataformas, este suporte legado pode envolver coisas mais complicadas (tais como consultar o firmware), mas em geral é apenas uma camada que permite que estes dispositivos sejam tratados de uma forma padronizada dentro do novo paradigma.
Enquanto estes padrões antigos de dispositivos amadureceram mas tiveram poucas funcionalidades novas acrescentadas, este não é o caso com o USB. O Universal Serial Bus viu numerosos melhoramentos durante o ciclo de desenvolvimento mais recente. A mudança mais notável é que o novo kernel irá suportar dispositivos USB 2.0. O USB2 é o novo padrão que suporta uma largura de banda de dispositivo de até 480 megabits por segundo (compare com os 12 mbit/seg do USB atual). Os dispositivos que suportam este padrão geralmente são chamados de dispositivos USB de "alta velocidade" e estão gradualmente tomando conta do mercado. Um padrão novo e relacionado, o USB On-the-Go (ou USB OTG), uma variante ponto-a-ponto no protocolo USB para conectar dispositivos diretamente (por exemplo, para conectar uma câmera digital a uma impressora sem ter um PC no meio) atualmente não é suportado no Linux 2.6 (alguns patches para esta funcionalidade estão disponíveis, mas ainda não fazem parte da versão oficial). Além do suporte a dispositivos, muito da forma que os dispositivos USB são enumerados internamente foi revisado, de forma que agora é possível ter muitos mais dispositivos do mesmo tipo, todos acessíveis no Linux. Este aspecto irá beneficiar primeiro grandes servidores de impressão e armazenamento (apesar de que os últimos provavelmente irão usar um barramento de armazenagem dedicado). Esta é definitivamente uma área em que a tecnologia cresceu significantemente os últimos anos, e o Linux está trabalhando para se manter no ritmo do mercado.
A tecnologia wireless tornou-se realmente popular nos últimos anos. Às vezes parece que cabos (exceto os de energia) serão uma coisa do passado em alguns anos. Os dispositivos wireless englobam tanto os dispositivos de rede (o tipo mais comum atualmente), e também dispositivos mais genéricos, como PDAs, etc.
Em se tratando de dispositivos de rede wireless, os dispositivos podem ser geralmente divididos em dispositivo de longo alcance (por exemplo, o AX.25 sobre dispositivos de rádio amador) e curto alcance (normalmente 802.11, mas existem alguns protocolos mais antigos). O suporte a ambos os tipos tem sido uma marca do Linux desde as primeiras versões (v1.2) e os dois receberam atualizações durante o desenvolvimento do 2.6. A maior mudança aqui é que os principais componentes da pequena gama de subsistemas para as várias placas e protocolos suportados foram reunidos em um único subsistema e API "wireless". Esta união resolveu um certo número de pequenas incompatibilidades na forma que diferentes dispositivos tem sido tratados e fortaleceu o suporte do Linux para os mesmos ao criar um conjunto central de ferramentas para o userspace que irão funcionar com todos os dispositivos suportados. Além da padronização, o Linux 2.6 introduz um certo número de melhoramentos, incluindo uma capacidade melhorada de notificar eventos como uma mudança de estado (como quando um dispositivo que tenha um estado "roaming") e alterações ao TCP para tratar melhor os pulsos de atraso periódicos que ocorrem em dispositivos wireless. Devido a pressão de melhorar o suporte a dispositivos wireless no Linux 2.4, muitas destas alterações já estão presentes no kernel disponível.
No espaço de dispositivos wireless, houveram também alguns avanços similares. O IrDA (o protocolo para infravermelho que recebeu o nome do grupo Infrared Data Associates) recebeu alguns avanços desde a última versão principal, como gerenciamento de energia, e integração no novo modelo de drivers do kernel. Os avanços reais foram feitos no suporte do Linux a dispositivos Bluetooth. O Bluetooth é um novo protocolo wireless que foi projetado para ter um alcance curto e baixo consumo de energia, mas não tem as mesmas limitações de linha de visada que o IrDA tem. O Bluetooth, como um protocolo, foi projetado para ir "em qualquer lugar" e tem sido implementado em dispositivos como PDAs, celulares, impressoras, e coisas mais bizarras como equipamentos automotivos. O protocolo em si tem dois tipos diferentes de links de dados: SCO, ou "Synchronous Connection Oriented", para aplicações atenuadas de áudio, e L2CAP, ou "Logical Link Control and Adaptation Protocol", para uma conexão mais robusta, que suporta retransmissão, etc. O protocolo L2CAP também suporta vários sub-protocolos (incluindo o RFCOMM para redes ponto-a-ponto e BNEP para redes tipo Ethernet). O suporte Linux para as coisas que o Bluetooth pode fazer continua crescendo e podemos esperar que amadureça significativamente à medida que mais dispositivos chegam às mãos dos consumidores. Também deve ser mencionado que o suporte inicial para o Bluetooth foi integrado nas últimas edições do kernel 2.4.
Barramentos dedicados de armazenagem, como o IDE/ATA e o SCSI, também receberam uma atualização durante o ciclo do 2.6. As principais alterações estão centradas no sub-sistema IDE, que foi reescrito (e novamente reescrito) durante o desenvolvimento do novo kernel, resolvendo muitos problemas de escalabilidade e outras limitações. por exemplos, drives CD/RW IDE agora podem ser escritos diretamente no driver de disco IDE real, uma implementação muito mais limpa que a anterior (anteriormente era também necessário usar um driver especial de emulação SCSI o que era confuso e geralmente difícil). A camada IDE agora é capaz de consultar a BIOS da máquina quando encontra um controlador que não é reconhecido de forma que pode usar valores razoáveis para temporizações e outros dados necessários. No lado dos SCSI, houveram também pequenos melhoramentos espalhados pelo sistema tanto tratando de um maior suporte quanto escalabilidade. Um melhoramento específico para sistemas antigos é que agora o Linux suporta dispositivos multivias SCSI-2 que possuem mais que 2 LUNs em um dispositivo (o SCSI-2 era a versão anterior do padrão de dispositivos SCSI, de 1994). Outra mudança importante é que o Linux agora pode retornar ao teste de mídia como o Microsoft Windows faz, para ser mais compatível com dispositivos que não seguem completamente a especificação. Conforme estas tecnologias se estabilizaram no tempo, também o suporte do Linux às mesmas também estabilizou-se.
Apesar de não ser propriamente um barramento de armazenagem, o Linux agora inclui suporte para acessar a nova BIOS EDD (Enhanced Disk Device) diretamente para ver como o servidor vê seus próprios dispositivos de disco. A EDD BIOS inclui informações sobre todos os barramentos de armazenagem que estão conectados ao sistema que a BIOS conhece (incluindo tanto IDE quanto SCSI). Além de obter informações de configuração e outras informações dos dispositivos conectados, há outras vantagens nisto. Por exemplo, esta nova interface permite que o Linux saiba de qual dispositivo o sistema foi inicializado, o que é útil em novos sistemas em que isto nem sempre é óbvio. Isto permite que programas de instalação inteligentes considerem estas informações quando estão determinando onde colocar o GRUB (o carregador de boot do Linux), por exemplo.
Além de todas estas alterações, deve ser enfatizado novamente que todos os tipos de barramentos de dispositivos (hardware, wireless, e armazenamento) foram integrados no novo subsistema de modelo de dispositivos do Linux. Em alguns casos, estas mudança são cosméticas. Em outros casos, existem mais alterações significantes envolvidas (em alguns casos, por exemplo, mesmo a lógica de como os dispositivos são detectados teve de ser alterada).
O uso mais óbvio para um dispositivo de blocos no Linux (ou outro sistema) é para montar um filesystem no mesmo, e o suporte do Linux para filesystems avançou bastante desde a versão 2.4 em vários aspectos. Uma mudança chave é o suporte para atributos estendidos e controles de acesso no estilo POSIX.
O segundo (e terceiro) filesystem estendido, o sistema que a maioria das instalações de Linux usam como padrão, tem sido a que mais melhorou durante o desenvolvimento do Linux 2.6. A principal alteração é o suporte a "atributos estendidos", ou metadados que podem ser inseridos no próprio filesystem para um arquivo específico. Alguns destes atributos estendidos serão usados pelo sistema e só poderão ser lidos e escritos pelo superusuário. Muitos outros sistemas operacionais, como o Windows e o MacOS, fazem uso extensivo deste tipo de atributos. Infelizmente, a herança UNIX de sistemas operacionais geralmente não inclui um excelente suporte a estes atributos e muitas ferramentas de usuário (como o 'tar', etc) deverão ser atualizadas para poderem salvar e restaurar esta informação adicional. Esta é outra área de crescimento do Linux, e o suporte a atributos estendidos está amadurecendo.
O primeiro uso do novo subsistema de atributos estendidos é a implementação de listas de controle de acesso POSIX. O controle de acesso POSIX é um superconjunto das permissões padrão do UNIX, que permitem um controle mais granular. Quando necessário (por exemplo, ao exportar arquivos via NFS), estes controles podem ser mapeados (cuidadosamente) para as permissões de usuário/grupo padrão.
Além destas alterações ao ext3, existem várias outras pequenas alterações. O tempo de execução do journal do filesystem pode ser configurado para ficar mais apropriado para os usuários de laptop (que podem precisar aumentar a rotação do disco se ele estiver em um modo de economia de energia), opções padrão de montagem podem agora ser armazenadas no próprio filesystem (e, portanto, não precisam ser informados na montagem), e pode-se agora marcar um diretório como "indexado" para aumentar a velocidade de pesquisa de arquivos neste diretório.
O Linux também apresenta vários melhoramentos na camada de filesystem para melhorar a compatibilidade com o sistema operacional de PC dominante. Para começar, o Linux 2.6 agora suporta o Logical Disk Manager do Windows (aka "Dynamic Disks"). é um novo esquema de tabela de partição que o Windows XP e os posteriores adotaram que permitem o fácil redimensionamento e a criação de múltiplas partições (obviamente, é improvável que os sistemas Linux venham a usar o novo esquema para novas instalações tão cedo). O Linux 2.6 também possui um suporte melhorado (e reescrito) ao filesystem NTFS (que agora é também usado em produtos comerciais) e agora é possível montar um volume NTFS para leitura/escrita. O suporte à escrita ainda é experimental e está sendo gradualmente melhorado, e pode ou não estar habilitado na versão final do kernel. E, finalmente, o suporte Linux para FAT12 (o filesystem DOS utilizado em sistemas realmente antigos e disquetes) foi melhorado para contornar alguns bugs presentes em alguns MP3 players que usam aquele formato. Manter-se atualizado com as outras tecnologias PC é uma das áreas principais de foco das novas revisões do kernel Linux.
A compatibilidade com outros sistemas operacionais também foi melhorada. O suporte a atributos estendidos no filesystem HPFS (usado pelo OS/2 e outros) foi atualizado. Os atributos no estilo OS/2 foram separados em um espaço de nomes diferente. O filesystem XFS também foi atualizado para ser compatível em disco com o sistema operacional IRIX.
Além destas alterações, há um grande número de alterações espalhadas pelo suporte a filesystems do Linux. O suporte a quotas foi reescrito para permitir que um número maior de usuários seja suportado em um sistema. Diretórios individuais podem agora ser marcados como síncronos, de forma que todas as alterações (arquivos adicionais, etc.) sejam atômicas (esta característica é mais útil para sistemas de correio e bancos de dados baseados em diretório, além de apresentar uma recuperação melhor caso ocorra uma falha de disco). Compressão transparente (uma extensão única ao Linux) foi acrescentada ao filesystem ISO9660 (o filesystem utilizado em CD-ROMs). e, finalmente, um novo filesystem baseado em memória ("hugetlbfs") foi criado exclusivamente para oferecer um suporte melhorado a bancos de dados de memória compartilhada.
Um dos lados mais "externos" de qualquer sistema computacional são os dispositivos de entrada e saída, as partes importantes que nunca parecem importantes. Estas incluem as coisas mais óbvias como mouse e teclados, placas de vídeo e som, e menos óbvias como joysticks e dispositivos de acessibilidade. Muitos dos subsistemas de usuário final do Linux foram expandidos durante o ciclo de desenvolvimento do 2.6, mas a maioria dos dispositivos comuns já estava bem amadurecida. Em sua maioria, os melhoramentos do Linux 2.6 a estes dispositivos derivam diretamente do suporte melhorado do kernel a barramentos externos, como teclados wireless Bluetooth, e similares. Existem, entretanto, um número de áreas em que o Linux fez grandes melhoramentos.
Uma mudança interna notável no Linux 2.6 é que a camada de interface humana foi revista. A camada de interface humana é o centro da experiência do usuário de um sistema Linux, incluindo a saída de vídeo, mouse e teclados. Na nova versão do kernel, esta camada foi reescrita e modularizada em uma extensão nunca feita antes. É possível agora criar um sistema Linux completamente "headless" sem a inclusão de nenhum suporte para display ou outra coisa. Os primeiros benefícios desta modularidade podem ser para os desenvolvedores de dispositivos embarcados que podem fazer dispositivos que só possam ser administrados pela rede ou pela porta serial, mas o benefício aos usuários finais é que foi feita uma modularização de todas as suposições internas sobre dispositivos e arquiteturas foram modularizadas. Por exemplo, anteriormente era assumido que se você tivesse um PC, você precisaria do suporte a um controlador padrão AT (i8042) de teclado. A nova versão do Linux remove esta exigência de forma que o código desnecessário pode ser mantido fora de sistemas sem componentes legados.
O suporte ao tratamento da saída de monitor do Linux também recebeu várias alterações, apesar que a maioria destas são úteis somente em configurações que usam o susbsitema interno de framebuffer console do kernel (a maioria dos computadores Intel Linux não são configurados desta forma, mas este não é o caso para muitas outras arquiteturas). Na minha humilde opinião, a melhor funcionalidade é que o logo de boot (um pinguinzinho bonitinho, caso você nunca tenha visto-o) agora suporta resoluções de até 24bpp. Fora isto, outras novas funcionalidades para o console incluem redimensionamento e rotação (para PDAs e similares) e expandiu o suporte a aceleração para mais hardwares. E, finalmente, o Linux agora incluiu suporte no kernel à consulta a monitores VESA para obter informações de capacidades, apesar que o XFree86 e a maior parte dos sistemas de instalação de distribuições já cobriu este detalhe em user-space.
Além das alterações mais extensas, o Linux 2.6 também inclui um certo número de pequenas alterações para a interação humana. Touch screens, por exemplo, agora já são suportadas. Os drivers de keyboard e mouse foram atualizados e padronizados para somente exportar um único nó de dispositivo (/dev/input/mouse0, por exemplo), sem preocupar-se com o hardware ou protocolo subjacentes. Mouses bizarros (com múltiplas rodas, por exemplo) agora também são suportados. Mapeamentos de teclas também foram atualizados para seguir o "padrão" Windows de teclas estendidas. O suporte a joystick também foi melhorado não só graças à adição de novos drivers (incluindo o XBox gamepad), mas também por incluir novas funcionalidades, como o force-feedback. E, finalmente (mas não menos importante), a nova versão também inclui suporte para o dispositivo braille TTY Tieman Voyager, que permite que usuários deficientes visuais tenham um melhor acesso ao Linux (esta funcionalidade é importante o suficiente para que tenha sido back-ported para o Linux 2.4).
Como uma nota lateral, cabe comentar que o Linux também mudou a interface de "system request", para suportar melhor os sistemas sem teclado. A interface system request ("sysrq") é o método para os administradores de sistema obterem informação de depuração, forçar um reboot do sistema, remontar filesystems read-only, e fazer outras coisas do tipo no console local. Como o Linux 2.6 agora suporta um sistema completamente headless, agora também é possível disparar estes eventos usando o filesystem /proc (obviamente, se o seu sistema congelar e você precisar forçar que ele faça alguma coisa, isto pode não ser de muita ajuda).
Uma das novas funcionalidades mais antecipadas para os usuários desktop do Linux 2.6 é a inclusão do ALSA (a "Advanced Linux Sound Architecture") em lugar do velho sistema de som. O velho sistema, conhecido como OSS, de "Open Sound System", serviu o Linux desde os primeiros dias, mas possuía muitas limitações na sua arquitetura. O primeiro grande melhoramento com o novo sistema é que ele foi projetado desde o início para ser protegido de threads e sistemas SMP, corrigindo problemas com muitos dos velhos drivers onde eles não podiam funcionar fora do paradigma "desktop-significa-uma-única-cpu" esperado. Mais importante, os drivers foram projetados para serem modulares desde o início (usuários de versões antigas do Linux irão lembrar que a modularidade foi adaptada no sistema de som pelo Linux 2.2), e que isto permite um suporte melhorado para sistemas com múltiplas placas de som, incluindo múltiplos tipos de placas de som. Não importa o quão bonitos estes aspectos internos são, o novo sistema não seria um melhoramento para os usuários se ele não tivesse novas funcionalidades, e o novo sistema de som há muitas destas. Uma das mais importantes é o suporte para hardwares mais novos (incluindo dispositivos USB de áudio e MIDI), playback e gravação full-duplex, mixing não entrelaçado e de hardware, suporte para a "combinação" de dispositivos de som, e outras coisas. Seja você um audiófilo, ou só alguém que gosta de tocar MP3s, o suporte melhorado a sons no Linux é um avanço bem-vindo.
Muito além de simples áudio, hoje em dia, o que os usuários querem é suporte para o hardware realmente legal, como webcams, adaptadores de rádio e TV, e gravadores de vídeo digital. Em todos os três casos, o suporte do Linux foi melhorado com a versão 2.6.
Apesar de o Linux já ter suporte (em maior ou menor medida) placas de rádio (quase sempre em userspace) por muitas iterações, o suporte a sintonizadores de televisão e câmeras de vídeo somente foi acrescentado na última revisão, ou na anterior. Aquele subsistema, conhecido como Video4Linux (V4L), recebeu uma extensa atualização durante o trabalho na nova edição do kernel, incluindo tanto uma limpeza na API quanto o suporte a mais funcionalidades das placas. A nova API não é compatível com a anterior e muitas aplicações que suportam a mesma precisarão atualizar-se com o kernel.
E, seguindo um caminho completamente novo, o Linux 2.6 inclui o primeiro suporte interno para equipamentos de Digital Video Broadcasting (DVB). Este tipo de equipamento, comum em computadores set-top, pode ser usado para tornar o servidor Linux em um dispositivo como o Tivo, com o software apropriado.
Os melhoramentos do Linux não estão apenas focados em suporte de hardware e infraestrutura. Sem o software de suporte (como filesystems e protocolos de rede), o hardware suportado é só um peso morto.
Infraestrutura de rede moderna sempre foi um dos principais valores do Linux. O Linux, como SO, já tem suporte a maioria dos protocolos de rede dominantes no mundo, incluindo o TCP/IP (v4 e v6), AppleTalk, IPX, e outros (de fato, os únicos comuns que vêm à memória são os protocolos NetBIOS/NetBEUI da Microsoft).
Como a maioria das alterações nos outros subsistemas, grande parte das alterações a suporte de equipamento de rede no Linux 2.6 está escondida na capa e não é óbvia. Entre estas estão incluídas as alterações de baixo nível que aproveitam-se do modelo de dispositivo e atualizações a muitos dos drivers de dispositivos. Por exemplo, o Linux inclui agora um subsistema MII (Media Independent Interface, ou IEE 802.3u) separado que é usado em por vários drivers de dispositivos de rede. Este novo subsistema substitui muitas cópias em que cada driver estava tratando o suporte MII do dispositivo de diferentes formas e com código e esforço duplicados. Outras alterações incluem atualizações substanciais no ISDN e em outras coisas.
Do lado do software, uma das maiores alterações é o novo suporte do Linux para os protocolos IPsec. O IPsec, ou IP Security, é uma coleção de protocolos para o IPv4 (o IP "normal") e o IPv6 que permitem o uso de segurança criptográfica no nível de protocolo de rede. E como a segurança está no nível de protocolo, as aplicações não precisam tomar conhecimento do mesmo. Isto é similar ao SSL e outros protocolos de túnel/segurança, mas a um nível muito mais baixo. A criptografia suportada atualmente pelo kernel inclui vários sabores do SHA ("secure hash algorithm"), DES ("data encryption standard"), e outros.
Fora do aspecto de protocolo, o Linux melhorou o seu suporte a redes multicast. Redes multicast são redes em que um pacote é enviado para ser recebido por vários computadores (compare com as redes ponto-a-ponto tradicionais, onde você está conversando com apenas um outro computador por vez). Em princípio, esta funcionalidade é utilizada por sistemas de mensagens (como o Tibco), e softwares de conferência com áudio/vídeo). O suporte do Linux 2.6 melhorou ao incluir vários protocolos SSM (Source Specific Multicast) novos, incluindo o MLDv2 (Multicast Listener Discovery) e o IGMPv3 (Internet Group Messaging Protocol). Estes são protocolos padrão que são suportados pela maioria do fabricantes de equipamento de rede de primeira linha, como o Cisco.
O Linux 2.6 também tem uma pilha LLC separada. O LLC, ou protocolo Logical Link Control (IEEE 802.2), é um protocolo de baixo nível que é usado abaixo de vários protocolos de rede de nível mais elevado como o NetBEUI da Microsoft, o IPX, e o AppleTalk. Como parte desta mudança, os drivers do IPX, AppleTalk, e Token Ring, foram reescrito para aproveitar-se do novo subsistema comum. Além disto, uma fonte externa colocou uma pilha NetBEUI funcional e ainda veremos se ela será integrada no kernel oficial.
Além destas alterações, existem várias outras alterações menores. O IPv6 recebeu muitas alterações e agora pode rodar em redes Token Ring. O suporte do Linux a NAT/mascaramento foi estendido para suportar melhor protocolos que requerem múltiplas conexões (H.323, PPTP, etc.). No front do Linux router, o suporte à configuração de VLANs no Linux não está mais marcado como "experimental".
Sobre o robusto suporte a protocolos de rede do Linux está o também robusto suporte para filesystems de rede. A montagem (e algumas vezes a exportação) de um filesystem de rede é uma das poucas operações de alto nível de rede que o kernel toma conta diretamente (a outra operação óbvia, o "network block device", não recebeu muitas alterações para o 2.6 e é geralmente utilizado para aplicações especializadas, em que se acaba fazendo algo parecido com um filesystem com ela, de qualquer forma). Todas as outras operações de redes foram relegadas ao user-space e fora do domínio dos programadores do kernel.
No mundo Linux e dos clones UNIX, o tipo mais comum de filesystem de rede é o Network File System, ou NFS. O NFS é um protocolo de compartilhamento de arquivos complicado que tem raízes profundas no UNIX (e especialmente na excelente implementação do Sun Solaris). O protocolo primário de transporte pode utilizar TCP ou UDP, mas vários sub-protocolos adicionais são necessário, cada um com um protocolo RPC ("remote procedure call") separado. Estes incluem protocolos separados de "mount" para autenticação e NLM ("network lock manager") para bloqueios de arquivos (a implementação comum também está associada a outros protocolos comuns baseados em RPC, incluindo o NIS -- "network information service" -- para a autenticação. O NIS não é utilizado comumente em máquinas Linux devido a problemas fundamentais de segurança). Talvez por conta desta complexidade que o NFS não recebeu uma aceitação maior como protocolo "Internet".
No Linux 2.6, este filesystem básico Linux recebeu muitas atualizações e melhoramentos. O maior dos melhoramentos é que agora o Linux suporta experimentalmente a nova versão do protocolo NFSv4, ainda não muito popular, tanto em sua implementação servidor quanto cliente (versões anteriores do Linux incluíam suporte para as versões v2 e v3 do protocolo). A nova versão suporta autenticação mais segura (com criptografia), um bloqueio de arquivos mais inteligente, suporte para pseudo-filesystems, e outras mudanças. Nem todas as novas funcionalidades do NFSv4 foram implementadas no Linux, mas o suporte está relativamente estável e pode ser utilizada para algumas aplicações de produção. Além disto, a implementação do servidor NFS Linux foi melhorada para ser mais escalável (até 64 vezes mais usuários concorrentes e filas de solicitação maiores), para ser mais completa (suportando o serviço por TCP, além de UDP), mais robusta (drivers de filesystems individuais podem adaptar a forma que os arquivos estão sendo exportados para atender suas particularidades), e de manutenção mais fácil (o gerenciamento é feito via um novo filesystem nfsd, em vez de system calls). Existem também outras alterações internas, incluindo a separação de lockd e nfsd e o suporte para zero-copy networking nas interfaces suportadas. O lado do cliente NFS também beneficiou-se de vários melhoramentos na implementação do protocolo RPC, incluindo uma estrutura de cache, controle de conexão por UDP, e outros melhoramentos para o TCP. O suporte Linux ao uso de volumes compartilhados NFS como filesystem root (para sistemas disk-less) também foi melhorado, já que o kernel agora suporta NFS sobre TCP para isto.
Além de melhorar o suporte a filesystems de rede no estilo UNIX, o Linux 2.6 também traz vários melhoramentos aos filesystems de rede estilo Windows. O filesystem compartilhado padrão para servidores Windows (bem como para o OS/2 e outros sistemas operacionais) tem sido o protocolo SMB (//"server message block"//), e o kernel Linux tem um excelente suporte cliente para o protocolo SMB há várias versões. Entretanto, o Windows 2000 padronizou em um superconjunto atualizado do protocolo SMB, conhecido como CIFS (//"common internet filesystem"//). A intenção por trás desta atualização é limpar e refinar certos aspectos do SMB que haviam se tornado uma confusão completa (o protocolo em si foi definido de forma vaga e tão geralmente extendido que haviam casos em que a versão do Win95/98/ME era incompatível com a versão do WinNT/Win2k). O CIFS foi desenvolvido com esta intenção e acrescentou o suporte a UNICODE, melhorou o bloqueio de arquivos, os links físicos, eliminou os últimos vestígios de dependências do NetBIOS, e acrescentou algumas outras funcionalidades para os usuários Windows. Como os usuários Linux não gostam de ficar no escuro por muito tempo, o Linux 2.6 agora inclui um suporte completamente reescrito para a montagem nativa de filesystems CIFS. O Linux 2.6 também inclui suporte às extensões SMB-UNIX aos protocolos SMB e CIFS, que permitem que o Linux acesse tipos de arquivos não-Windows (como nós de dispositivos e links simbólicos) em servidores SMB que suportam o mesmo (como o Samba).
Apesar de não ser tão comum atualmente, o Linux não esqueceu completamente os usuários de Novell NetWare. O Linux 2.6 permite que os clientes Linux montem até um máximo de 256 compartilhamentos em um único volume NetWare usando seu driver de filesystem NCP ("NetWare Core Protocol") interno.
O Linux 2.6 também inclui um suporte melhorado para o domínio relativamente novo dos filesystems distribuídos de rede, sistemas em que os arquivos em um único volume lógico podem estar espalhados por vários nós. Além do filesystem CODA, introduzido no Linux 2.4, o Linux agora inclui algum suporte para dois outros filesystems distribuídos: AFS e InterMezzo. O AFS, ou Andrew FileSystem (tem este nome por que foi desenvolvido originalmente na CMU) atualmente é bastante limitado e restrito a operações de leitura. O segundo filesystem novo, o InterMezzo (também desenvolvido na CMU), também está debutando no Linux 2.6 e permite mais funcionalidades avançadas, como operação desconectado (permitindo que você trabalhe em arquivos que estão no cache local) e é apropriado para aplicações de alta disponibilidade, em que você precisa garantir que a armazenagem nunca está indisponível (ou simulada, se estiver fora do ar). Ele também tem aplicações para manter os dados em sincronia entre múltiplos computadores, como um laptop ou PDA e um computador desktop. Muitos dos projetos que fornecem suporte a estes novos tipos de filesystem foram inicialmente desenvolvidos no Linux, colocando o Linux bem além da curva em termos de suporte a estas novas funcionalidades.
Outra das grandes alterações no Linux 2.6 que não recebe atenção suficiente é a riqueza de novas alterações relacionadas à segurança. Mais fundamentalmente, toda a segurança baseada em kernel (os poderes do super usuário em um sistema operacional UNIX-like) foi modularizado para ser um de um número potencial de outros módulos de segurança alternativos (atualmente, o único modelo de segurança é o padrão e um módulo exemplo de como fazer o seu próprio). Como parte desta mudança, todas as partes do kernel agora foram atualizadas para usar "capabilities" como a base do acesso de usuários granular, em vez do velho sistema do "superusuário". Quase todos os sistemas Linux continuarão a ter uma conta "root" que tem acesso completo, mas este esquema possibilita que um sistema Linux-like seja criado que não tenha esta suposição interna. Outra alteração relacionada à segurança é que os módulos binários (por exemplo, drivers disponibilizados por um fabricante de hardware) não podem mais "sobrepor" as chamadas de sistema com as suas própria e não podem mais ver e modificar a tabela de chamadas de sistema. Esta providência restringe significativamente o acesso que módulos não open-source podem ter ao kernel e possivelmente fecha alguns furos em torno da GPL. A mudança final que é de alguma forma relacionada à segurança é que o Linux com o novo kernel pode agora usar geradores de números aleatórios de hardware (como os que estão presentes em alguns novos processadores), em vez de basear-se em uma fonte de entropia (que até que é boa) baseada em flutuações randômicas de hardware.
Uma das mais interessantes das novas funcionalidades do Linux 2.6 é a inclusão de uma arquitetura de "user-mode". Esta é essencialmente um port (como para uma diferente família de hardware) do Linux para si mesmo, permitindo que seja executado um ambiente Linux-no-Linux completamente virtualizado. A nova instância do Linux é executada como se fosse uma aplicação normal. "Dentro" da aplicação, pode-se configurar interfaces de rede falsas, filesystems, e outros dispositivos através de drivers que se comunicam com a cópia hóspede do Linux de uma forma segura. Esta funcionalidade é bastante útil, tanto para desenvolvimentos (profiling, etc.) quanto para análises de segurança e honeypots. Apesar da maioria dos usuários nunca precisar deste tipo de suporte, esta é uma funcionalidade incrivelmente "cool" para ter no seu computador (impressione seus amigos!).
Além de todo o suporte genérico descrito acima (APM e ACPI melhorados, melhoramentos no suporte a wireless, etc.) o Linux também inclui duas outras funcionalidades difíceis de classificar, que ajudarão mais aos usuários de laptops. A primeira é que a nova edição do kernel agora suporta completamente a funcionalidade software-suspend-to-disk para o usuário Linux. A nova versão também suporta a habilidade de processadores modernos para sistemas móveis de mudar a velocidade (e necessidades de energia) baseado no fato de você estar ou não conectado.
Apesar de o Linux 2.6 representar um grande avanço, a diferença para as aplicações de usuário será praticamente inexistente. Uma exceção a esta regra parece estar na threading: algumas aplicações podem fazer coisas que funcionavam nas versões 2.4 e 2.2, mas não serão mais permitidas. Estas aplicações serão a exceção à regra. Obviamente, aplicações de baixo nível, como ferramentas para módulos definitivamente não irão funcionar. Além disto, alguns dos arquivos e formatos nos diretórios /proc e /dev mudaram, e qualquer aplicação que dependa disto pode não funcionar corretamente (isto é especialmente verdadeiro à medida que mais coisas são colocadas no novo filesystem virtual /sys. No caso do /dev, a compatibilidade com nomes de dispositivos pode ser facilmente configurada).
Além dos avisos padrão, existe um número de outras pequenas alterações que podem afetar alguns ambientes. Primeiro, arquivos de swap muito antigos (do Linux 2.0 ou anteriores) precisarão ser reformatados antes que possam ser usados com o 2.6 (arquivos de swap não contém nenhum dado permanente, este procedimento não deverá ser nenhum problema para os usuários Linux). O daemon kHTTPd que permite que o kernel sirva páginas WEB diretamente também foi removido, já que a maioria dos gargalos de performance que impediam que o Apache, Zeus, et. al. de responderem na mesma velocidade do kernel foram resolvidos. O suporte para "disk managers" DOS antigos, como o OnTrack e o EzDrive, para discos rígidos bem antigos e compatibilidade com o DOS foram removidos. O suporte para o uso de um setor de boot com o kernel para iniciar o computador com um disquete também foi removido, de forma que o SysLinux deve ser utilizado no seu lugar. E, finalmente, o suporte a "soundmodem" (para brincadeiras acústicas com a placa de som, fazendo-a um modem) foi removida, há uma versão para user-space com melhor manutenção e mais atualizada.
Este documento foi montado principalmente a partir de longas horas de observação dos changelogs do BitKeeper, examinando o kernel e brincando com o código fonte, lendo mensagens das listas de email, e muitas e muitas pesquisas no Google e Lycos por documentação disto e daquilo. Por isto, podem haver trechos em que algo pode ter sido esquecido ou mal compreendido, e lugares em que alguma coisa pode ter retornado após o fato (eu fui bastante cuidadoso com as duas versões do suporte IDE que estavam funcionando durante este período, mas existem outros exemplos). Eu também tentei examinar cuidadosamente de páginas web de projetos que foram integrados no kernel, já que elas geralmente estão "um pouco adiante" do que está suportado oficialmente. Se você encontrar algum erro neste documento ou quiser mandar uma mensagem perguntando como estou, pode fazê-lo no email jpranevich <at> kniggit.net.
Para pessoas com mentalidade mais técnica que querem apenas uma lista de itens, Dave Jones montou um excelente resumo do progresso do Linux 2.5 em http://www.codemonkey.org.uk/post-halloween-2.5.txt. Qualquer semelhança entre este documento e o trabalho dele é puramente coincidência, já que ambos estávamos usando os fontes originais e ambos estamos mais ligados ao i386.
Este documento tem o Copyright 2003, Joseph Pranevich. A redistribuição online sem modificações é permitida, mas por favor mande um email se você está interessado em distribuição offline (revistas, etc). Como cortesia, eu gostaria de receber uma mensagem em qualquer caso, como uma nova versão disponível.
Esta tradução tem o Copyright (C) 2003, César Grossmann. Todas as limitações do texto originais aplicam-se a esta tradução. Peço que quaisquer erros e imprecisões deste texto não sejam encaminhadas ao autor original, Joseph Pranevich, mas ao tradutor, no email cesarakg@bol.com.br.
Este documento foi produzido com o auxílio do txt2tags, que pode ser encontrado em http://txt2tags.sf.net/. O arquivo original está aqui.