Process Management (PM) - controla o acesso dos processos ao processador (CPU);
Memory Management (MM) - controla o acesso dos processos à memória;
Virtual File System (VFS) - fornece uma interface para os dados armazenados nos dispositivos de hardware;
Networking Layer (NL) - permite a conexão com outros dispositivos da rede;
Interprocess Communications (IPC) - controla a comunicação entre os processos;
Espaço do kernel (kernel space) - local onde o kernel é executado.
Espaço do usuário (user space) - local onde os processos dos usuários são executados.
O kernel do Linux é distribuído sob os termos da GPL (GNU General Public License) - isto significa que é distribuído sem cobrança de taxas. Além disso, é possível alterar o código e distribui-lo livremente.
É preemptive - a execução de uma tarefa é interrompida, após um tempo, e outra tarefa ganha o direito de usar o processador. Isto evita que uma tarefa monopolize o processador por um longo tempo.
Não é paginável - todo o código do kernel deve ser armazenado na memória física.
Não há um suporte explícito para threads - uma thread é tratada da mesma forma de um processo.
Tem suporte do multiprocessador simétrico (SMP) - dois ou mais processadores idênticos compartilham a memória principal.
Inicialmente, os kernels eram oficialmente identificados por três números e o pacote de instalação era composto por:
o número principal - o número da versão.
o número secundário - mudava apenas quando mudanças substanciais eram feitas no kernel. Os números pares (0,2,4,...) indicavam versões estáveis e os números ímpares (1,3,5,...) indicam versões de teste.
o nível de revisão-manutenção - o primeiro número era alterado quando ocorria uma pequena mudança no kernel, enquanto o segundo número mudava quando um erro era corrigido na revisão disponibilizada.
"The problem with major development trees like 2.4.x vs 2.5.x was that the release cycles were too long, and that people hated the back- and forward-porting. That said, it did serve a purpose - people kind of knew where they stood, even though we always ended up having to have big changes in the stable tree too, just to keep up with a changing landscape."
RFD: Kernel release numbering - 2 Mar 2005
A versão 2.6.39 foi seguida pela versão 3.0 - não existiu uma razão técnica para a mudança do primeiro número;
As versões de teste (kernel estável + patch) passam a ser identificadas por rc (release candidate) - a versão 3.0-rc1 foi lançada depois da 2.6.39 e antes da 3.0.
"I decided to just bite the bullet, and call the next version 3.0. It will get released close enough to the 20-year mark, which is excuse enough for me, although honestly, the real reason is just that I can no longe rcomfortably count as high as 40."
Linux 3.0-rc1 - 29 May 2011
"Feature-wise, 4.0 doesn't have all that much special. Much have been made of the new kernel patching infrastructure, but realistically, that not only wasn't the reason for the version number change, we've had much bigger changes in other versions. So this is very much a "solid code progress" release".
Linux 4.0 released - 12 April 2015
As versões do kernel liberadas em www.kernel.org são chamadas de "vanilla" (sabor básico de sorvete) ou "mainline". Elas possuem o básico do Linux e são usadas como matéria-prima para o desenvolvimento das distribuições Linux. Quando uma distribuição não acrescenta novos pacotes e nem faz alterações no código original, ela é classificada como uma distribuição vanilla. Gentoo e Arch são exemplos deste tipo de distribuição.
Prepatch - é também chamado de kernel rc (release candidate), pois implementa conceitos novos, ainda em discussão, nos grupos de desenvolvedores. Quando um kernel prepatch é liberado, ele passa a ser considerado mainline. O próprio Linus Torvalds é o responsável pela manutenção e liberação deste tipo de kernel.
Mainline - é a principal linha de desenvolvimento do Linux onde novas características são introduzidas, melhor desenvolvidas e testadas exaustivamente. Linus Torvalds é o responsável pela manutenção e liberação deste tipo de kernel.
Stable - quando um kernel mainline é liberado, ele passa a ser considerado estável. Entretanto, este tipo de kernel continua a receber correções para qualquer erro detectado.
Longterm - é um kernel estável antigo que recebe correções só para erros importantes.
EOL (End of Life) - é um kernel que raramente recebe manutenção da equipe de desenvolvedores do kernel. Não é aconselhável usar este tipo de kernel.
A figura abaixo mostra a situação dos kernels em dezembro de 2014. Note que a versão 3.19 está sendo testada e que existem 2 kernels stables e 6 kernels longterms.
generic - é o kernel de uso geral e é distribuído, por padrão, com o Ubuntu.
preempt - é baseado no kernel generic, mas possui configurações diferentes para reduzir latência (tempo de resposta do sistema operacional). É conhecido como soft real-time kernel.
lowlatency - é similar ao preempt kernel, mas usa uma configuração mais agressiva para reduzir a latência. É também conhecido como soft real-time kernel.
rt - corresponde ao kernel generic com o patch PREEMPT_RT. É conhecido como hard real-time kernel.
realtime - é similar ao rt kernel, pois usa o generic kernel com o patch PREEMPT_RT. Entretanto, possui uma configuração mais agressiva para permitir características de tempo real ao sistema operacional. É também conhecido como hard real-time kernel.
Para saber a versão do kernel em uso, basta digitar
ou ver o conteúdo do arquivo /proc/version.
Neste caso, temos a distribuição Ubuntu com o kernel Linux 3.2.0. O kernel não sofreu qualquer correção de erro, mas a distribuição Ubuntu teve 35 correções. O termo "generic" indica que esta versão é de uso geral, enquanto o termo "pae" significa physical address extension. A tecnologia pae permite estender o tamanho do endereço de 32 bits para 36 bits, permitindo que sistemas operacionais de 32 bits usem até 64 GBytes de memória RAM (mas nenhum processo pode acessar todos os 64GBytes da memória física).
Se a resposta ao comando acima fosse
3.18.1-031801-generic
o sistema estaria usando a versão 18 com nível de revisão 1. A numeração 031801 dada pela Ubuntu apenas repete os três números da versão original e indica que esta é a versão final da distribuição Ubuntu para o kernel 3.18.1.
include/uapi/linux - contém o user space API do kernel, ou seja, os cabeçalhos usados nos aplicativos desenvolvidos pelos usuários.
include/linux/ - contém os cabeçalhos usados pelo próprio kernel. Ele contém arquivos do uapi/linux com algumas modificações e arquivos exclusivos para uso do kernel.
arch - contém os cabeçalhos específicos das arquiteturas suportadas pelo Linux como o diretório x86 para a arquitetura x86 da Intel.
Por exemplo, para o kernel 3.18.1 da distribuição Ubuntu, temos
/usr/src/linux-headers-3.18.1-031801/include/linux/
/usr/src/linux-headers-3.18.1-031801/include/uapi/linux/
/usr/src/linux-headers-3.18.1-031801/arch/
A imagem abaixo mostra os arquivos do kernel 3.18-vivid.
Portanto, para a arquitetura de 32 bits, devem ser baixados os arquivos
linux-headers-3.18.0-031800_3.18.0-031800.201412071935_all.deb;
linux-headers-3.18.0-031800-generic_3.18.0-031800.201412071935_i386.deb;
linux-image-3.18.0-031800-generic_3.18.0-031800.201412071935_i386.deb.
Enquanto que, para a arquitetura de 64 bits, os arquivos são
linux-headers-3.18.0-031800-generic_3.18.0-031800.201412071935_amd64.deb;
linux-image-3.18.0-031800-generic_3.18.0-031800.201412071935_amd64.deb.
Baixar o código-fonte do kernel Linux que se deseja compilar em www.kernel.org/pub/linux/kernel/. Vamos assumir neste tópico que desejamos compilar o kernel 3.16.7.
Abra um terminal (CTRL+ALT+T) e vá para o diretório onde está o arquivo baixado.
O Kernel Linux vem com a extensão ".tar.xz". Para descompactar o arquivo com o kernel 3.16.7 deve-se digitar
tar -x --xz -f linux-3.16.7.tar.xz
--xz corresponde a descomprimir o conteúdo do arquivo no formato xz;
Talvez seja preciso instalar os pacotes "xz-lzma", "xzdec", "xzoom", "xz-utils", "xzgv", e "xzip" na distribuição que você está usando. Embora alguns desses pacotes sirvam para descompactar arquivos com imagens, é melhor instalar todos.
A execução do passo anterior cria um diretório com o código-fonte do kernel 3.16.7. Este será o diretório de trabalho para a compilação do kernel.
make config - usa modo texto.
make menuconfig - usa modo texto com cor, radiolists e diálogos (requer as bibliotecas ncurses).
make localmodconfig - cria um .config baseado na configuração atual e nos módulos carregados.
make oldconfig - cria um .config baseado na configuração atual do sistema (com todos os módulos, carregados ou não).
built-in - o módulo é incorporado ao kernel na compilação (passa a fazer parte do código-fonte do kernel);
não habilitado - não é carregado na inicialização do sistema, mas está disponível quando for necessário;
habilitado - o módulo é carregado na inicialização do sistema (mas não faz parte do código-fonte do kernel).
Se você apenas deseja criar um kernel para entender o processo de compilação, a maneira mais simples e rápida é usar a opção "make oldconfig" e dar Enter em todas as perguntas que são feitas (usa o padão atual do sistema).
Compilar e instalar o Kernel
O alvo (target) "modules" é o padrão, por isso não precisa ser informado.
para instalar os seguintes arquivos no /boot
vmlinuz - o termo "vm" significa virtual memory e o termo "linuz" significa o kernel compactado no formato bzImage (big zImage). Portanto, o arquivo vmlinuz contém a imagem compactada do kernel usada para carregar o sistema durante a inicialização (tem outras informações além do executável do kernel). A compactação é necessária para manter a compatibilidade com arquiteturas mais antigas onde o espaço disponível para armazenar o kernel é limitado (a imagem pode ser descompactada em áreas não contínuas da memória). Além disso, o antigo zImage descompactava o kernel na área baixa da memória (os primeiros 640k), enquanto o atual bzImage descompacta o kernel na memória alta (acima de 1M).
initrd - imagem com os arquivos necessários para suportar o segundo estágio do boot, pois carrega um sistema de arquivos temporário na memória durante o boot do sistema;
config - arquivo texto com a configuração do kernel;
System.map - tabela de símbolos do kernel e seus endereços na memória, onde um símbolo pode ser o nome de uma variável ou de uma função; é importante para depurar kernel panic.
Agora é só reinicializar a máquina e escolher o novo kernel no menu inicial do grub. Para o exemplo acima, a resposta ao comando "uname -r" é