Você está na página 1de 6

Compilando o Kernel otimizado para o seu processador no Ubuntu!

Nota!
Primeiramente gostaria de dizer que este tutorial no s meu! Ele de todos os amigos e colegas que participam do tpico do Hqxriven sobre o Kernel Omnislash (Unofficial) - Aprendendo a voar sem segredos (http://ubuntuforum-br.org/index.php/topic,29799.0.html)!!! Vrios colegas contriburam para este tutorial, gostaria de agradecer aos colegas: Buli, MSXManiac , 4d4c47, Gunss, cesargcomp, vampire_thunder e Hqxriven! Minhas sinceras desculpas se esqueci de algum que tenha contribudo direta ou indiretamente com esse tutorial e que no tenha o seu nick aqui divulgado! s falar que eu corrijo! Esse tutorial no foi feito pensando em usurios iniciantes! Ele tambm faz uso macio, se no quase que exclusivo, da linha de comando! Portanto se no gosta do bom e velho terminal, pare por aqui!!!! O que eu fiz foi juntar muita informao que estava espalhada no tpico do Hqxriven do kernel Ominislash! Coisas que eu e os colegas acima citados fomos descobrindo e testando ao longo do tpico do kernel Omnislash! Portanto este tutorial no serve e nem quer substituir o tpico do Hqxriven! Ele atende a pedidos insistentes dos participantes do tpico do Hqxriven que pediam essas informaes reunidas em um s lugar! Se qualquer colega do frum quiser acrescentar ou corrigir qualquer informao do tutorial abaixo, por favor esteja a vontade para o fazer! Ento vamos deixar de conversa fiada e partir para o que interessa!!!

1- Introduo!
Para quem gosta de ter o mximo de desempenho possvel do seu sistema operacional j deve ter se perguntado qual o motivo de uma distribuio ser mais rpida que outras! Foi a resposta de uma pergunta como essa que levou a existncia do tpico do Hqxriven! Mas ainda no satisfeito, eu me perguntava qual o motivo de ao utilizarmos opes de otimizaes para o kernel para um processador que no era o meu, ter um desempenho maior do que quando usava as opes para o meu processador? Este tpico a reposta dessa minha pergunta! O que eu tentarei a seguir fazer o resumo da sntese de um assunto bastante amplo e complexo, mas que vale a pena ser relatado para que voc tenha um melhor entendimento do que estar fazendo com os comandos a seguir! Os desenvolvedores do Kernel Linux e de grandes distribuies tem uma tarefa muito ingrata na hora de fazer um kernel ou sistema que funcione bem no importa qual seja a sua configurao! Na tentativa de fazer com que o kernel Linux funcione numa variedade muito ampla de processadores, afinal ele no sabe em que modelo ou marca de fabricante de processador o kernel vai funcionar, o desenvolvedor obrigado a tomar medidas que faam com que o kernel funcione desde de um 286 a um Core i7 de ltima gerao! Ou seja, estamos cobrindo quase 30 anos de histria de processadores! E vocs sabem o que apenas um ano representa em matria de desenvolvimento de processadores! Distribuies mais modernas que visam apenas processadores mais recentes j no possuem compatibilidade com processadores com mais de 11 anos de idade! Mesmo assim isso representa um perodo gigantesco em matria de novas tecnologias e instrues embutidas no processador! O resultado o uso de configuraes genricas no kernel para que ele possa funcionar numa mirade de modelos e marcas de processadores! Se voc acha que apenas AMD e Intel fazem processadores pesquise mais um pouco sobre o assunto! Se voc tiver curiosidade, visite as pginas da Intel ou AMD e procure ler a respeito das instrues de otimizao que cada processador tem embutida dentro dele! Para comear, pesquise sobre instrues SSE! Se o kernel no for capaz de reconhecer alguma instruo do processador ou precisar de uma instruo que no est disponvel no processador em questo ele simplesmente no "liga"! Um exemplo prtico disso foi o que ocorreu com o nosso amigo vampire_thunder na tentativa da instalao do Ubuntu 10.10 em um K6-II 500! O kernel do Ubuntu 10.10, voltado para processadores com menos de 10 anos de idade, no "ligou" com um k6-II 500 por ele no ter suporte as instrues cmov!!! Com isso o vampire teve que usar o Ubuntu 10.04 que ainda d suporte a processadores to velhos! Ento agora voc j deve estar passando o carto ou voc j deve estar se fazendo algumas perguntas! Para que o kernel funcione no maior nmero possvel de processadores os desenvolvedores removem as instrues de otimizao dos processadores mais novos para que o kernel funcione num processador do arco da velha? Sim, isso mesmo o que acontece!!!! Ento quer dizer que o meu novssimo Phenon X6 ou Core i7 rodam muito aqum de sua capacidade mxima? Sim, isso mesmo o que ocorre!!!

Mas nem tudo est perdido! Se voc costuma compilar o seu kernel esse problema pode ser evitado e voc poder retirar cada gota do desempenho de seu caro processador! Mesmo que ele seja um Pentium 4 ou o Atom! Essas alteraes so feitas nas instrues passadas para o GCC ( GNU Compiler Collection) na hora de compilar o seu kernel! Em distribuies feitas para serem compiladas, como o Arch Linux e o Gentoo, seus usurios j esto acostumados com isso! Inclusive o Arch Linux e o Gentoo trazem ainda mais opes de compilaes das que mostradas a seguir! Lembre-se, o Ubuntu no uma distribuio para ser compilada! Ela foi feita para usar os pacotes .deb j prontos pela equipe da Canonical! O que vamos fazer ter o melhor de dois mundos! A praticidade de no ter que compilar um sistema inteiro mas sim compilar apenas a parte principal e maior responsvel pelo desempenho do sistema! Se voc quiser tirar cada gota mxima de desempenho do seu sistema inteiro, sugiro que mude de distribuio! Passe a usar o Arch Linux ou o Gentoo!!!

2- Entendo as alteraes do GCC


Tudo comeou com uma simples pergunta: Qual o motivo do meu sistema com Core i7 desempenhar melhor quando eu colocava o kernel para ser otimizado para Pentium 4 do que para Core2? Voc que est acostumado a compilar o kernel Linux sabe da suma importncia de acertar o processador no Menuconfig do kernel para o desempenho ideal! Por isso essa pergunta me deixava com um elefante atrs da orelha!!! Mas antes da resposta a essa pergunta vamos entender o que o GCC! Segundo a Wikipedia: O GNU Compiler Collection (chamado usualmente por GCC) um conjunto de compiladores de linguagens de programao produzido pelo projecto GNU. software livre distribudo pela Free Software Foundation (FSF) sob os termos da GNU GPL, e um componente chave do conjunto de ferramentas GNU. o compilador padro para sistemas operativos UNIX e Linux e certos sistemas operativos derivados tais como o Mac OS X. Originalmente suportava somente a linguagem de programao C e era designado GNU C Compiler (compilador C GNU). Com o tempo ganhou suporte s linguagens C++, Fortran, Ada, Java e Objective-C, entre outras. Depois de muita pesquisa e leitura, descobri o seguinte: Segundo a documentao do GCC, na teoria, deveramos ter melhor desempenho ao se colocar a arquitetura correta do processador na hora de compilar! O problema que isso vale mais para distros feitas para serem compiladas como Arch Linux e o Gentoo! Essas duas distros possuem um arquivo de configurao onde dentro dele esto contidas todas as instrues na hora de compilar qualquer coisa no sistema! O Debian/Ubuntu no possuem tal coisa! Nem vou falar do apt-build pois este no conta para compilar kernel! Como ia dizendo, na documentao do GCC existe a opo de ativar as otimizaes do seu processador! Como no Ubuntu no temos o mesmo arquivo de configurao do Gentoo ou do Arch Linux, faremos as alteraes diretamente nos arquivos do fonte do Kernel! Ns vamos alterar a linha do CFLAGS (para o C) e o CXXFLAGS (para o C++) e todas as linhas que contiverem as opes "march", "mtune" e "mcpu" nos arquivos que importam do fonte do kernel! Desde a verso 4.3 do GCC existe a opo mtune que ajuda na ativao de instrues para processadores x86! Ou seja, ela ajuda de forma "genrica"! Apesar de obsoleta nas verses mais recentes do GCC essa opo ainda utilizada por questes de compatibilidade! Para um melhor aproveitamento na ativao das instrues dos processadores foi criada a opo march que ativa instrues especficas para o seu processador! Mesmo assim fica difcil saber qual opo utilizar sendo tantos os modelos e variaes nas instrues dos processadores! Para facilitar a nossa vida os desenvolvedores criaram a opo "march=native" que verifica em qual processador o cdigo vai ser compilado e ativa todas as instrues deste processador em questo! Para entender um pouco mais, ao se usar o "mtune" a compilao ir otimizar o cdigo para o processador, mas ele no usa as otimizaes especficas das instrues do mesmo! Ao se utilizar a opo "march", ele usa as otimizaes especficas das instrues do processador! E mais, ao se usar a opo "march" implica em dizer que o mtune vai seguir o "march", mas o contrrio no verdadeiro! Embolou o meio de campo? Fica fcil entender com um exemplo! Se eu colocar mtune=core2, quer dizer que o cdigo a ser compilado vai usar otimizaes para o Core2, mas por compatibilidade e segurana ele no vai usar instrues especficas, vai usar instrues genricas nas instrues! A vai depender do desenvolvedor, ele pode colocar a i386 se quiser nas instrues, mas ao que tudo indica, eles usam a nocona (que foi o primeiro pentium 4 com instrues 64bits). A nocona possui: Pentium4 com extenses 64-bit , MMX, SSE, SSE2 e SSE3! Se eu usar march=core2, quer dizer que ele vai usar as instrues especficas do Core2 ( extenses 64-bit, MMX, SSE, SSE2, SSE3 e SSSE3), ou seja, se o seu processador no suportar tais instrues, o kernel no "liga"!!! Ao usar o march=core2 implica em dizer que o mtune tambm ser Core2! Passaram o carto agora?

Resumindo: mtune= cdigo otimizado, sem instrues do processador otimizadas! march= cdigo e instrues do processador otimizadas de acordo com a arquitetura do processador selecionada! Eu s tive essa luz no fim do tnel porque eu achei um frum de programadores em C e um Canadense deu uma explicao matadora que eu no tinha lido em canto nenhum ainda! Leiam o que o cyberfish diz: mtune=... does NOT affect the instruction sets used, or machines the executable is run on. For that (eg, enabling SSE), you'll need march=.... If you do march=core2 for example (on a new GCC), it will use all the instruction sets available to Core 2 CPUs. march=x also sets mtune=x. The executable won't run on older CPUs. If you ONLY use mtune=core2, it will generate code that runs the best on a Core 2, but will still only use instructions available to all x86 CPUs (eg, no SSE), hence it will still run on old CPUs, just a little slower. As a real world example, I think a few years ago some Linux distribution decides to use -march=pentium3 -mtune=pentium4, or something like that. That means, the code is guaranteed to run on a P3, but optimized for a P4, since they predict most people will be running for a P4. If you don't use any flag, GCC will assume -march=i386 (lowest x86). If you want GCC to use all instruction sets on your CPU, and optimize for your CPU (because, for example, the code will only be run on your machine), you can do -march=native (which also sets mtune=native). Only available in newer GCC (it was introduced in 4.3 or 4.4 I THINK). -m32 and -m64 are only for generating 32-bit code on a 64-bit machine, or generating 64-bit code on a 32-bit machine, respectively. GCC defaults to 32-bit on 32-bit, and 64-bit on 64-bit. O tpico este aqui: http://cboard.cprogramming.com/c-programming/127502-%5Bgcc%5Dcompiling-generic-x86-architecture-2.html E quanto ao kernel? Tudo indica que ao usar o menuconfig estamos alterando apenas o mtune e no o march!!!! Pois o sistema j foi construdo! uma distro binria! Com o Gentoo e o Arch linux no, o "normal" deles voc construir o sistema inteiro! Para bular tal limitao no Ubuntu que vamos alterar os arquivos do Makefile do kernel! O arquivo Makefile um dos que contm as instrues para compilar o cdigo do kernel! Essa dica foi dada por outro usurio do frum internacional do Ubuntu, o tpico este aqui: http://ubuntuforums.org/showthread.php? t=1579505

3- Colocando a mo na massa!
J sei, voc est ansioso para colocar isso tudo em prtica! Mas espere s mais um pouco! que voc pode ter dvida em que momento da preparao para compilar o kernel voc vai executar os comandos e alteraes abaixo! Voc pode continuar o seu tutorial habitual, como o do Hqxriven. Baixe o fonte do kernel que voc for usar, descompacte-o, aplique os patchs que voc assim desejar, faa as alteraes do menuconfig/xconfig que voc pretende e s ento realize as alteraes sugeridas abaixo antes de efetivamente dar os comandos para compilar o kernel! Descobri que assim as chances de erros so bem menores! A primeira coisa a saber quais as opes colocar na linha do CFLAGS do Makefile do diretrio raiz do fonte do kernel! Ateno, se a sua verso do GCC for muita antiga o comando abaixo no funcionar, portanto voc ter que migrar para uma verso do GCC mais recente! Por falar em GCC, sempre procure usar a verso mais recente do GCC se quiser extrair o mximo de desempenho de processadores modernos! Aqui mesmo no Frum eu j coloquei um tuto de como alterar a verso do GCC do Ubuntu e o

Alyscom mostra l que existe um PPA para as verses do GCC mais recentes tambm: http://ubuntuforum-br.org/index.php/topic,76787.0.html Contudo, pode haver erro ao compilar o kernel numa verso moderna do GCC e voc for utilizar esse kernel em um sistema com GCC mais antigo!!! Ento cuidado! Para no correr riscos o ideal usar um sistema com a mesma verso do GCC em que o kernel foi compilado! Para saber o que vai ser alterado use o comando abaixo na mquina em questo: $cc -march=native -E -v - </dev/null 2>&1 | grep cc1 Como exemplo eu vou colocar a sada do comando do meu Core i7: galactus@galactus-mint ~ $ cc -march=native -E -v - </dev/null 2>&1 | grep cc1 /usr/lib/gcc/x86_64-linuxgnu/4.4.5/cc1 -E -quiet -v - -D_FORTIFY_SOURCE=2 -march=core2 -mcx16 -msahf -mpopcnt -msse4.2 --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=256 -mtune=core2 -fstack-protector A parte em negrito a que interessa para melhorar o desempenho! As opes -D_FORTIFY_SOURCE=2 e -fstack-protector servem para melhorar a segurana da memria contra ataques de segurana! Se decidir colocar essas opes na linha do CFLAGS, lembre-se de ativar a opo fstack-protector no menuconfig do Kernel!!!! Como podem ver o comando mostra a verso do GCC do meu sistema, que no exemplo acima usa o GCC 4.4.5, mostra que vai otimizar o processador para sua famlia correta "core2", ativa todas as suas instrues especficas deste processador com o -msse4.2, passa parmetros especficos para otimizar a memria cache L1 e L2 do processador alm de outras opes de otimizao que vocs podem pesquisar na documentao do GCC! De posse dessas informaes, procure o arquivo Makefile na seguinte pasta (voc tambm pode alterar os arquivos da pasta de link simblico "linux"): /usr/src/linux-2.6.XX/Makefile A linha que vamos alterar est por volta da 232! O arquivo original deve ser parecido com este: # SHELL used by kbuild CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) HOSTCC = gcc HOSTCXX = g++ HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-framepointer HOSTCXXFLAGS = -O2 A linha em negrito a que interessa! A linha modificada deve ficar assim: # SHELL used by kbuild CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ else if [ -x /bin/bash ]; then echo /bin/bash; \ else echo sh; fi ; fi) HOSTCC = gcc HOSTCXX = g++ HOSTCFLAGS = -Wall -Wmissing-prototypes Wstrict-prototypes -O2 -pipe -fomitframe-pointer -march=native -mcx16 -msahf -mpopcnt -msse4.2 --param l1-cachesize=32 --param l1-cache-line-size=64 --param l2-cache-size=256 -mtune=generic HOSTCXXFLAGS = -O2

Dicas:
- Acrescente a opo -pipe para acelerar a compilao - Se estiver compilando um kernel 64bits no precisa colocar a opo -fomit-framepointer, ela j padro em compilaes de kerneis 64bits - Altere a opo -march=nomedafamliadoprocessador para -march=native - Se usar a verso do GCC 4.5.1 para baixo, na opo -mtune use -mtune=generic, assim o desempenho maior! Do GCC 4.5.2 em diante, use a sada original do comando acima! No meu caso foi -mtune=core2! - No use a opo -03! Permanea com a -02!
Essas so as principais alteraes a fazer! Se no quiser mexer nas demais pastas, tudo bem! Se quiser extrair um pouco mais, continue lendo! Agora encontre as seguintes pastas listadas abaixo com as linhas onde voc provavelmente vai encontrar as opes march, mtune ou mcpu! A dica do 4d4c47: /usr/src/linux-2.6.xx/arch/x86/boot/compressed/Makefile -linha 12 /usr/src/linux-2.6.xx/arch/x86/boot/Makefile -linha 63 /usr/src/linux-2.6.xx/arch/x86/kernel/acpi/realmode/Makefile -linha 35 /usr/src/linux-2.6.xx/arch/x86/Kconfig.cpu -linha 300 /usr/src/linux-2.6.xx/arch/x86/Makefile -linhas 53, 54, 57, 58, 59, 60 /usr/src/linux-2.6.xx/arch/x86/Makefile_32.cpu -linhas 5, 7, 9, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 43, 46, 47, 63 Especial ateno para o arquivo Makefile_32.cpu! A est a opo para otimizao do seu processador!!!! Em todos os arquivos acima listados, altere todas as opes ativas de -march=xx para -march=native, de -mtune=xx para -mtune=generic (se usar a verso do GCC 4.5.1 para baixo) ou para -mtune=nomedafamliadoprocessador que a sada do comando mostrou se usar a verso do GCC 4.5.2 em diante, e mcpu para -mcpu=native! De novo o colega 4d4c47 trs a dica: depois de tudo isso, comece a compilao ( pra ver se t compilando com march=native mesmo), abra um outro terminal e execute aps 2 minutos de compilao: ps ax | grep gcc | grep march. E s!!!

4- O que eu ganho com isso tudo?


Ao realizar essas alteraes voc ter um kernel compilado otimizado especificamente para o seu processador, com todas as instrues que esto embutidas nele ativas, com sua memria cache otimizada entre outras opes! O resultado um sistema muito mais gil, principalmente nas operaes que envolvem udio, Vdeo, animaes flash, navegao na internet e diminui o consumo do processador, ento sua conta de energia vai ser menor e sua bateria de notebook vai durar mais! Na hora de chamar um programa pela segunda vez a resposta mais rpida tambm! Outra dica importante do vampire_thunder que voc pode compilar o kernel otimizado para um processador, mesmo no estando na mquina em que voc vai usar o kernel! Mas para isso preciso executar o comando: $cc -march=native -E -v - </dev/null 2>&1 | grep cc1 Na mquina em que o kernel vai ser utilizado, copiar a sada do comando do que interessa e alterar tudo na outra mquina, assim voc vai compilar tudo como se estivesse na maquina em que o kernel vai ser utilizado!

uma mo na roda se voc tem uma mquina poderosa para compilar o kernel e a outra mquina em que o kernel otimizado vai ser usado muito ruim! Ento voc pode usar um Core i7 ou um Phenon X4 para compilar kernel para um Atom 330 ou um K6-II da vida!!!! possvel inclusive compilar um kernel 32bits em uma mquina 64bits, mas no o contrrio, se no me engano! Mas isso outro tutorial que o tio vampire vai fazer!!! Nas pginas abaixo voc vai encontrar muito mais informaes do que coloquei aqui! Muita coisa foi testada e agora sabemos que no funciona direito ou no vale a pena usar! Esteja a vontade para fazer os seus testes! Qualquer erro s avisar! Se tiver novidades tambm sero bem vindas! Este tutorial fruto das seguintes pginas: http://en.gentoo-wiki.com/wiki/Safe_Cflags http://en.gentoo-wiki.com/wiki/Hardware_CFLAGS http://en.gentoo-wiki.com/wiki/Safe_Cflags/Intel#Core_i7_and_Core_i5.2C_Xeon_55xx http://ubuntuforum-br.org/index.php/topic,29799.3300.html http://ubuntuforum-br.org/index.php/topic,29799.3210.html http://ubuntuforum-br.org/index.php/topic,29799.3180.html http://ubuntuforum-br.org/index.php/topic,29799.3120.html http://ubuntuforum-br.org/index.php/topic,29799.3060.html http://ubuntuforum-br.org/index.php/topic,29799.3480.html http://ubuntuforum-br.org/index.php/topic,29799.3510.html Obrigado a todos! Atendendo ao pedido do Vampire, aqui vai um exemplo do que otimizaes do sistema podem fazer por um PC antigo: Pentium 4 1.5Ghz com 384MB de RAM, sendo 64MB para o Vdeo Onboard Matrox! isso mesmo, Matrox! HD de 20GB! Placa me Fujitsu com Chipset Intel 845, e todo o restante do hardware, com exceo da "potente" placa de vdeo Matrox, eram Intel! Portanto uma mquina com 10 anos de idade! Sua Bios de 2001! Com isso ele consegue ter um poder de processamento ainda pior que um Atom moderno! http://www.youtube.com/watch?v=OCevVWiZCks

Você também pode gostar