<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ataraxia! &#187; linux</title>
	<atom:link href="http://www.ataraxia.com.br/posts/tag/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ataraxia.com.br</link>
	<description>O estado da arte em TI</description>
	<lastBuildDate>Sun, 17 Jul 2011 21:36:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Personalizando CFLAGS por pacote no Gentoo</title>
		<link>http://www.ataraxia.com.br/posts/personalizando-cflags-por-pacote-no-gentoo</link>
		<comments>http://www.ataraxia.com.br/posts/personalizando-cflags-por-pacote-no-gentoo#comments</comments>
		<pubDate>Tue, 10 Nov 2009 03:06:24 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[dicas]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[portage]]></category>

		<guid isPermaLink="false">http://www.ataraxia.com.br/?p=356</guid>
		<description><![CDATA[O Gentoo é uma distribuição Linux famosa por ter todos os seus pacotes compilados do código fonte durante a instalação. Dessa forma, é possível gerar binários otimizados especificamente para a máquina onde vai rodar, especificando as flags que serão passadas para o compilador. Além disso, também é possível especificar quais features cada pacote terá disponível. [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.gentoo.org/">Gentoo</a> é uma distribuição Linux famosa por ter todos os seus pacotes compilados do código fonte durante a instalação. Dessa forma, é possível gerar binários otimizados especificamente para a máquina onde vai rodar, especificando as flags que serão passadas para o compilador.<br />
Além disso, também é possível especificar quais features cada pacote terá disponível. Assim, é possível, por exemplo, ter um pacote instalado sem suporte a determinadas coisas que não serão necessárias, evitando-se assim a instalação como dependência de pacotes que não serão usados.<br />
Um problema que tive em uma instalação foi exatamente com as CFLAGS, as tais flags de otimização que são passadas para o compilador. Estava usando flags bem básicas, assim:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">CFLAGS</span>=<span style="color: #ff0000;">&quot;-O2 -fomit-frame-pointer -march=nocona -pipe&quot;</span></pre></div></div>

<p>Essas flags especificam uma otimização nível 2 (pode ir de 0 a 3 &#8211; o 3 quebra alguns pacotes, por isso é recomendável usar o 2), e especifica também para qual conjunto de instruções os binários serão gerados. No meu caso, estou dizendo que os binários deverão ser compilados para se usar todo o poder do processador nocona (os dual/quad cores da Intel).<br />
Até aí, tudo funcionando bem. Montei um sistema todo com essas flags, e estava tudo muito bem, até que precisei instalar o <a href="http://www.bacula.org/">Bacula</a>, um software para se fazer backups de sistemas completos.<br />
O Bacula, com as CFLAGS padrões estava gerando um binário quebrado. Pesquisando, descobri que o projeto <a href="http://www.gentoo.org/proj/en/hardened/">Hardened</a> do Gentoo, que usa uma série de artifícios para gerar executáveis mais seguros e imunes contra ataques como <a href="http://en.wikipedia.org/wiki/Buffer_overflow">buffer overflow</a> era o responsável, pois por padrão ele passa a flag &#8220;FORTIFY_SOURCE&#8221; para o compilador, e isso estava quebrando o Bacula.<br />
Uma das formas de se resolver esse problema seria alterando as CFLAGS no /etc/make.conf, adicionando <i>-U_FORTIFY_SOURCE</i> a elas. Porém, o grande problema é que as CFLAGS são válidas globalmente, e dessa forma, todos os pacotes seriam compilados com essa flag extra, matando parte dos recursos do projeto Hardened.<br />
O que eu queria era poder compilar <strong>somente</strong> o Bacula com essa flag extra. Uma das formas é usar o diretório /etc/portage/env para criar variáveis de ambientes específicas para cada pacote.<br />
Basta seguir os seguintes passos:</p>
<ol>
<li>1. Pegue o nome completo do pacote, na forma <i>categoria</i>/<i>pacote</i>. No caso do Bacula, o nome completo é <strong>app-backup/bacula</strong>.</li>
<li>2. Crie o arquivo /etc/portage/env/<strong>categoria</strong>/<strong>pacote</strong>, ou no nosso caso, /etc/portage/env/app-backup/bacula. Caso o diretório &#8220;env&#8221; não exista, crie toda a árvore necessária.</li>
<li>3. Nesse arquivo, você pode especificar as variáveis de ambiente que serão definidas exclusivamente para a compilação do pacote. Assim, podemos definir CFLAGS neste arquivo:

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">CFLAGS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">${CFLAGS}</span> -U_FORTIFY_SOURCE&quot;</span></pre></div></div>

</li>
</ol>
<p>Pronto. Com isso, temos a flag extra -U_FORTIFY_SOURCE adicionada às flags globais, e só serão utilizadas para o pacote em questão.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/o-limite-de-4-ou-3-gb-de-memoria" title="O limite de 4 (ou 3?) Gb de memória">O limite de 4 (ou 3?) Gb de memória</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/personalizando-cflags-por-pacote-no-gentoo/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>O limite de 4 (ou 3?) Gb de memória</title>
		<link>http://www.ataraxia.com.br/posts/o-limite-de-4-ou-3-gb-de-memoria</link>
		<comments>http://www.ataraxia.com.br/posts/o-limite-de-4-ou-3-gb-de-memoria#comments</comments>
		<pubDate>Fri, 26 Dec 2008 12:18:10 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[so]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[memoria]]></category>
		<category><![CDATA[pae]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.ataraxia.com.br/?p=36</guid>
		<description><![CDATA[Quem tem um computador com 4 Gb ou mais de memória e usa um sistema operacional de 32 bits já deve ter percebido que o computador não consegue enxergar toda a memória, ficando limitado em algo entre 3 e 4 Gb, dependendo do sistema operacional. O problema A razão desse &#8220;problema&#8221; é simples: o sistema [...]]]></description>
			<content:encoded><![CDATA[<p>Quem tem um computador com 4 Gb ou mais de memória e usa um sistema operacional de 32 bits já deve ter percebido que o computador não consegue enxergar toda a memória, ficando limitado em algo entre 3 e 4 Gb, dependendo do sistema operacional.</p>
<h4>O problema</h4>
<p>A razão desse &#8220;problema&#8221; é simples: o sistema operacional é de 32 bits. Se o sistema operacional é de 32 bits, significa que o maior número que ele pode colocar alocar em um <i>registrador</i> (pequena unidade de memória que fica dentro do processador) é um número de 32 bits. Como endereços de memórias são números, o espaço máximo possível de endereçamento tambem tem 32 bits. E fazendo a conta, temos que 2^32 = 4 Gb.</p>
<p>No Windows, o espaço fica limitado em 3 Gb, porque 1 Gb é reservado para o kernel do sistema.<br />
Pronto, já entendemos o porque do problema. Agora, o que fazer para solucioná-lo?</p>
<h4>A solução limpa</h4>
<p>A primeira solução, e a melhor delas, é migrar para um sistema operacional de 64 bits. Além do ganho no espaço de endereçamento, programas em 64 bits fazem uso melhor do processador.</p>
<p>Considero esta solução como limpa por ser algo nativo. Os programas são compilados em modo 64 bits, e naturalmente já possuem este espaço de endereçamento.</p>
<p>Existem versões 64 bits dos sistemas operacionais mais populares: Linux, Windows (XP/Vista).</p>
<p>Porém, existem casos em que a migração não pode ser feita, e aí existe uma &#8220;gambiarra&#8221; que pode ser feita pra se aumentar um pouco o espaço de endereçamento.</p>
<h4>A solução porca</h4>
<p>Praticamente todos os processadores de hoje em dia (Intel do Pentium Pro em diante, e AMD do Athlon em diante) suportam PAE, ou <i>Physical Address Extension</i> (Extensão de endereçamento físico). A idéia é adicionar mais 4 bits no espaço de endereçamento, aumentando para 36 bits, que nos dá: 2^36 = 64 Gb de espaço.</p>
<p>Claro, o PAE depende tambem do sistema operacional. Chamo de gambiarra, porque os programas continuam enxergando no máximo 32 bits (ou seja, os programs continuam limitados a 4 Gb de memória), e quem gerencia o espaço total é o sistema operacional. Cabe a ele decidir quais programas acessam quais espaços de 32 bits. Não é algo nativo.</p>
<p>Além disso, o sistema vai ficar todo um pouco mais lento, devido ao processamento extra que precisa ser feito pelo sistema operacional para gerenciar esses 4 bits extras.</p>
<h4>Windows</h4>
<p>No mundo Windows, o espaço total suportado pelo sistema operacional depende da versão. O XP enxerga no máximo 4 Gb de memória, mesmo com PAE. <a href="http://www.microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx#EW">Outras versões variam um pouco</a>.</p>
<p>Para se utilizar a memória extra provida pelo PAE, é preciso abrir o arquivo boot.ini, e adicionar o parâmetro <b>/PAE</b> na linha correspondente.</p>
<p>O lado ruim de usar no Windows é que o espaço total não depende somente do PAE, e sim da versão do Windows utilizada. Ou seja, além da restrição dos 64 Gb, o sistema operacional também impõe restrições extras, de modo que dependendo da versão, o sistema continuará sem conseguir enxergar a memória inteira (vide Windows XP e o limite de 4 Gb).</p>
<h4>Linux</h4>
<p>No Linux, as coisas são um pouco mais tranquilas. Basta habilitar o suporte a PAE no kernel do sistema, e ter todos os módulos também compilados com suporte a PAE. A opção relevante fica na parte &#8220;Processor type and features&#8221;, em &#8220;High Memory Support&#8221;.</p>
<p>Ali se escolhe entre desligado, onde o sistema enxerga no máximo 1 Gb de memória, e é a opção recomendada para computadores com 1 Gb ou menos de memória, por ser mais rápida, 4 Gb ou 64 Gb. A opção desejada é a 64 Gb, para utilizar todos os 36 bits disponibilizados, sem nenhuma restrição adicional, como acontece no Windows.</p>
<h4>Na prática</h4>
<p>Em casa, estou utilizando tanto o Windows XP x64 Edition quanto o Linux (Ubuntu 8.10 &#8211; 64 bits) sem maiores problemas. No Windows, consegui driver pra tudo nos sites dos fabricantes (Abit &#8211; placa mãe, nVidia &#8211; placa de vídeo). No Linux, o Ubuntu cuidou de tudo pra mim, embora possam existir problemas com o driver binário da nVidia (tentei fazer o upgrade para o 9 e não consegui).</p>
<p>No Linux, os únicos programas que tive problema foram os emuladores, que por precisarem de muita velocidade, tem partes que são feitas diretamente em Assembly (pra 32 bits), e por isso nem sempre compilam diretamente em 64 bits. Porém, existe sempre a possibilidade de se executar programas 32 bits, bastando ter as bibliotecas 32 bits que o programa necessita.</p>
<p>No Windows, até agora, não tive problema nenhum.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/personalizando-cflags-por-pacote-no-gentoo" title="Personalizando CFLAGS por pacote no Gentoo">Personalizando CFLAGS por pacote no Gentoo</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-de-sites-com-memcached" title="Otimização de sites com memcached">Otimização de sites com memcached</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/o-limite-de-4-ou-3-gb-de-memoria/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

