<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>.::Escovando Bits::. &#187; kernel</title>
	<atom:link href="http://escovandobits.wordpress.com/tag/kernel/feed/" rel="self" type="application/rss+xml" />
	<link>http://escovandobits.wordpress.com</link>
	<description>Programação, Linux, tecnologia da informação, dicas, artigos</description>
	<lastBuildDate>Sun, 05 Jul 2009 15:42:47 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='escovandobits.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/ac8d2c79730f1bc1a6ebab006a3670da?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>.::Escovando Bits::. &#187; kernel</title>
		<link>http://escovandobits.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://escovandobits.wordpress.com/osd.xml" title=".::Escovando Bits::." />
		<item>
		<title>Exemplos do uso syscalls (x86) do Linux</title>
		<link>http://escovandobits.wordpress.com/2009/01/21/exemplos-do-uso-syscalls-x86-do-linux/</link>
		<comments>http://escovandobits.wordpress.com/2009/01/21/exemplos-do-uso-syscalls-x86-do-linux/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 00:36:35 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[glibc]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[syscalls]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=253</guid>
		<description><![CDATA[Hoje tive uma idéia ao ler um artigo intitulado How Compiling Works no qual o autor descreve em linhas gerais, mas de uma maneira interessante, o processo de compilação de um código escrito em C (abordando  o processo de linkagem com as bibliotecas) tomando como exemplo a função printf. Resolvi fazer uma brincadeira, mostrando como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=253&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Hoje tive uma idéia ao ler um artigo intitulado <a href="http://markuskimius.wikidot.com/programming:explain:compiling" target="_self">How Compiling Works</a> no qual o autor descreve em linhas gerais, mas de uma maneira interessante, o processo de compilação de um código escrito em C (abordando  o processo de <em>linkagem</em> com as bibliotecas) tomando como exemplo a função <a href="http://linux.die.net/man/3/printf" target="_blank">printf</a>. Resolvi fazer uma brincadeira, mostrando como isso pode ser realmente implementado na prática, usando chamadas de sistema (<em>syscalls</em>) do <a href="http://www.kernel.org" target="_blank">Linux</a>, de modo que não seja necessário usar a implementação disponível na <a href="www.gnu.org/software/libc/" target="_blank">glibc</a>.</p>
<p style="text-align:justify;"><span id="more-253"></span></p>
<p style="text-align:justify;">Começando com um exemplo simples, bem parecido com que todo mundo que um dia pensou em programar já viu.  A diferença que a função printf será modificada para receber apenas caracteres (não variáveis) e a quantidade.</p>
<pre><span style="color:#006e28;">#include "stdio.h"</span>
<span style="color:#0057ae;">int</span><span style="color:#141312;"> main() {</span>

<span style="color:#141312;">	printf(</span><span style="color:#bf0303;">"Hello, world!</span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">"</span><span style="color:#141312;">,</span><span style="color:#b08000;">15</span><span style="color:#141312;">);</span>
<span style="color:#141312;">	<strong>return</strong> </span><span style="color:#b08000;">0</span><span style="color:#141312;">;</span>
<span style="color:#141312;">}</span></pre>
<p style="text-align:justify;">Reparem que o cabeçalho está entre aspas, indicando ao compilador que vamos usar uma implementação particular e <strong>não</strong> a implementação da glibc, no meu caso os arquivos</p>
<ul>
<li>/usr/include/stdio.h (protótipo)</li>
<li>/usr/lib/libc.so  (implementação)</li>
</ul>
<p>Serão substituidos pelos arquivos <span style="text-decoration:underline;">stdio.h</span> e <span style="text-decoration:underline;">stdio.c</span> abaixo:</p>
<pre style="text-align:justify;"><span style="color:#006e28;">#ifndef STDIO_H_</span>
<span style="color:#006e28;">#define STDIO_H_</span>

<span style="color:#0057ae;">int</span><span style="color:#141312;"> printf(</span><span style="color:#0057ae;">char</span><span style="color:#141312;">* texto, </span><span style="color:#0057ae;">int</span><span style="color:#141312;"> tam);</span>

<span style="color:#006e28;">#endif </span><span style="color:#888786;"><em>/* STDIO_H_ */</em></span></pre>
<p style="text-align:justify;">Agora que temos o protótipo da função printf() que é diferente da função printf() que conhecemos mas servirá para esse primeiro exemplo:</p>
<pre style="text-align:justify;"><span style="color:#006e28;">#include "stdio.h"</span>

<span style="color:#0057ae;">int</span><span style="color:#141312;"> printf(</span><span style="color:#0057ae;">char</span><span style="color:#141312;">* texto, </span><span style="color:#0057ae;">int</span><span style="color:#141312;"> tam)</span>

<span style="color:#141312;">{</span>
<span style="color:#141312;">__asm__ (</span><span style="color:#bf0303;">"movl $0x4,%%eax; \</span>
<span style="color:#bf0303;">          movl $0x1,%%ebx; \</span>
<span style="color:#bf0303;">          movl %0,%%ecx; \</span>
<span style="color:#bf0303;">          movl %1,%%edx; \</span>
<span style="color:#bf0303;">          int $0x80"</span><span style="color:#141312;">: : </span><span style="color:#bf0303;">"g"</span><span style="color:#141312;"> (texto) , </span><span style="color:#bf0303;">"g"</span><span style="color:#141312;"> (tam) );</span>

<span style="color:#141312;">  <strong>return</strong> </span><span style="color:#b08000;">0</span><span style="color:#141312;">;</span>
<span style="color:#141312;">}</span></pre>
<p style="text-align:justify;">Podemos incrementar um pouco mais do código em <em>assembly</em>, para não precisar estipular o número de caracteres.</p>
<pre><span style="color:#141312;">__asm__ (</span><span style="color:#bf0303;">"      xorl %%edx,%%edx; \</span>
<span style="color:#bf0303;">                xorl %%eax,%%eax; \</span>

<span style="color:#bf0303;">                movl %0,%%ecx; \</span>
<span style="color:#bf0303;">        loop:   movb (%%ecx,%%edx),%%al; \</span>
<span style="color:#bf0303;">                incl %%edx; \</span>
<span style="color:#bf0303;">                test %%al,%%al; \</span>
<span style="color:#bf0303;">                jnz loop; \</span>
<span style="color:#bf0303;">                decl %%edx; \</span>

<span style="color:#bf0303;">                movl $0x4,%%eax; \</span>
<span style="color:#bf0303;">                movl $0x1,%%ebx; \</span>
<span style="color:#bf0303;">                int $0x80"</span><span style="color:#141312;">: : </span><span style="color:#bf0303;">"g"</span><span style="color:#141312;"> (texto));</span></pre>
<p>Para fazer uma função equivalente ao printf() da glibc precisaríamos implementar o suporte a <a href="http://linux.die.net/man/3/va_arg" target="_blank">múltiplos argumentos</a> e mais um monte de coisas <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Fiz um esboço de uma idéia do printf, mas ainda usando funções da glibc apenas implementando a <em>syscall write.<br />
</em></p>
<pre><span style="color:#006e28;">#include &lt;stdlib.h&gt;</span>
<span style="color:#006e28;">#include &lt;stdarg.h&gt;</span>
<span style="color:#006e28;">#include &lt;string.h&gt;</span>

<span style="color:#006e28;">#define _write(texto, d) </span>
<span style="color:#141312;">__asm__ (</span><span style="color:#bf0303;">"movl $0x4,%%eax; \</span>
<span style="color:#bf0303;">	  movl $0x1,%%ebx; \</span>
<span style="color:#bf0303;">	  movl %0,%%ecx; \</span>
<span style="color:#bf0303;">	  movl %1,%%edx; \</span>

<span style="color:#bf0303;">	  int $0x80"</span><span style="color:#141312;">: : </span><span style="color:#bf0303;">"g"</span><span style="color:#141312;"> (texto) , </span><span style="color:#bf0303;">"g"</span><span style="color:#141312;"> (d) );</span>

<span style="color:#0057ae;">int</span><span style="color:#141312;"> write(</span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *fmt, ...);</span>

<span style="color:#0057ae;">int</span><span style="color:#141312;"> main(){</span>

<span style="color:#141312;">	</span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *index=malloc(</span><span style="color:#b08000;">2</span><span style="color:#141312;">);</span>
<span style="color:#141312;">	</span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *nome=malloc(</span><span style="color:#b08000;">20</span><span style="color:#141312;">);</span>

<span style="color:#141312;">	strcpy(index,</span><span style="color:#bf0303;">"19"</span><span style="color:#141312;">);</span>
<span style="color:#141312;">	strcpy(nome,</span><span style="color:#bf0303;">"Escovando Bits !!!"</span><span style="color:#141312;">);</span>

<span style="color:#141312;">	write(</span><span style="color:#bf0303;">"blog: %s </span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">index: %s</span><span style="color:#ff80e0;">\n</span><span style="color:#bf0303;">"</span><span style="color:#141312;">,nome,index);</span>

<span style="color:#141312;">	<strong>return</strong> </span><span style="color:#b08000;">0</span><span style="color:#141312;">;</span>
<span style="color:#141312;">}</span>

<span style="color:#0057ae;">int</span><span style="color:#141312;"> write(</span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *fmt, ...) {</span>

<span style="color:#141312;">	</span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *s;</span>
<span style="color:#141312;">	va_list ap;</span>
<span style="color:#141312;">	</span><span style="color:#0057ae;">register</span><span style="color:#141312;"> </span><span style="color:#0057ae;">int</span><span style="color:#141312;"> d=</span><span style="color:#b08000;">0</span><span style="color:#141312;">,tam;</span>

<span style="color:#141312;">	</span><span style="color:#0057ae;">int</span><span style="color:#141312;"> size;</span>

<span style="color:#141312;">	va_start(ap, fmt );</span>
<span style="color:#141312;">	tam = strlen(fmt);</span>

<span style="color:#141312;">	<strong>for</strong> (d=</span><span style="color:#b08000;">0</span><span style="color:#141312;">; d&lt;tam; d++, *++fmt) {</span>

<span style="color:#141312;">		<strong>if</strong> (*fmt != </span><span style="color:#ff80e0;">'%'</span><span style="color:#141312;"> ) {</span>

<span style="color:#141312;">		_write(fmt,</span><span style="color:#b08000;">1</span><span style="color:#141312;">);</span>
<span style="color:#141312;">		} <strong>else</strong> {</span>

<span style="color:#141312;">			<strong>switch</strong> (*++fmt) {</span>
<span style="color:#141312;">			<strong>case</strong> </span><span style="color:#ff80e0;">'s'</span><span style="color:#141312;">: {</span>
<span style="color:#141312;">				s = va_arg(ap, </span><span style="color:#0057ae;">char</span><span style="color:#141312;"> *);</span>

<span style="color:#141312;">				size = strlen(s);</span>
<span style="color:#141312;">				_write(s,size);</span>
<span style="color:#141312;">			<strong>break</strong>;</span>
<span style="color:#141312;">			} </span><span style="color:#888786;"><em>// fim case</em></span>
<span style="color:#141312;">			} </span><span style="color:#888786;"><em>// fim switch</em></span>

<span style="color:#141312;">		} </span><span style="color:#888786;"><em>// fim else</em></span>
<span style="color:#141312;">	} </span><span style="color:#888786;"><em>// fim for</em></span>

<span style="color:#141312;">	va_end(ap);</span>
<span style="color:#141312;">	<strong>return</strong>(</span><span style="color:#b08000;">1</span><span style="color:#141312;">);</span>
<span style="color:#141312;">}</span></pre>
<p style="text-align:justify;">Se analisarmos o código-fonte da glibc veremos que sua implementação é completamente diferente da proposta nesse <em>post</em>, por questões de portabilidade de <em>hardware</em>, segurança, elegância, desempenho, etc;  Um <a href="http://www.gnu.org/software/libtool/manual/libc/Printf-Extension-Example.html#Printf-Extension-Example" target="_blank">exemplo</a> é a possiblidade de criar extensões para a função printf.</p>
<p style="text-align:justify;">Bom, essa foi a primeira entrada do ano aqui no <a href="http://escovandobits.wordpress.com" target="_blank">EscovandoBits</a>,  mais novidades para os próximos dias, com a cobertura do Mauro sobre a Campus Party que acontece do dia 19 a 25 de Janeiro.</p>
<p style="text-align:justify;">
Posted in programação Tagged: c, glibc, kernel, Linux, syscalls <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/253/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/253/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/253/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=253&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2009/01/21/exemplos-do-uso-syscalls-x86-do-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
		<item>
		<title>Lguest: um hypervisor didático</title>
		<link>http://escovandobits.wordpress.com/2008/10/27/lguest-um-hypervisor-didatico/</link>
		<comments>http://escovandobits.wordpress.com/2008/10/27/lguest-um-hypervisor-didatico/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 22:19:29 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[lguest]]></category>
		<category><![CDATA[virtualização]]></category>

		<guid isPermaLink="false">http://escovandobits.wordpress.com/?p=40</guid>
		<description><![CDATA[&#8220;If unsure, say N. If curious, say M. If masochistic, say Y &#8220;
(Linux kernel config for lguest module)
Um hypervisor é uma máquina virtual monitora (virtual machine monitor) que possibilita executar diversos sistemas operacionais em uma mesma máquina. Isso significa que você pode executar o Windows e o OpenBSD em máquinas virtuais executando em cima do [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=40&subd=escovandobits&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p align="right"><em>&#8220;If unsure, say N. If curious, say M. If masochistic, say Y &#8220;</em></p>
<p align="right">(Linux kernel config for lguest module)</p>
<p align="justify">Um hypervisor é uma máquina virtual monitora (<em>virtual machine monitor</em>) que possibilita executar diversos sistemas operacionais em uma mesma máquina. Isso significa que você pode executar o <a href="http://www.microsoft.com/windows/" target="_blank">Windows</a> e o <a href="http://www.openbsd.org" target="_blank">OpenBSD</a> em máquinas virtuais executando em cima do Gentoo, Fedora, ou outra plataforma GNU/<a href="http://www.kernel.org">Linux</a>.</p>
<p align="justify"><span id="more-40"></span></p>
<p align="justify"><strong>Exemplos</strong></p>
<p align="justify">No kernel existem pelo menos 8 sistema de virtualização distintos: Xen, KVM, VMWares&#8217;s VMI, IBM&#8217;s System p, IBM&#8217;s System z, User Mode Linux, lguest e IBM&#8217;s legacy iSeries.</p>
<p><strong>O que é o lguest ?</strong></p>
<p align="justify">O projeto <strong>lguest</strong>, desenvolvido por <a title="Rusty Russel " href="http://ozlabs.org/~rusty/" target="_blank">Rusty Russel</a>, do <a href="http://www.netfilter.org" target="_blank">iptables</a>, <strong>é um projeto simples de virtualização.</strong> Este permite a virtualização completa de <em>kernels</em>. Atualmente, apenas o kernel Linux é suportado como convidado (<em>guest</em>) e somente em hardware x86 (32bits).</p>
<p align="justify"><strong>Utilização: instalação</strong></p>
<p align="justify">A primeira coisa a fazer é ler a documentação oficial <a href="http://lguest.ozlabs.org/lguest.txt">lguest.txt</a>. Não se esqueça de ativar o .config as seguintes opções:</p>
<blockquote>
<pre><span style="color:#ffcc99;">.</span>
CONFIG_EXPERIMENTAL=y
CONFIG_PARAVIRT=y
CONFIG_LGUEST_GUEST=y
CONFIG_HIGHMEM64G=n
CONFIG_PHYSICAL_ALIGN=0x100000
CONFIG_VIRTIO_BLK=m
CONFIG_VIRTIO_NET=m
CONFIG_TUN=m
CONFIG_LGUEST=m</pre>
</blockquote>
<p><strong>Utilização: executando</strong></p>
<p style="text-align:justify;">Depois de compilar o kernel, carrege os módulos<strong> lg</strong> e <strong>tun</strong> e dê um <strong>make</strong> dentro do diretório <em>Documentation/lguest/</em> para compilar uma ferramenta chamada lguest que será utilzada para iniciar o lguest. Depois para rodar:</p>
<blockquote><p>Documentation/lguest/lguest 128 vmlinux &#8211;tunnet=192.168.254.10 &#8211;block=<a href="http://xm-test.xensource.com/ramdisks/initrd-1.1-i386.img" target="_blank"><span style="color:#ff0000;">rootfile</span></a> root=/dev/vda</p></blockquote>
<p>Algumas explicações:</p>
<ul>
<li><strong>vmlinux</strong>: a imagem do kernel (pode-se utilizar também o bzImage)</li>
<li><strong>rootfile</strong>: Para ter o mínimo de usabilidade, você precisa testar o kernel em cima de algum sistema de arquivos. Uma maneira rápida para testar é usar um <em>ramdisk</em>, clique no rootfile acima para baixar a imagem a substitua pelo nome do arquivo (initrd-1.1-i386.img).</li>
<li><strong>tunnet</strong>: configura um dispositivo &#8220;tap&#8221;</li>
<li><strong>root</strong>=/dev/vda parâmetros do kernel (pode ser qualquer opção compatível como parâmetro do kernel)</li>
</ul>
<p style="text-align:justify;">Na documentação há ensinado como utilizar uma distribuição (a partir de uma ISO) com o qemu para trabalhos mais sérios.</p>
<p><strong>Dica: acesso via NFS</strong></p>
<p style="text-align:justify;">Em vez de ficar criando uma imagem ou mesmo usando o qemu eu acho que é mais rápido montar uma partição via NFS e usá-la para acessar os arquivos.</p>
<blockquote><p>Documentation/lguest/lguest &#8211;tunnet=&lt;target-ip&gt; vmlinux ip=&lt;target-ip&gt;:&lt;server-ip&gt;:&lt;gateway-ip&gt;:&lt;netmask&gt;:&lt;hostname&gt;:&lt;device&gt;:&lt;PROTO&gt; nfsroot=&lt;server-ip&gt;:/caminho/para/rootfs root=/dev/nfs</p></blockquote>
<p>No meu caso eu uso uma variação nos pacotes do <a href="ftp://ftp.las.ic.unicamp.br/pub/gentoo/releases/x86/2008.0/stages/stage3-x86-2008.0.tar.bz2" target="_blank">stage3</a> do <a href="http://www.gentoo.org">Gentoo</a>.</p>
<p style="text-align:justify;"><strong>E o didático dessa história?</strong></p>
<p style="text-align:justify;">O lguest possui um <em>Quest</em> (dividido em 7 partes) bem interessante para quem quer entender o funcionamento de um virtualizador vendo o &#8220;código&#8221;, acessem do diretório <strong>drivers/lguest/README</strong> no código-fonte do kernel para saber como começar.</p>
<p style="text-align:justify;">
<p style="text-align:justify;">
<p><strong>Referências</strong></p>
<p><a href="http://lguest.ozlabs.org/">http://lguest.ozlabs.org/</a></p>
<p><a href="http://en.wikipedia.org/wiki/Hypervisor">http://en.wikipedia.org/wiki/Hypervisor</a></p>
<p><a href="http://lwn.net/Articles/218766/">http://lwn.net/Articles/218766/</a></p>
Posted in Linux Tagged: kernel, lguest, Linux, virtualização <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/escovandobits.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/escovandobits.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/escovandobits.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/escovandobits.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/escovandobits.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/escovandobits.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/escovandobits.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/escovandobits.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/escovandobits.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/escovandobits.wordpress.com/40/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=escovandobits.wordpress.com&blog=2186857&post=40&subd=escovandobits&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://escovandobits.wordpress.com/2008/10/27/lguest-um-hypervisor-didatico/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f615d34c675bc325d78631c8077f0187?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Tiago Maluta</media:title>
		</media:content>
	</item>
	</channel>
</rss>