<?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>Bit a Bit &#187; Sistemas Operacionais</title>
	<atom:link href="http://www.bitabit.eng.br/categorias/academico/computacao-disciplinas/so-disciplinas/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bitabit.eng.br</link>
	<description>O Blog da Engenharia de Computação da POLI-USP</description>
	<lastBuildDate>Wed, 11 Jan 2012 16:12:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Dennis Ritchie, 1941 &#8211; 2011</title>
		<link>http://www.bitabit.eng.br/2011/10/13/dennisritchie/</link>
		<comments>http://www.bitabit.eng.br/2011/10/13/dennisritchie/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 11:44:46 +0000</pubDate>
		<dc:creator>Lucas &#34;Sugis&#34; Lago, Comp09</dc:creator>
				<category><![CDATA[Acadêmico]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[Sem9]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=2303</guid>
		<description><![CDATA[Mês triste esse outubro de 2011 hein? Dennis Ritchie é um pouco (ha-ha) menos conhecido que o Steve Jobs, mas merece uma página de destaque tão grande quanto Steve. Ritchie é reconhecido por duas grandes criações, que vivem até hoje e revolucionaram a computação. A linguagem de programação C e o sistema operacional UNIX. Vencedor [...]]]></description>
			<content:encoded><![CDATA[<p>Mês triste esse outubro de 2011 hein?</p>
<p>Dennis Ritchie é um pouco (ha-ha) menos conhecido que o Steve Jobs, mas merece uma página de destaque tão grande quanto Steve.</p>
<p> Ritchie é reconhecido por duas grandes criações, que vivem até hoje e revolucionaram a computação. A linguagem de programação C e o sistema operacional UNIX.</p>
<p>Vencedor do prêmio Turing em 1983 pelo seu trabalho com o UNIX. Sistema esse que continua sendo base para uma parte dos sistemas operacionais utilizados nos dias de hoje ( incluindo o MacOS do outro homenageado do mês ).</p>
<p>Tudo que posso dizer é que ele mudou a computação e agradecer por deixar um legado tão importante!</p>
<p>Valeu Ritchie! Break;</p>
<p style="padding-left: 30px;">&nbsp;</p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=2303&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2011/10/13/dennisritchie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Interrupção do x86, Minix e, de quebra, uma pitada de estouro de pilha</title>
		<link>http://www.bitabit.eng.br/2009/11/11/interrupcao-do-x86-minix-e-de-quebra-uma-pitada-de-estouro-de-pilha/</link>
		<comments>http://www.bitabit.eng.br/2009/11/11/interrupcao-do-x86-minix-e-de-quebra-uma-pitada-de-estouro-de-pilha/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 09:58:23 +0000</pubDate>
		<dc:creator>Eduardo Russo, Coop10</dc:creator>
				<category><![CDATA[Acadêmico]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Bochs]]></category>
		<category><![CDATA[estouro de pilha]]></category>
		<category><![CDATA[exceções]]></category>
		<category><![CDATA[idt]]></category>
		<category><![CDATA[interrupção de hardware]]></category>
		<category><![CDATA[Minix]]></category>
		<category><![CDATA[prezi]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[tabela de interrupção]]></category>
		<category><![CDATA[x86]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=430</guid>
		<description><![CDATA[Um dos trabalhos que tivemos (eu, o João Misko e o Rafael Medeiros) que fazer para a disciplina de Sistemas Operacionais foi sobre estouro de pilhas no Minix. Como e onde ocorria, e como era tratado. O grande salto quântico disso, era entender a tabela de interrupções do x86. Onde fica, para onde aponta e [...]]]></description>
			<content:encoded><![CDATA[<p>Um dos trabalhos que tivemos (eu, o João Misko e o Rafael Medeiros) que fazer para a <a href="http://www.pcs.usp.br/~jkinoshi/2009/so-09.txt" target="_blank">disciplina de Sistemas Operacionais</a> foi sobre estouro de pilhas no Minix. Como e onde ocorria, e como era tratado.</p>
<p>O grande salto quântico disso, era entender a tabela de interrupções do x86. Onde fica, para onde aponta e o que faz. Salto dado graças à imensa ajuda do <strong>Mestre Jorge Sabaliauskas</strong>! Se você não conhece o Jorjão, sinto muito!</p>
<h1>Tabela de interrupção</h1>
<p>Todo processador moderno possui uma tabela de interrupção (chamada de IDT &#8211; <em>Interrupt Description Table</em> &#8211; a partir daqui), que tem a função principal de executar uma determinada rotina (definida pelo SO) quando ocorre uma interrupção de hardware.</p>
<p>No x86, a tabela de interrupções é descrita conforme a tabela abaixo:</p>
<div id="attachment_769" class="wp-caption aligncenter" style="width: 547px"><img class="size-full wp-image-769" title="exception-and-interrupts" src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/exception-and-interrupts.png" alt="Tabela de exceções e interrupções retirada do manual &quot;IA32-System-Programming-3A.pdf&quot;, Vol 3 5-3, para ser mais exato" width="537" height="659" /><p class="wp-caption-text">Tabela de exceções e interrupções retirada do manual &quot;IA32-System-Programming-3A.pdf&quot;, Vol 3 5-3, para ser mais exato</p></div>
<p>Para entender um pouco melhor o que isso faz, usaremos o exemplo clássico da divisão por zero (não, não pode dividir por zero).</p>
<p>Sempre que algum programador tosco (como eu) solicitar uma divisão por zero (não pode mesmo!), o processador dá um berro e passa aponta o PC (<em>Program Counter</em> &#8211; o cara que aponta para o próximo trecho da memória a ser executado) para o endereço armazenado na posição zero da IDT.</p>
<p>A partir daí, o SO passa a tratar isso, inserindo o código de como quer tratar esse erro na posição apontada pela IDT.</p>
<h1><a href="http://pt.lostpedia.wikia.com/wiki/Live_Together,_Die_Alone" target="_blank">Use Bochs, die alone</a></h1>
<p>Antes de tudo, para conseguir encontrar o código apontado pela tabela de interrupção, você precisa usar o <a href="http://bochs.sourceforge.net/" target="_blank">Bochs</a> e com a versão de <em>debug</em>. Por que? Porque ele é um <a href="http://pt.wikipedia.org/wiki/Emulador" target="_blank">emulador</a> e não um <a href="http://pt.wikipedia.org/wiki/M%C3%A1quina_virtual" target="_blank">virtualizador</a>. Dessa forma, você consegue ver as chamadas feitas ao hardware e manipular coisas que você não conseguiria manipular num virtualizador ou num computador real.</p>
<p>Direto da Wikipedia: &#8220;Num emulador, todos os recursos do sistema são processados nele (SIC) ao contrário da virtualização (SIC) que é uma ponte entre o hardware nativo e as chamadas do sistema operacional.&#8221;</p>
<p>Recomendo o Bochs de Windows, já que ele já vem compilado em sua última versão. Testei tanto pra OS X através do <a href="http://bochs.darwinports.com/" target="_blank">DarwinPorts</a>, como pro Linux, mas a versão de Windows foi a que rodou mais tranquila. No Mac, o programa rodava extremamente lento, no Linux, tive diversos problemas durante a compilação para conseguir ativar o <em>debuger</em>. No Windows, foi só clicar duas vezes.</p>
<h1>Achando a IDT e vendo a interrupção</h1>
<p>Até então, vimos a parte teórica, relativamente fácil de entender&#8230; Conseguir achar isso na prática requer um pouco mais de paciência e ajuda do Jorjão (ou de um blog como esse, se você não conhece o Jorjão).</p>
<p>Para proteger o código apontado pela IDT, o x86 usa algumas artimanhas. Em vez de simplesmente apontar para o endereço da memória, ele utiliza uma base e um <em>offset.</em></p>
<p>Para explicar melhor isso, vou usar o exemplo do trabalho sobre estouro de pilhas que fiz, e mostrar na prática o endereço usado pelo x86. Você pode ver na tabela acima que <em>Stack-Segment Fault</em> encontra-se na <strong>12ª posição</strong> da IDT. Então pare a execução do Bochs (com CONTROL+C) e digite o seguinte na janela do do emulador (não na do sistema em andamento):</p>
<pre class="brush: plain; light: true; title: ; notranslate">info idt 0xc</pre>
<div id="attachment_771" class="wp-caption aligncenter" style="width: 679px"><img class="size-full wp-image-771" title="info-idt-0xc" src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/info-idt-0xc.png" alt="Saída do Bochs após o pedido de informação do IDT" width="669" height="338" /><p class="wp-caption-text">Saída do Bochs após o pedido de informação do IDT</p></div>
<p>Da resposta &#8220;<strong>Interrupt Gate target = 0&#215;30:0x4b4</strong>&#8221; tiraremos duas informações que nos levarão ao endereço real apontado pela IDT.</p>
<p>O &#8220;<strong>0&#215;30</strong>&#8221; é o <strong>16 bit segment selector</strong> e o &#8220;<strong>0x4b4</strong>&#8221; o <strong>offset</strong>.</p>
<p>O <strong>segmente selector</strong> é dividido conforme a figura abaixo:</p>
<p style="text-align: center;">
<div id="attachment_772" class="wp-caption aligncenter" style="width: 445px"><img class="size-full wp-image-772  " title="segment-selector" src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/segment-selector.png" alt="Divisão do segment selector" width="435" height="322" /><p class="wp-caption-text">Divisão do segment selector</p></div>
<p>Portanto, a informação que procuramos está no GDT, na posição 6 (se você não entende como 12 virou c e 110 virou 6, estude um pouco sobre bases <a href="http://pt.wikipedia.org/wiki/Sistema_hexadecimal" target="_blank">hexadecimal</a> e <a href="http://pt.wikipedia.org/wiki/Sistema_binário_(matemática)" target="_blank">binária</a>)</p>
<p>Passe agora o seguinte comando para o Bochs:</p>
<pre class="brush: plain; light: true; title: ; notranslate">info gdt 0x6</pre>
<div id="attachment_770" class="wp-caption aligncenter" style="width: 679px"><img class="size-full wp-image-770" title="info-gdt-0x6" src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/info-gdt-0x6.png" alt="Saída do Bochs após o pedido de informação do GDT (Global Description Table)" width="669" height="338" /><p class="wp-caption-text">Saída do Bochs após o pedido de informação do GDT (Global Description Table)</p></div>
<p>O valor &#8220;<strong>0&#215;1000</strong>&#8221; é o <strong>linear address</strong>, que usaremos junto ao <strong>offset</strong> para encontrar o endereço real de onde fica a rotina de interrupção.</p>
<p>Se você tiver um interesse masoquista por conhecimento, pode entender todas essas siglas e posições lendo os manuais da Intel que <a href="http://www.intel.com/products/processor/manuals/" target="_blank">encontram-se aqui</a>. É nele que toda essa loucura de proteção do endereço real é explicada.</p>
<p>Finalmente, com <strong>linear addres</strong> + <strong>offset</strong>, temos o endereço real, que é <strong>0x14b4</strong>.</p>
<p>Para confirmar isso, digite o seguinte na janela de emulação do Bochs:</p>
<pre class="brush: plain; light: true; title: ; notranslate">u 0x14b4</pre>
<div id="attachment_773" class="wp-caption aligncenter" style="width: 679px"><img class="size-full wp-image-773" title="u-0x14b4" src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/u-0x14b4.png" alt="Saída do Bochs após o pedido de informação do endereço 0x14b4" width="669" height="338" /><p class="wp-caption-text">Saída do Bochs após o pedido de informação do endereço 0x14b4</p></div>
<p>A resposta é que na posição &#8220;<strong>0x14b4</strong>&#8220;, encontra-se <strong>&#8220;push 0x0c&#8221;</strong> em <em>assembly</em>. Para confirmar que esse é o início da rotina de interrupção de estouro de pilha do Minix, temos que olhar para dois arquivos:</p>
<p><strong>kernel/mpx386.s</strong> e <strong>kernel/protect.h</strong></p>
<p>No primeiro, na linha 457, vemos o seguinte comando em assembly: <strong>push STACK_FAULT_VECTOR</strong> e no segundo, na linha 58, <strong>#define STACK_FAULT_VECTOR  12<strong> </strong><strong> </strong></strong>.</p>
<p>Juntando tudo, verificamos que estamos exatamente na posição de início do código que o Minix executará caso uma interrupção de estouro de pilha ocorra.</p>
<p>Se você quiser brincar um pouco e ver uma interrupção ocorrendo, pode inserir uma pausa no Bochs usando:</p>
<pre class="brush: plain; light: true; title: ; notranslate">b 0x14b4</pre>
<p>Com isso, caso PC aponte para 0x14b4, o emulador será pausado.</p>
<p>Agora faça um programa eternamente recursivo como o abaixo para ver a interrupção ocorrendo:</p>
<pre class="brush: cpp; title: ; notranslate">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
void meChama(int i){
	printf(&quot;iteracao %d\n&quot;, i++);
	meChama(i);
}

int main (int argc, const char * argv[]) {
	printf(&quot;iteracao 1\n&quot;);
	meChama(1);
	return 0;
}</pre>
<p><a href="http://coop10.wordpress.com/2009/05/12/como-compilar-programa-em-c-no-minix/" target="_blank">Salve, compile, execute</a> e veja a mágica.</p>
<div id="attachment_768" class="wp-caption aligncenter" style="width: 679px"><img class="size-full wp-image-768" title="breakpoint-em-acao" src="http://www.bitabit.eng.br/wp-content/uploads/2009/11/breakpoint-em-acao.png" alt="Breackpoint em 0x14b4 mostrando sua mágica" width="669" height="338" /><p class="wp-caption-text">Breackpoint em 0x14b4 mostrando sua mágica</p></div>
<p>A imagem acima mostra o exato momento em que o código que trata a interrupção de estouro de pilha começa a ser executado. Isso ocorre no momento em que o programa recursivo começaria a destruir toda sua memória e o processador (no caso, o emulador do processador) grita &#8220;PARA TUDO!!!&#8221; pro Minix e este passa a lidar com a bucha!</p>
<p>Tudo isso pode ser visto também <a href="http://prezi.com/qynywmzf-ag5/view" target="_blank">nessa apresentação</a> do <a href="http://prezi.com" target="_blank">Prezi</a> que fizemos sobre estouro de pilha, mas que dependeu do entendimento da IDT e de todo o caminho tortuoso para achar o endereço real apontado por ela.</p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=430&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2009/11/11/interrupcao-do-x86-minix-e-de-quebra-uma-pitada-de-estouro-de-pilha/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tutorial definitivo para recompilar o Minix 3</title>
		<link>http://www.bitabit.eng.br/2009/10/24/tutorial-definitivo-para-recompilar-o-minix-3/</link>
		<comments>http://www.bitabit.eng.br/2009/10/24/tutorial-definitivo-para-recompilar-o-minix-3/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 09:53:48 +0000</pubDate>
		<dc:creator>Eduardo Russo, Coop10</dc:creator>
				<category><![CDATA[Acadêmico]]></category>
		<category><![CDATA[Computação]]></category>
		<category><![CDATA[Coop10]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[compilação]]></category>
		<category><![CDATA[Minix]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.bitabit.eng.br/?p=198</guid>
		<description><![CDATA[Estudando sistemas operacionais, provavelmente você terá que recompilar seu código fonte várias vezes. Esse tutorial explica como fazer isso e garantir que tudo que você fez funcione. O primeiro passo, é editar o código. Para isso, você pode transferir os &#8220;.c&#8221; via FTP, alterar em outro SO ou, a maneira mais simples, que explicarei aqui, [...]]]></description>
			<content:encoded><![CDATA[<p>Estudando sistemas operacionais, provavelmente você terá que recompilar seu código fonte várias vezes. Esse tutorial explica como fazer isso e garantir que tudo que você fez funcione.</p>
<p>O primeiro passo, é editar o código. Para isso, você pode transferir os &#8220;.c&#8221; via FTP, alterar em outro SO ou, a maneira mais simples, que explicarei aqui, editar no próprio Minix.</p>
<p>No exemplo, vamos alterar a mensagem de boas vindas do Minix.</p>
<pre class="brush: plain; light: true; title: ; notranslate">cd /usr/src/kernel
cp main.c main.c.back
elle main.c</pre>
<p>Isso criará um backup do main.c, caso você faça alguma besteira e abrirá o programa Elle (um editor básico, mas que dá pro gasto) com o main.c.</p>
<p>Agora vá na parte que tem a mensagem de boas vindas (Copyright&#8230;..) e altere o código. Eu alterei para &#8220;By Russo &#8211; Sao Paulo &#8211; Brasil &#8211; 2009&#8243;.</p>
<p>Aperte <strong>CONTROL+W</strong> para salvar o arquivo e depois <strong>CONTROL+S</strong> para sair do Elle.</p>
<p>Agora digite</p>
<pre class="brush: plain; light: true; title: ; notranslate">cd /usr/src
make clean
make install</pre>
<p><strong>edit</strong>: ou digite:</p>
<pre class="brush: plain; light: true; title: ; notranslate">cd /usr/src/tools/
make hdboot</pre>
<p>Depois que terminar a recompilação, basta reiniciar o Minix com</p>
<pre class="brush: plain; light: true; title: ; notranslate">reboot</pre>
<p>Pode acontecer disso simplesmente não funcionar, aí entra a segunda parte desse tutorial.</p>
<h1>Alternando entre as recompilações</h1>
<p>Depois de MUITO apanhar com recompilações e mais recompilações do <a href="http://www.minix3.org/" target="_blank">Minix</a>, com resultados alternados de funcionamento, testes e mais testes com <a href="http://www.virtualbox.org/" target="_blank">VirtualBox</a>, <a href="http://www.vmware.com/products/fusion/" target="_blank">VMware Fusion</a> (que insiste em dar um <em>kernel</em> <em>panic</em> no Mac OSX cada vez que dou um <em>boot</em> no Minix), <a href="http://www.parallels.com/" target="_blank">Parallels Desktop</a> e <a href="http://www.kju-app.org/" target="_blank">Q</a> (versão do <a href="http://www.qemu.org/" target="_blank">QEMU</a> pro OSX), consegui entender o que acontece e como fazer uma compilação do <em>kernel</em> funcionar corretamente!</p>
<div id="attachment_268" class="wp-caption aligncenter" style="width: 624px"><img class="size-full wp-image-268" title="VMware causando kernel panic" src="http://www.bitabit.eng.br/wp-content/uploads/2009/10/VMware-causando-kernel-panic.jpg" alt="VMware tirando um sarro da minha cara" width="614" height="460" /><p class="wp-caption-text">VMware tirando um sarro da minha cara</p></div>
<p>Acabei decidindo por utilizar o VirtualBox 3.0. Pesquisei que nem um condenado pelo mundo virtual e descobri que cada vez que o código é recompilado é gerado uma nova versão do <em>kernel</em>. O grande mistério que fica sem resposta é: por que às vezes ele reinicia com o <em>kernel</em> recém compilado e às vezes não?</p>
<p>Enfim, digite</p>
<pre class="brush: plain; light: true; title: ; notranslate">ls /boot/image</pre>
<p>Isso mostrará todas aquelas 300 vezes que você compilou o <em>kernel</em> para tentar alterar a &#8220;<a href="http://www.youtube.com/watch?v=n96GWy67C9E" target="_blank">disgrama</a>&#8221; da tela de <em>login</em>!</p>
<div id="attachment_269" class="wp-caption aligncenter" style="width: 490px"><img class="size-full wp-image-269" title="versões das compilações" src="http://www.bitabit.eng.br/wp-content/uploads/2009/10/versões-das-compilações.png" alt="Versões das recompilações" width="480" height="314" /><p class="wp-caption-text">Versões das recompilações</p></div>
<p>Pode-se observar que recompilei o <em>kernel</em> três vezes (com a mesma alteração estúpida de teste), já que a primeira versão é a original.</p>
<p>Para utilizar uma dessas versões (no exemplo, vou usar a 3.1.3ar4), você deve digitar</p>
<pre class="brush: plain; light: true; title: ; notranslate">#shutdown
image=/boot/image/3.1.3ar4
boot</pre>
<p>Isso irá reiniciar o Minix com as alterações feitas em cada uma das versões. Além de resolver o problema de recompilações que aparentemente não funcionam, permite que você volte a versões pré-cagada!</p>
<div id="attachment_270" class="wp-caption aligncenter" style="width: 786px"><img class="size-full wp-image-270" title="kernel do Minix alterado" src="http://www.bitabit.eng.br/wp-content/uploads/2009/10/kernel-do-Minix-alterado.png" alt="Antes e depois de trocar o kernel em uso" width="776" height="254" /><p class="wp-caption-text">Antes e depois de trocar o kernel em uso</p></div>
<p>No caso de dar caca, basta, na hora que o Minix te dá 3 opções (antes do <em>boot</em>) pressionar esc. Dessa forma, você tem a opção de escolher qual versão bootar.</p>
<p>Mas&#8230; se der caca numa alteração de driver&#8230; se danou! Faça backups com a maquina virtual para esses casos, já que <a href="http://pt.wikipedia.org/wiki/Micro-kernel" target="_blank">mudanças nos drivers não tem nada a ver com o kernel do Minix</a> e não adianta voltar atrás.</p>
<img src="http://www.bitabit.eng.br/?ak_action=api_record_view&id=198&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.bitabit.eng.br/2009/10/24/tutorial-definitivo-para-recompilar-o-minix-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

