Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 Sep 2018 19:52:43 +0000 (UTC)
From:      Edson Brandi <ebrandi@FreeBSD.org>
To:        doc-committers@freebsd.org, svn-doc-all@freebsd.org, svn-doc-head@freebsd.org
Subject:   svn commit: r52268 - in head/pt_BR.ISO8859-1/articles: . geom-class
Message-ID:  <201809161952.w8GJqhtG037216@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ebrandi
Date: Sun Sep 16 19:52:43 2018
New Revision: 52268
URL: https://svnweb.freebsd.org/changeset/doc/52268

Log:
  pt_BR.ISO8859-1/articles/geom-class: New pt_BR translation into .po format
  
  * content synchronized with en_US document (rev 48489)
  * article.xml converted to .po
  * .po file was translated to pt_BR
  * .po and .xml file has been set to UTF-8 encoding
  * information about volunteers who translated and/or revised the document was added to the header of the .po file
  
  Approved by: gabor (mentor, implicit)
  Obtained from: The FreeBSD Brazilian Portuguese Documentation Project

Added:
  head/pt_BR.ISO8859-1/articles/geom-class/
  head/pt_BR.ISO8859-1/articles/geom-class/Makefile   (contents, props changed)
  head/pt_BR.ISO8859-1/articles/geom-class/article.xml   (contents, props changed)
  head/pt_BR.ISO8859-1/articles/geom-class/pt_BR.po   (contents, props changed)
Modified:
  head/pt_BR.ISO8859-1/articles/Makefile

Modified: head/pt_BR.ISO8859-1/articles/Makefile
==============================================================================
--- head/pt_BR.ISO8859-1/articles/Makefile	Sun Sep 16 18:03:42 2018	(r52267)
+++ head/pt_BR.ISO8859-1/articles/Makefile	Sun Sep 16 19:52:43 2018	(r52268)
@@ -14,6 +14,7 @@ SUBDIR+= filtering-bridges
 SUBDIR+= fonts
 SUBDIR+= freebsd-questions
 SUBDIR+= freebsd-update-server
+SUBDIR+= geom-class
 SUBDIR+= gjournal-desktop
 SUBDIR+= hubs
 SUBDIR+= ipsec-must

Added: head/pt_BR.ISO8859-1/articles/geom-class/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/pt_BR.ISO8859-1/articles/geom-class/Makefile	Sun Sep 16 19:52:43 2018	(r52268)
@@ -0,0 +1,24 @@
+#
+# The FreeBSD Documentation Project
+# The FreeBSD Brazilian Portuguese Documentation Project
+#
+# $FreeBSD$
+#
+# Article: GEOM Class
+
+MAINTAINER=ebrandi@FreeBSD.org
+
+DOC?= article
+
+FORMATS?= html html-split
+WITH_ARTICLE_TOC?= YES
+
+INSTALL_COMPRESSED?= gz
+INSTALL_ONLY_COMPRESSED?=
+
+SRCS=	article.xml
+
+URL_RELPREFIX?=	../../../..
+DOC_PREFIX?=	${.CURDIR}/../../..
+
+.include "${DOC_PREFIX}/share/mk/doc.project.mk"

Added: head/pt_BR.ISO8859-1/articles/geom-class/article.xml
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/pt_BR.ISO8859-1/articles/geom-class/article.xml	Sun Sep 16 19:52:43 2018	(r52268)
@@ -0,0 +1,474 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN" "http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd">;
+<article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:its="http://www.w3.org/2005/11/its" version="5.0" xml:lang="pt_BR">
+  <info>
+    <title>Escrevendo uma classe GEOM</title>
+
+    <authorgroup>
+      <author><personname> <firstname>Ivan</firstname> <surname>Voras</surname> </personname> <affiliation> <address>
+	    <email>ivoras@FreeBSD.org</email>
+	  </address> </affiliation></author>
+    </authorgroup>
+
+    <legalnotice xml:id="trademarks" role="trademarks">
+      <para>FreeBSD is a registered trademark of the FreeBSD Foundation.</para>
+      <para>Intel, Celeron, Centrino, Core, EtherExpress, i386, i486, Itanium, Pentium, and Xeon are trademarks or registered trademarks of Intel Corporation or its subsidiaries in the United States and other countries.</para>
+      <para>Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this document, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the <quote>™</quote> or the <quote>®</quote> symbol.</para>
+    </legalnotice>
+
+    <pubdate>$FreeBSD$</pubdate>
+
+    <releaseinfo>$FreeBSD$</releaseinfo>
+
+    <abstract>
+      <para>Este texto documenta alguns pontos de partida no desenvolvimento de classes GEOM e módulos do kernel em geral. Supõe-se que o leitor esteja familiarizado com a programação C do userland.</para>
+    </abstract>
+  </info>
+
+<!-- Introduction -->
+  <sect1 xml:id="intro">
+    <title>Introdução</title>
+
+    <sect2 xml:id="intro-docs">
+      <title>Documentação</title>
+
+      <para>A documentação sobre programação do kernel é escassa - é uma das poucas áreas na qual não há quase nada de tutoriais amigáveis, e a frase <quote>usa a fonte!</quote> realmente é verdadeira. No entanto, existem alguns pedaços (alguns deles seriamente desatualizados) flutuando por ai e que devem ser estudados antes de começar a codificar:</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para>O <link xlink:href="@@URL_RELPREFIX@@/doc/en_US.ISO8859-1/books/developers-handbook/index.html">Manual do Desenvolvedor do FreeBSD</link> - parte do projeto de documentação, ele não contém nenhum informação específica para a programação do kernel, mas possui algumas informações gerais úteis.</para>
+	</listitem>
+
+	<listitem>
+	  <para>O <link xlink:href="@@URL_RELPREFIX@@/doc/en_US.ISO8859-1/books/arch-handbook/index.html">Manual de Arquitetura do FreeBSD</link> - também do projeto de documentação, contém descrições de várias instalações e procedimentos de baixo nível. O capítulo mais importante é o 13, <link xlink:href="@@URL_RELPREFIX@@/doc/en_US.ISO8859-1/books/arch-handbook/driverbasics.html">Escrevendo drivers de dispositivo FreeBSD</link>.</para>
+	</listitem>
+
+	<listitem>
+	  <para>A seção Blueprints do site do <link xlink:href="http://www.freebsddiary.org">FreeBSD Diary</link> contém vários artigos interessantes sobre os recursos do kernel.</para>
+	</listitem>
+
+	<listitem>
+	  <para>As páginas de manual na seção 9 - para documentação importante sobre as funções do kernel.</para>
+	</listitem>
+
+	<listitem>
+	  <para>A página man <citerefentry><refentrytitle>geom</refentrytitle><manvolnum>4</manvolnum></citerefentry> e os <link xlink:href="http://phk.freebsd.dk/pubs/">Slides sobre o GEOM de PHK</link> - para uma introdução geral do subsistema GEOM.</para>
+	</listitem>
+
+	<listitem>
+	  <para>Páginas de manual <citerefentry><refentrytitle>g_bio</refentrytitle><manvolnum>9</manvolnum></citerefentry>, <citerefentry><refentrytitle>g_event</refentrytitle><manvolnum>9</manvolnum></citerefentry>, <citerefentry><refentrytitle>g_data</refentrytitle><manvolnum>9</manvolnum></citerefentry>, <citerefentry><refentrytitle>g_geom</refentrytitle><manvolnum>9</manvolnum></citerefentry>, <citerefentry><refentrytitle>g_provider</refentrytitle><manvolnum>9</manvolnum></citerefentry> <citerefentry><refentrytitle>g_consumer</refentrytitle><manvolnum>9</manvolnum></citerefentry>, <citerefentry><refentrytitle>g_access</refentrytitle><manvolnum>9</manvolnum></citerefentry> &amp; outros ligados a partir deles, para documentação sobre funcionalidades específicas.</para>
+	</listitem>
+
+	<listitem>
+	  <para>A página do manual <citerefentry><refentrytitle>style</refentrytitle><manvolnum>9</manvolnum></citerefentry> - para documentação sobre as convenções de estilo de codificação que devem ser seguidas para qualquer código que se destine a ser incorporado à Árvore do Subversion do FreeBSD.</para>
+	</listitem>
+      </itemizedlist>
+    </sect2>
+  </sect1>
+
+  <sect1 xml:id="prelim">
+    <title>Preliminares</title>
+
+    <para>A melhor maneira de fazer o desenvolvimento do kernel é ter (pelo menos) dois computadores separados. Um deles conteria o ambiente de desenvolvimento e o código fonte, e o outro seria usado para testar o código recém escrito, inicializando por meio da rede e montando seu sistema de arquivo a partir do primeiro computador. Desta forma, se o novo código contiver erros e travar a máquina, isso não irá atrapalhar o código fonte (e nem nenhum outros dado <quote>vivo</quote>). O segundo sistema nem sequer requer um monitor adequado. Em vez disso, ele pode ser conectado por meio de um cabo serial ou KVM ao primeiro computador.</para>
+
+    <para>Mas, como nem todo mundo tem dois ou mais computadores à mão, há algumas coisas que podem ser feitas para preparar um sistema <quote>vivo </quote> para desenvolver código para o kernel. Esta configuração também é aplicável para desenvolvimento em uma máquina virtual criada com o <link xlink:href="http://www.vmware.com/">VMWare</link>; ou com o <link xlink:href="http://www.qemu.org/">QEmu</link>; (a próxima melhor coisa depois de uma máquina de desenvolvimento dedicada).</para>
+
+    <sect2 xml:id="prelim-system">
+      <title>Modificando um sistema para desenvolvimento</title>
+
+      <para>Para qualquer programação do kernel, um kernel com a opção <option>INVARIANTS</option> ativada é obrigatório. Então, digite estas linhas no seu arquivo de configuração do kernel:</para>
+
+      <programlisting>options INVARIANT_SUPPORT
+options INVARIANTS</programlisting>
+
+      <para>Para ter um maior nível de depuração, você também devrá incluir o suporte ao WITNESS, o qual irá alertá-lo sobre erros relacionados a bloqueios (locking):</para>
+
+      <programlisting>options WITNESS_SUPPORT
+options WITNESS</programlisting>
+
+      <para>Para depurar despejos de memória, é necessário um kernel com símbolos de depuração:</para>
+
+      <programlisting>  makeoptions    DEBUG=-g</programlisting>
+
+      <para>Com a maneira usual de instalar o kernel (<command>make installkernel</command>) o kernel de depuração não será instalado automaticamente. Ele é chamado de <filename>kernel.debug </filename> e fica localizado em <filename>/usr/obj/usr/src/sys/KERNELNAME/</filename>. Por conveniência, deve ser copiado para <filename>/boot/kernel/</filename>.</para>
+
+      <para>Outra conveniência é habilitar o depurador do kernel para que você possa examinar o panic do kernel quando isso acontece. Para isso, insira as seguintes linhas no seu arquivo de configuração do kernel:</para>
+
+      <programlisting>options KDB
+options DDB
+options KDB_TRACE</programlisting>
+
+      <para>Para que isso funcione, você pode precisar definir um sysctl (se ele não estiver ativado por padrão):</para>
+
+      <programlisting>  debug.debugger_on_panic=1</programlisting>
+
+      <para>Kernel panics acontecerão, portanto, deve-se ter cuidado com o cache do sistema de arquivos. Em particular, ter o softupdates habilitado pode significar que a versão mais recente do arquivo pode ser perdida se um panic ocorrer antes de ser committed para armazenamento. Desativar o softupdates produz um grande impacto na performance e ainda não garante a consistência dos dados. A montagem do sistema de arquivos com a opção <quote>sync</quote> é necessária para isso. Para um compromisso, os atrasos do cache de softupdates podem ser encurtados. Existem três sysctl's que são úteis para isso (melhor ser configurado em <filename>/etc/sysctl.conf</filename>):</para>
+
+      <programlisting>kern.filedelay=5
+kern.dirdelay=4
+kern.metadelay=3</programlisting>
+
+      <para>Os números representam segundos.</para>
+
+      <para>Para depurar os panics do kernel, os dumps do núcleo do kernel são necessários. Como um kernel panic pode tornar os sistemas de arquivos inutilizáveis, esse despejo de memória é primeiramente gravado em uma partição bruta. Normalmente, esta é a partição de swap. Essa partição deve ser pelo menos tão grande quanto a RAM física na máquina. Na próxima inicialização, o despejo é copiado para um arquivo normal. Isso acontece depois que os sistemas de arquivos são verificados e montados e antes que o swap seja ativado. Isto é controlado com duas variáveis <filename>/etc/rc.conf</filename>:</para>
+
+      <programlisting>dumpdev="/dev/ad0s4b"
+dumpdir="/usr/core </programlisting>
+
+      <para>A variável <varname>dumpdev</varname> especifica a partição de swap e <varname>dumpdir</varname> informa ao sistema onde no sistema de arquivos ele deverá realocar o dump principal na reinicialização.</para>
+
+      <para>A gravação de core dumps é lenta e leva muito tempo, então se você tiver muita memória (&gt;256M) e muitos panics, pode ser frustrante sentar e esperar enquanto isso é feito (duas vezes - primeiro para gravar para o swap, depois para realocá-lo para o sistema de arquivos). É conveniente limitar a quantidade de RAM que o sistema usará através de uma variável do <filename>/boot/loader.conf</filename>:</para>
+
+      <programlisting>  hw.physmem="256M"</programlisting>
+
+      <para>Se os panics são frequentes e os sistemas de arquivos são grandes (ou você simplesmente não confia em softupdates + background fsck), é aconselhável desligar o fsck em background através da variável <filename>/etc/rc.conf</filename>:</para>
+
+      <programlisting>  background_fsck="NO"</programlisting>
+
+      <para>Dessa forma, os sistemas de arquivos sempre serão verificados quando necessário. Observe que, com o fsck em segundo plano, um novo panic pode acontecer enquanto ele está verificando os discos. Novamente, a maneira mais segura é não ter muitos sistemas de arquivos locais, usando o outro computador como um servidor NFS.</para>
+    </sect2>
+
+    <sect2 xml:id="prelim-starting">
+      <title>Começando o projeto</title>
+
+      <para>Para o propósito de criar uma nova classe GEOM, um subdiretório vazio deve ser criado sob um diretório arbitrário acessível pelo usuário. Você não precisa criar o diretório do módulo em <filename>/usr/src</filename>.</para>
+    </sect2>
+
+    <sect2 xml:id="prelim-makefile">
+      <title>O Makefile</title>
+
+      <para>É uma boa prática criar <filename>Makefile</filename>s para cada projeto de codificação não trivial, o que obviamente inclui módulos do kernel.</para>
+
+      <para>Criar o <filename>Makefile</filename> é simples graças a um extenso conjunto de rotinas auxiliares fornecidas pelo sistema. Em suma, aqui está um exemplo de como um Makefile <filename>mínimo</filename> para um módulo do kernel se parece:</para>
+
+      <programlisting>SRCS=g_journal.c
+KMOD=geom_journal
+
+.include &lt;bsd.kmod.mk&gt;</programlisting>
+
+      <para>Este <filename>Makefile</filename> (com nomes de arquivos alterados) serve para qualquer módulo do kernel, e uma classe GEOM pode residir em apenas um módulo do kernel. Se mais de um arquivo for necessário, liste-o na variável <envar>SRCS</envar>, separado com espaço em branco de outros nomes de arquivos.</para>
+    </sect2>
+  </sect1>
+
+  <sect1 xml:id="kernelprog">
+    <title>Programação do kernel do FreeBSD</title>
+
+    <sect2 xml:id="kernelprog-memalloc">
+      <title>Alocação de memória</title>
+
+      <para>Veja o <citerefentry><refentrytitle>malloc</refentrytitle><manvolnum>9</manvolnum></citerefentry>. A alocação básica de memória é apenas ligeiramente diferente do seu userland equivalente. Mais notavelmente, <function>malloc</function>() e <function>free</function>() aceitam parâmetros adicionais conforme descrito na página do manual.</para>
+
+      <para>Um <quote>malloc type</quote> deve ser declarado na seção de declaração de um arquivo fonte, assim:</para>
+
+      <programlisting>  static MALLOC_DEFINE(M_GJOURNAL, "gjournal data", "GEOM_JOURNAL Data");</programlisting>
+
+      <para>Para usar esta macro, os cabeçalhos <filename>sys/param.h</filename>, <filename>sys/kernel.h</filename> e <filename>sys/malloc.h</filename> devem ser incluídos.</para>
+
+      <para>Existe outro mecanismo para alocar memória, o UMA (Universal Memory Allocator). Veja <citerefentry><refentrytitle>uma</refentrytitle><manvolnum>9</manvolnum></citerefentry> para detalhes, mas ele é um tipo especial de alocador usado principalmente para alocação rápida de listas compostas de itens do mesmo tamanho (por exemplo, matrizes dinâmicas de estruturas).</para>
+    </sect2>
+
+    <sect2 xml:id="kernelprog-lists">
+      <title>Listas e filas</title>
+
+      <para>Veja <citerefentry><refentrytitle>queue</refentrytitle><manvolnum>3</manvolnum></citerefentry>. Há MUITOS casos quando uma lista de coisas precisa ser mantida. Felizmente, essa estrutura de dados é implementada (de várias maneiras) por macros C incluídas no sistema. O tipo de lista mais usado é o TAILQ, porque é o mais flexível. É também aquele com os maiores requisitos de memória (seus elementos são duplamente vinculados) e também o mais lento (embora a variação de velocidade seja mais da ordem de várias instruções da CPU, portanto, ela não deve ser levada a sério).</para>
+
+      <para>Se a velocidade de recuperação de dados for muito importante, veja <citerefentry><refentrytitle>tree</refentrytitle><manvolnum>3</manvolnum></citerefentry> e <citerefentry><refentrytitle>hashinit</refentrytitle><manvolnum>9</manvolnum></citerefentry>.</para>
+    </sect2>
+
+    <sect2 xml:id="kernelprog-bios">
+      <title>BIOS</title>
+
+      <para>A estrutura <varname remap="structname">bio</varname> é usada para todas e quaisquer operações de Input/Output relativas ao GEOM. Ele basicamente contém informações sobre qual dispositivo ('provedor') deve satisfazer a solicitação, tipo de pedido, offset, comprimento, ponteiro para um buffer e um monte de sinalizadores <quote>específicos do usuário</quote> e campos que podem ajudar a implementar vários hacks.</para>
+
+      <para>O importante aqui é que os <varname remap="structname">bio</varname>s são tratados de forma assíncrona. Isso significa que, na maior parte do código, não há nenhum análogo as chamadas <citerefentry><refentrytitle>read</refentrytitle><manvolnum>2</manvolnum></citerefentry> e <citerefentry><refentrytitle>write</refentrytitle><manvolnum>2</manvolnum></citerefentry> que não retornam até que uma solicitação seja feita. Em vez disso, uma função fornecida pelo desenvolvedor é chamada como uma notificação quando a solicitação é concluída (ou resulta em erro).</para>
+
+      <para>O modelo de programação assíncrona (também chamado de <quote>orientado a eventos</quote>) é um pouco mais difícil do que o imperativo muito mais usado no userland (pelo menos leva um tempo para se acostumar com isso). Em alguns casos, as rotinas auxiliares <function>g_write_data</function>() e <function>g_read_data</function>() podem ser usadas, mas <emphasis>nem sempre</emphasis>. Em particular, elas não podem ser usadas quando um mutex é mantido; por exemplo, o mutex de topologia GEOM ou o mutex interno mantido durante as funções <function>.start</function>() e <function>.stop</function>().</para>
+    </sect2>
+  </sect1>
+
+  <sect1 xml:id="geom">
+    <title>Programação GEOM</title>
+
+    <sect2 xml:id="geom-ggate">
+      <title>Ggate</title>
+
+      <para>Se o desempenho máximo não for necessário, uma maneira muito mais simples de fazer uma transformação de dados é implementá-lo na área do usuário por meio do recurso ggate (GEOM gate). Infelizmente, não existe uma maneira fácil de converter ou até mesmo compartilhar código entre as duas abordagens.</para>
+    </sect2>
+
+    <sect2 xml:id="geom-class">
+      <title>Classe GEOM</title>
+
+      <para>Classes GEOM são transformações nos dados. Essas transformações podem ser combinadas em uma forma de árvore. Instâncias de classes GEOM são chamadas de <emphasis>geoms</emphasis>.</para>
+
+      <para>Cada classe GEOM possui vários <quote>métodos de classe</quote> que são chamados quando não há nenhuma instância geom disponível (ou simplesmente não estão vinculados a uma única instância):</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para><function>.init</function> é chamada quando o GEOM toma conhecimento de uma classe GEOM (quando o módulo do kernel é carregado).</para>
+	</listitem>
+
+	<listitem>
+	  <para><function>.fini</function> é chamada quando o GEOM abandona a classe (quando o módulo é descarregado)</para>
+	</listitem>
+
+	<listitem>
+	  <para><function>.taste</function> é chamada next, uma vez para cada provedor que o sistema tiver disponível. Se aplicável, essa função geralmente criará e iniciará uma instância geom.</para>
+	</listitem>
+
+	<listitem>
+	  <para><function>.destroy_geom</function> é chamada quando o geom deve ser desfeito</para>
+	</listitem>
+
+	<listitem>
+	  <para><function>.ctlconf</function> é chamado quando o usuário solicita a reconfiguração do geom existente</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>Também são definidas as funções de evento GEOM, que serão copiadas para a instância geom.</para>
+
+      <para>O campo <function>.geom</function> na estrutura <varname remap="structname">g_class</varname> é uma LISTA de geoms instanciados a partir da classe.</para>
+
+      <para>Estas funções são chamadas a partir da thread g_event do kernel.</para>
+    </sect2>
+
+    <sect2 xml:id="geom-softc">
+      <title>Softc</title>
+
+      <para>O nome <quote>softc</quote> é um termo legado para <quote>dados privados do driver</quote>. O nome provavelmente vem do termo arcaico <quote>bloco de controle de software</quote>. No GEOM, ele é uma estrutura (mais precisamente: ponteiro para uma estrutura) que pode ser anexada a uma instância geom para armazenar quaisquer dados que sejam privados para a instância geom. A maioria das classes GEOM possui os seguintes membros:</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para><varname>struct g_provider *provider</varname> : O <quote>provedor</quote> que este geom instância</para>
+	</listitem>
+
+	<listitem>
+	  <para><varname>uint16_t n_disks</varname> : Número de consumidores que este geom consome</para>
+	</listitem>
+
+	<listitem>
+	  <para><varname>struct g_consumer **disks</varname>: Array de <varname>struct g_consumer*</varname>. (Não é possível usar apenas uma única via indireta porque o struct g_consumer* é criado em nosso nome pela GEOM).</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>A estrutura <varname remap="structname">softc</varname> contém todo o estado da instância geom. Cada instância geom possui seu próprio softc.</para>
+    </sect2>
+
+    <sect2 xml:id="geom-metadata">
+      <title>Metadados</title>
+
+      <para>O formato dos metadados é mais ou menos dependente da classe, mas DEVE começar com:</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para>Buffer de 16 bytes para uma assinatura de terminação nula (geralmente o nome da classe)</para>
+	</listitem>
+
+	<listitem>
+	  <para>ID da versão uint32</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>Assume-se que as classes geom sabem como lidar com metadados com ID de versão menores que os deles.</para>
+
+      <para>Os metadados estão localizados no último setor do provedor (e, portanto, devem caber nele).</para>
+
+      <para>(Tudo isso depende da implementação, mas todo o código existente funciona assim, e é suportado por bibliotecas.)</para>
+    </sect2>
+
+    <sect2 xml:id="geom-creating">
+      <title>Rotulando/criando um GEOM</title>
+
+      <para>A sequência de eventos é:</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para>o usuário chama o utilitário <citerefentry><refentrytitle>geom</refentrytitle><manvolnum>8</manvolnum></citerefentry> (ou um de seus equivalentes hardlinked)</para>
+	</listitem>
+
+	<listitem>
+	  <para>o utilitário descobre qual classe geom ele é suposto manipular e procura pela biblioteca <filename>geom_<replaceable>CLASSNAME</replaceable>.so </filename> (geralmente em <filename>/lib/geom</filename>).</para>
+	</listitem>
+
+	<listitem>
+	  <para>ele <citerefentry><refentrytitle>dlopen</refentrytitle><manvolnum>3</manvolnum></citerefentry>-s a biblioteca, extrai as definições dos parâmetros da linha de comandos e funções auxiliares.</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>No caso da criação/rotulação de um novo geom, isso é o que acontece:</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para>O <citerefentry><refentrytitle>geom</refentrytitle><manvolnum>8</manvolnum></citerefentry> procura no argumento da linha de comando pelo comando (geralmente <option>label</option>) e chama uma função auxiliar .</para>
+	</listitem>
+
+	<listitem>
+	  <para>A função auxiliar verifica parâmetros e reúne metadados, que são gravados em todos os provedores envolvidos.</para>
+	</listitem>
+
+	<listitem>
+	  <para>Este <quote>estraga</quote> geoms existentes (se existirem) e inicializa uma nova rodada de <quote>degustação</quote> dos provedores. A classe geom pretendida reconhece os metadados e carrega o geom.</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>(A sequência de eventos acima é dependente da implementação, mas todo o código existente funciona assim, e é suportado pelas bibliotecas.)</para>
+    </sect2>
+
+    <sect2 xml:id="geom-command">
+      <title>Estrutura do Comando GEOM</title>
+
+      <para>A biblioteca helper <filename>geom_CLASSNAME.so</filename> exporta a estrutura <varname remap="structname">class_commands</varname>, que é uma matriz dos elementos <varname remap="structname">struct g_command</varname>. Os comandos são uniformes no formato e se parecem com:</para>
+
+      <programlisting>  verb [-options] geomname [other]</programlisting>
+
+      <para>Verbos comuns são:</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para>label - para gravar metadados em dispositivos para que eles possam ser reconhecidos em degustações e criados em geoms</para>
+	</listitem>
+
+	<listitem>
+	  <para>destroy - para destruir metadados, para que as geoms sejam destruídas</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>Opções comuns são:</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para><literal>-v</literal> : be verbose</para>
+	</listitem>
+
+	<listitem>
+	  <para><literal>-f</literal> : force</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>Muitas ações, como rotular e destruir metadados, podem ser executadas no userland. Para isso, <varname remap="structname">struct g_command</varname> fornece o campo <varname>gc_func</varname> que pode ser definido para uma função (no mesmo <filename>.so</filename>) que será chamada para processar um verbo. Se <varname>gc_func</varname> for NULL, o comando será passado para o módulo do kernel, para a função <function>.ctlreq</function> da classe geom.</para>
+    </sect2>
+
+    <sect2 xml:id="geom-geoms">
+      <title>Geoms</title>
+
+      <para>Geoms são instâncias de classes GEOM. Eles possuem dados internos (uma estrutura softc) e algumas funções com as quais eles respondem a eventos externos.</para>
+
+      <para>As funções de evento são:</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para><function>.acess</function>: calcula permissões (leitura / escrita / exclusiva)</para>
+	</listitem>
+
+	<listitem>
+	  <para><function>.dumpconf</function>: retorna informações formatadas em XML sobre o geom</para>
+	</listitem>
+
+	<listitem>
+	  <para><function>.orphan</function>: chamado quando algum provedor subjacente é desconectado</para>
+	</listitem>
+
+	<listitem>
+	  <para><function>.spoiled</function>: chamado quando algum provedor subjacente é gravado</para>
+	</listitem>
+
+	<listitem>
+	  <para><function>.start</function>: lida com I/O</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>Estas funções são chamadas a partir da thread <function>g_down</function> do kernel e não pode haver sleeping neste contexto, (veja a definição de sleeping em outro lugar) o que limita um pouco o que pode ser feito, mas força o manuseio a ser rápido .</para>
+
+      <para>Destes, a função mais importante para fazer o trabalho útil real é a função <function>.start</function>(), que é chamada quando uma requisição BIO chega para um provedor gerenciado por uma instância da classe geom.</para>
+    </sect2>
+
+    <sect2 xml:id="geom-threads">
+      <title>Threads GEOM</title>
+
+      <para>Existem três threads de kernel criados e executados pelo framework GEOM:</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para><literal>g_down</literal> : trata de solicitações provenientes de entidades de alto nível (como uma solicitação do userland) no caminho para dispositivos físicos</para>
+	</listitem>
+
+	<listitem>
+	  <para><literal>g_up</literal> : lida com respostas de drivers de dispositivos para solicitações feitas por entidades de nível superior</para>
+	</listitem>
+
+	<listitem>
+	  <para><literal>g_event</literal> : lida com todos os outros casos: criação de instâncias geom, contagem de acessos, eventos <quote>spoil</quote>, etc.</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>Quando um processo do usuário emite um pedido de <quote>leitura de dados X no deslocamento Y de um arquivo</quote>, isto é o que acontece:</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para>O sistema de arquivos converte o pedido em uma instância struct bio e o transmite para o subsistema GEOM. Ele sabe o que a instância geom deve manipular porque os sistemas de arquivos são hospedados diretamente em uma instância geom.</para>
+	</listitem>
+
+	<listitem>
+	  <para>A requisição termina como uma chamada para a função <function>.start</function>() feita para a thread g_down e atinge a instância geom de nível superior.</para>
+	</listitem>
+
+	<listitem>
+	  <para>Essa instância geom de nível superior (por exemplo, o segmentador de partições) determina que a solicitação deve ser roteada para uma instância de nível inferior (por exemplo, o driver de disco). Ele faz uma cópia da solicitação bio (solicitações bio <emphasis>SEMPRE</emphasis> precisam ser copiadas entre instâncias, com <function>g_clone_bio</function>()!), modifica os campos de dados offset e de provedor de destino e executa a cópia com <function>g_io_request</function>()</para>
+	</listitem>
+
+	<listitem>
+	  <para>O driver de disco obtém a solicitação bio também como uma chamada para <function>.start</function>() na thread <literal>g_down</literal>. Ela fala com o hardware, recupera os dados e chama <function>g_io_deliver</function>() na bio.</para>
+	</listitem>
+
+	<listitem>
+	  <para>Agora, a notificação de bio conclusão <quote>borbulha</quote> na thread <literal>g_up</literal>. Primeiro, o slicer de partição obtém <function>.done</function>() chamado na thread <literal>g_up</literal>, ele usa as informações armazenadas na bio para liberar a estrutura <varname remap="structname">bio</varname> clonada (com <function>g_destroy_bio</function>()) e chama <function>g_io_deliver</function>() no pedido original.</para>
+	</listitem>
+
+	<listitem>
+	  <para>O sistema de arquivos obtém os dados e os transfere para o usuário.</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>Veja a página de manual para o <citerefentry><refentrytitle>g_bio</refentrytitle><manvolnum>9</manvolnum></citerefentry> para obter informações sobre como os dados são passados para frente e para trás na estrutura <varname remap="structname">bio</varname> (observe em particular os campos <varname>bio_parent</varname> e <varname>bio_children</varname> e como eles são manipulados).</para>
+
+      <para>Uma característica importante: <emphasis>NAS THREADS G_UP E G_DOWN NÃO SE PODE DORMIR (SELEEPING)</emphasis>. Isso significa que nenhuma das seguintes coisas pode ser feita nessas threads (a lista não é completa, mas apenas informativa):</para>
+
+      <itemizedlist>
+	<listitem>
+	  <para>Chamadas para <function>msleep</function>() e <function>tsleep</function>(), obviamente.</para>
+	</listitem>
+
+	<listitem>
+	  <para>Chamadas para <function>g_write_data</function>() e <function>g_read_data</function>(), porque estes dormem entre passar os dados para os consumidores e retornar.</para>
+	</listitem>
+
+	<listitem>
+	  <para>Esperando I/O.</para>
+	</listitem>
+
+	<listitem>
+	  <para>Chamadas para <citerefentry><refentrytitle>malloc</refentrytitle><manvolnum>9</manvolnum></citerefentry> e <function>uma_zalloc</function>() com o conjunto de flags <varname>M_WAITOK</varname></para>
+	</listitem>
+
+	<listitem>
+	  <para>sx e outros sleepable locks</para>
+	</listitem>
+      </itemizedlist>
+
+      <para>Esta restrição está aqui para impedir que o código GEOM obstrua o caminho da solicitação de I/O, já que sleeping normalmente não é limitado pelo tempo e não pode haver garantias sobre quanto tempo levará (também existem algumas outras razões mais técnicas). Isso também significa que não existe muito o que possa ser feito nessas threads; por exemplo, quase qualquer coisa complexa requer alocação de memória. Felizmente, existe uma saída: criar threads adicionais no kernel.</para>
+    </sect2>
+
+    <sect2 xml:id="geom-kernelthreads">
+      <title>Threads de kernel para uso no código GEOM</title>
+
+      <para>As threads do kernel são criadas com a função <citerefentry><refentrytitle>kthread_create</refentrytitle><manvolnum>9</manvolnum></citerefentry>, e elas são semelhantes aos threads do userland no comportamento,  eles somente não podem retornar ao chamador para exprimir a conclusão, mas deve chamar <citerefentry><refentrytitle>kthread_exit</refentrytitle><manvolnum>9</manvolnum></citerefentry>.</para>
+
+      <para>No código GEOM, o uso usual de threads é para descarregar o processamento de requisições da thread <literal>g_down</literal> (a função <function>.start</function>). Estas threads se parecem com um <quote>event handlers</quote>: elas têm uma lista encadeada de eventos associados a elas (nos quais eventos podem ser postados por várias funções em várias threads, portanto, devem ser protegidos por um mutex), pegam os eventos da lista, um por um, e processa-os em uma grande instrução <literal>switch</literal>().</para>
+
+      <para>A principal vantagem de usar uma thread para lidar com solicitações de I/O é que ela pode dormir quando necessário. Agora, isso parece bom, mas deve ser cuidadosamente pensado. Dormir é bom e muito conveniente, mas pode ser muito efetivo em destruir o desempenho da transformação geom. As classes extremamente sensíveis ao desempenho provavelmente devem fazer todo o trabalho na chamada de função <function>.start</function>(), tomando muito cuidado para lidar com erros de falta de memória e similares.</para>
+
+      <para>O outro benefício de ter uma thread de manipulação de eventos como essa é serializar todas as solicitações e respostas provenientes de diferentes threads geom em uma thread. Isso também é muito conveniente, mas pode ser lento. Na maioria dos casos, o tratamento de pedidos <function>.done</function>() pode ser deixado para a thread <literal>g_up</literal>.</para>
+
+      <para>Mutexes no kernel do FreeBSD (veja <citerefentry><refentrytitle>mutex</refentrytitle><manvolnum>9</manvolnum></citerefentry>) têm uma distinção de seus primos mais comuns do userland - o código não pode dormir enquanto estiver segurando um mutex). Se o código precisar dormir muito, os bloqueios <citerefentry><refentrytitle>sx</refentrytitle><manvolnum>9</manvolnum></citerefentry> podem ser mais apropriados. Por outro lado, se você faz quase tudo em um único thread, você pode se safar sem utilizar mutexes.</para>
+    </sect2>
+  </sect1>
+</article>

Added: head/pt_BR.ISO8859-1/articles/geom-class/pt_BR.po
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/pt_BR.ISO8859-1/articles/geom-class/pt_BR.po	Sun Sep 16 19:52:43 2018	(r52268)
@@ -0,0 +1,1542 @@
+# $FreeBSD$
+# Danilo G. Baio <dbaio@FreeBSD.org>, 2018. #zanata
+# Edson Brandi <ebrandi@FreeBSD.org>, 2018. #zanata
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2018-09-16 19:44+0000\n"
+"PO-Revision-Date: 2018-09-16 07:26+0000\n"
+"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
+"Language-Team: \n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Zanata 4.6.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+"Edson Brandi, ebrandi@FreeBSD.org, 2018\n"
+"Danilo G. Baio, dbaio@FreeBSD.org, 2018"
+
+#. (itstool) path: info/title
+#: article.translate.xml:5
+msgid "Writing a GEOM Class"
+msgstr "Escrevendo uma classe GEOM"
+
+#. (itstool) path: affiliation/address
+#: article.translate.xml:14
+#, no-wrap
+msgid ""
+"\n"
+"\t    <email>ivoras@FreeBSD.org</email>\n"
+"\t  "
+msgstr ""
+"\n"
+"\t    <email>ivoras@FreeBSD.org</email>\n"
+"\t  "
+
+#. (itstool) path: authorgroup/author
+#: article.translate.xml:8
+msgid ""
+"<personname> <firstname>Ivan</firstname> <surname>Voras</surname> </"
+"personname> <affiliation> <_:address-1/> </affiliation>"
+msgstr ""
+"<personname> <firstname>Ivan</firstname> <surname>Voras</surname> </"
+"personname> <affiliation> <_:address-1/> </affiliation>"
+
+#. (itstool) path: legalnotice/para
+#: article.translate.xml:22
+msgid "FreeBSD is a registered trademark of the FreeBSD Foundation."
+msgstr "FreeBSD is a registered trademark of the FreeBSD Foundation."
+
+#. (itstool) path: legalnotice/para
+#: article.translate.xml:24
+msgid ""
+"Intel, Celeron, Centrino, Core, EtherExpress, i386, i486, Itanium, Pentium, "
+"and Xeon are trademarks or registered trademarks of Intel Corporation or its "
+"subsidiaries in the United States and other countries."
+msgstr ""
+"Intel, Celeron, Centrino, Core, EtherExpress, i386, i486, Itanium, Pentium, "
+"and Xeon are trademarks or registered trademarks of Intel Corporation or its "
+"subsidiaries in the United States and other countries."
+
+#. (itstool) path: legalnotice/para
+#: article.translate.xml:28
+msgid ""
+"Many of the designations used by manufacturers and sellers to distinguish "
+"their products are claimed as trademarks. Where those designations appear in "
+"this document, and the FreeBSD Project was aware of the trademark claim, the "
+"designations have been followed by the <quote>™</quote> or the <quote>®</"
+"quote> symbol."
+msgstr ""
+"Many of the designations used by manufacturers and sellers to distinguish "
+"their products are claimed as trademarks. Where those designations appear in "
+"this document, and the FreeBSD Project was aware of the trademark claim, the "
+"designations have been followed by the <quote>™</quote> or the <quote>®</"
+"quote> symbol."
+
+#. (itstool) path: info/pubdate
+#. (itstool) path: info/releaseinfo
+#: article.translate.xml:36 article.translate.xml:38
+msgid ""
+"$FreeBSD: head/en_US.ISO8859-1/articles/geom-class/article.xml 48489 "
+"2016-03-28 17:30:19Z jgh $"
+msgstr "$FreeBSD$"
+
+#. (itstool) path: abstract/para
+#: article.translate.xml:41
+msgid ""
+"This text documents some starting points in developing GEOM classes, and "
+"kernel modules in general. It is assumed that the reader is familiar with C "
+"userland programming."
+msgstr ""
+"Este texto documenta alguns pontos de partida no desenvolvimento de classes "
+"GEOM e módulos do kernel em geral. Supõe-se que o leitor esteja "
+"familiarizado com a programação C do userland."
+
+#. (itstool) path: sect1/title
+#: article.translate.xml:50
+msgid "Introduction"
+msgstr "Introdução"
+
+#. (itstool) path: sect2/title
+#: article.translate.xml:53
+msgid "Documentation"
+msgstr "Documentação"
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:55
+msgid ""
+"Documentation on kernel programming is scarce — it is one of few areas where "
+"there is nearly nothing in the way of friendly tutorials, and the phrase "
+"<quote>use the source!</quote> really holds true. However, there are some "
+"bits and pieces (some of them seriously outdated) floating around that "
+"should be studied before beginning to code:"
+msgstr ""
+"A documentação sobre programação do kernel é escassa - é uma das poucas "
+"áreas na qual não há quase nada de tutoriais amigáveis, e a frase <quote>usa "
+"a fonte!</quote> realmente é verdadeira. No entanto, existem alguns pedaços "
+"(alguns deles seriamente desatualizados) flutuando por ai e que devem ser "
+"estudados antes de começar a codificar:"
+
+#. (itstool) path: listitem/para
+#: article.translate.xml:64
+msgid ""
+"The <link xlink:href=\"@@URL_RELPREFIX@@/doc/en_US.ISO8859-1/books/"
+"developers-handbook/index.html\">FreeBSD Developer's Handbook</link> — part "
+"of the documentation project, it does not contain anything specific to "
+"kernel programming, but rather some general useful information."
+msgstr ""
+"O <link xlink:href=\"@@URL_RELPREFIX@@/doc/en_US.ISO8859-1/books/developers-"
+"handbook/index.html\">Manual do Desenvolvedor do FreeBSD</link> - parte do "
+"projeto de documentação, ele não contém nenhum informação específica para a "
+"programação do kernel, mas possui algumas informações gerais úteis."
+
+#. (itstool) path: listitem/para
+#: article.translate.xml:72
+msgid ""
+"The <link xlink:href=\"@@URL_RELPREFIX@@/doc/en_US.ISO8859-1/books/arch-"
+"handbook/index.html\">FreeBSD Architecture Handbook</link> — also from the "
+"documentation project, contains descriptions of several low-level facilities "
+"and procedures. The most important chapter is 13, <link xlink:href="
+"\"@@URL_RELPREFIX@@/doc/en_US.ISO8859-1/books/arch-handbook/driverbasics.html"
+"\">Writing FreeBSD device drivers</link>."
+msgstr ""
+"O <link xlink:href=\"@@URL_RELPREFIX@@/doc/en_US.ISO8859-1/books/arch-"
+"handbook/index.html\">Manual de Arquitetura do FreeBSD</link> - também do "
+"projeto de documentação, contém descrições de várias instalações e "
+"procedimentos de baixo nível. O capítulo mais importante é o 13, <link xlink:"
+"href=\"@@URL_RELPREFIX@@/doc/en_US.ISO8859-1/books/arch-handbook/"
+"driverbasics.html\">Escrevendo drivers de dispositivo FreeBSD</link>."
+
+#. (itstool) path: listitem/para
+#: article.translate.xml:81
+msgid ""
+"The Blueprints section of <link xlink:href=\"http://www.freebsddiary.org"
+"\">FreeBSD Diary</link> web site — contains several interesting articles on "
+"kernel facilities."
+msgstr ""
+"A seção Blueprints do site do <link xlink:href=\"http://www.freebsddiary.org"
+"\">FreeBSD Diary</link> contém vários artigos interessantes sobre os "
+"recursos do kernel."
+
+#. (itstool) path: listitem/para
+#: article.translate.xml:88
+msgid ""
+"The man pages in section 9 — for important documentation on kernel functions."
+msgstr ""
+"As páginas de manual na seção 9 - para documentação importante sobre as "
+"funções do kernel."
+
+#. (itstool) path: listitem/para
+#: article.translate.xml:93
+msgid ""
+"The <citerefentry><refentrytitle>geom</refentrytitle><manvolnum>4</"
+"manvolnum></citerefentry> man page and <link xlink:href=\"http://phk.freebsd."
+"dk/pubs/\">PHK's GEOM slides</link> — for general introduction of the GEOM "
+"subsystem."
+msgstr ""
+"A página man <citerefentry><refentrytitle>geom</refentrytitle><manvolnum>4</"
+"manvolnum></citerefentry> e os <link xlink:href=\"http://phk.freebsd.dk/pubs/"
+"\">Slides sobre o GEOM de PHK</link> - para uma introdução geral do "
+"subsistema GEOM."
+
+#. (itstool) path: listitem/para
+#: article.translate.xml:99
+msgid ""
+"Man pages <citerefentry><refentrytitle>g_bio</refentrytitle><manvolnum>9</"
+"manvolnum></citerefentry>, <citerefentry><refentrytitle>g_event</"
+"refentrytitle><manvolnum>9</manvolnum></citerefentry>, "
+"<citerefentry><refentrytitle>g_data</refentrytitle><manvolnum>9</manvolnum></"
+"citerefentry>, <citerefentry><refentrytitle>g_geom</"
+"refentrytitle><manvolnum>9</manvolnum></citerefentry>, "
+"<citerefentry><refentrytitle>g_provider</refentrytitle><manvolnum>9</"
+"manvolnum></citerefentry> <citerefentry><refentrytitle>g_consumer</"
+"refentrytitle><manvolnum>9</manvolnum></citerefentry>, "
+"<citerefentry><refentrytitle>g_access</refentrytitle><manvolnum>9</"
+"manvolnum></citerefentry> &amp; others linked from those, for documentation "
+"on specific functionalities."
+msgstr ""
+"Páginas de manual <citerefentry><refentrytitle>g_bio</"
+"refentrytitle><manvolnum>9</manvolnum></citerefentry>, "
+"<citerefentry><refentrytitle>g_event</refentrytitle><manvolnum>9</"
+"manvolnum></citerefentry>, <citerefentry><refentrytitle>g_data</"
+"refentrytitle><manvolnum>9</manvolnum></citerefentry>, "
+"<citerefentry><refentrytitle>g_geom</refentrytitle><manvolnum>9</manvolnum></"
+"citerefentry>, <citerefentry><refentrytitle>g_provider</"
+"refentrytitle><manvolnum>9</manvolnum></citerefentry> "
+"<citerefentry><refentrytitle>g_consumer</refentrytitle><manvolnum>9</"
+"manvolnum></citerefentry>, <citerefentry><refentrytitle>g_access</"
+"refentrytitle><manvolnum>9</manvolnum></citerefentry> &amp; outros ligados a "
+"partir deles, para documentação sobre funcionalidades específicas."
+
+#. (itstool) path: listitem/para
+#: article.translate.xml:107
+msgid ""
+"The <citerefentry><refentrytitle>style</refentrytitle><manvolnum>9</"
+"manvolnum></citerefentry> man page — for documentation on the coding-style "
+"conventions which must be followed for any code which is to be committed to "
+"the FreeBSD Subversion tree."
+msgstr ""
+"A página do manual <citerefentry><refentrytitle>style</"
+"refentrytitle><manvolnum>9</manvolnum></citerefentry> - para documentação "
+"sobre as convenções de estilo de codificação que devem ser seguidas para "
+"qualquer código que se destine a ser incorporado à Árvore do Subversion do "
+"FreeBSD."
+
+#. (itstool) path: sect1/title
+#: article.translate.xml:117
+msgid "Preliminaries"
+msgstr "Preliminares"
+
+#. (itstool) path: sect1/para
+#: article.translate.xml:119
+msgid ""
+"The best way to do kernel development is to have (at least) two separate "
+"computers. One of these would contain the development environment and "
+"sources, and the other would be used to test the newly written code by "
+"network-booting and network-mounting filesystems from the first one. This "
+"way if the new code contains bugs and crashes the machine, it will not mess "
+"up the sources (and other <quote>live</quote> data). The second system does "
+"not even require a proper display. Instead, it could be connected with a "
+"serial cable or KVM to the first one."
+msgstr ""
+"A melhor maneira de fazer o desenvolvimento do kernel é ter (pelo menos) "
+"dois computadores separados. Um deles conteria o ambiente de desenvolvimento "
+"e o código fonte, e o outro seria usado para testar o código recém escrito, "
+"inicializando por meio da rede e montando seu sistema de arquivo a partir do "
+"primeiro computador. Desta forma, se o novo código contiver erros e travar a "
+"máquina, isso não irá atrapalhar o código fonte (e nem nenhum outros dado "
+"<quote>vivo</quote>). O segundo sistema nem sequer requer um monitor "
+"adequado. Em vez disso, ele pode ser conectado por meio de um cabo serial ou "
+"KVM ao primeiro computador."
+
+#. (itstool) path: sect1/para
+#: article.translate.xml:130
+msgid ""
+"But, since not everybody has two or more computers handy, there are a few "
+"things that can be done to prepare an otherwise <quote>live</quote> system "
+"for developing kernel code. This setup is also applicable for developing in "
+"a <link xlink:href=\"http://www.vmware.com/\">VMWare</link>; or <link xlink:"
+"href=\"http://www.qemu.org/\">QEmu</link>; virtual machine (the next best "
+"thing after a dedicated development machine)."
+msgstr ""
+"Mas, como nem todo mundo tem dois ou mais computadores à mão, há algumas "
+"coisas que podem ser feitas para preparar um sistema <quote>vivo </quote> "
+"para desenvolver código para o kernel. Esta configuração também é aplicável "
+"para desenvolvimento em uma máquina virtual criada com o <link xlink:href="
+"\"http://www.vmware.com/\">VMWare</link>; ou com o <link xlink:href=\"http://"
+"www.qemu.org/\">QEmu</link> (a próxima melhor coisa depois de uma máquina de "
+"desenvolvimento dedicada)."
+
+#. (itstool) path: sect2/title
+#: article.translate.xml:138
+msgid "Modifying a System for Development"
+msgstr "Modificando um sistema para desenvolvimento"
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:140
+msgid ""
+"For any kernel programming a kernel with <option>INVARIANTS</option> enabled "
+"is a must-have. So enter these in your kernel configuration file:"
+msgstr ""
+"Para qualquer programação do kernel, um kernel com a opção "
+"<option>INVARIANTS</option> ativada é obrigatório. Então, digite estas "
+"linhas no seu arquivo de configuração do kernel:"
+
+#. (itstool) path: sect2/programlisting
+#: article.translate.xml:144
+#, no-wrap
+msgid ""
+"options INVARIANT_SUPPORT\n"
+"options INVARIANTS"
+msgstr ""
+"options INVARIANT_SUPPORT\n"
+"options INVARIANTS"
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:147
+msgid ""
+"For more debugging you should also include WITNESS support, which will alert "
+"you of mistakes in locking:"
+msgstr ""
+"Para ter um maior nível de depuração, você também devrá incluir o suporte ao "
+"WITNESS, o qual irá alertá-lo sobre erros relacionados a bloqueios (locking):"
+
+#. (itstool) path: sect2/programlisting
+#: article.translate.xml:150
+#, no-wrap
+msgid ""
+"options WITNESS_SUPPORT\n"
+"options WITNESS"
+msgstr ""
+"options WITNESS_SUPPORT\n"
+"options WITNESS"
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:153
+msgid "For debugging crash dumps, a kernel with debug symbols is needed:"
+msgstr ""
+"Para depurar despejos de memória, é necessário um kernel com símbolos de "
+"depuração:"
+
+#. (itstool) path: sect2/programlisting
+#: article.translate.xml:156
+#, no-wrap
+msgid "  makeoptions    DEBUG=-g"
+msgstr "  makeoptions    DEBUG=-g"
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:158
+msgid ""
+"With the usual way of installing the kernel (<command>make installkernel</"
+"command>) the debug kernel will not be automatically installed. It is called "
+"<filename>kernel.debug</filename> and located in <filename>/usr/obj/usr/src/"
+"sys/KERNELNAME/</filename>. For convenience it should be copied to "
+"<filename>/boot/kernel/</filename>."
+msgstr ""
+"Com a maneira usual de instalar o kernel (<command>make installkernel</"
+"command>) o kernel de depuração não será instalado automaticamente. Ele é "
+"chamado de <filename>kernel.debug </filename> e fica localizado em "
+"<filename>/usr/obj/usr/src/sys/KERNELNAME/</filename>. Por conveniência, "
+"deve ser copiado para <filename>/boot/kernel/</filename>."
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:166
+msgid ""
+"Another convenience is enabling the kernel debugger so you can examine a "
+"kernel panic when it happens. For this, enter the following lines in your "
+"kernel configuration file:"
+msgstr ""
+"Outra conveniência é habilitar o depurador do kernel para que você possa "
+"examinar o panic do kernel quando isso acontece. Para isso, insira as "
+"seguintes linhas no seu arquivo de configuração do kernel:"
+
+#. (itstool) path: sect2/programlisting
+#: article.translate.xml:170
+#, no-wrap
+msgid ""
+"options KDB\n"
+"options DDB\n"
+"options KDB_TRACE"
+msgstr ""
+"options KDB\n"
+"options DDB\n"
+"options KDB_TRACE"
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:174
+msgid ""
+"For this to work you might need to set a sysctl (if it is not on by default):"
+msgstr ""
+"Para que isso funcione, você pode precisar definir um sysctl (se ele não "
+"estiver ativado por padrão):"
+
+#. (itstool) path: sect2/programlisting
+#: article.translate.xml:177
+#, no-wrap
+msgid "  debug.debugger_on_panic=1"
+msgstr "  debug.debugger_on_panic=1"
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:179
+msgid ""
+"Kernel panics will happen, so care should be taken with the filesystem "
+"cache. In particular, having softupdates might mean the latest file version "
+"could be lost if a panic occurs before it is committed to storage. Disabling "
+"softupdates yields a great performance hit, and still does not guarantee "
+"data consistency. Mounting filesystem with the <quote>sync</quote> option is "
+"needed for that. For a compromise, the softupdates cache delays can be "
+"shortened. There are three sysctl's that are useful for this (best to be set "
+"in <filename>/etc/sysctl.conf</filename>):"
+msgstr ""
+"Kernel panics acontecerão, portanto, deve-se ter cuidado com o cache do "
+"sistema de arquivos. Em particular, ter o softupdates habilitado pode "
+"significar que a versão mais recente do arquivo pode ser perdida se um panic "
+"ocorrer antes de ser committed para armazenamento. Desativar o softupdates "
+"produz um grande impacto na performance e ainda não garante a consistência "
+"dos dados. A montagem do sistema de arquivos com a opção <quote>sync</quote> "
+"é necessária para isso. Para um compromisso, os atrasos do cache de "
+"softupdates podem ser encurtados. Existem três sysctl's que são úteis para "
+"isso (melhor ser configurado em <filename>/etc/sysctl.conf</filename>):"
+
+#. (itstool) path: sect2/programlisting
+#: article.translate.xml:190
+#, no-wrap
+msgid ""
+"kern.filedelay=5\n"
+"kern.dirdelay=4\n"
+"kern.metadelay=3"
+msgstr ""
+"kern.filedelay=5\n"
+"kern.dirdelay=4\n"
+"kern.metadelay=3"
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:194
+msgid "The numbers represent seconds."
+msgstr "Os números representam segundos."
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:196
+msgid ""
+"For debugging kernel panics, kernel core dumps are required. Since a kernel "
+"panic might make filesystems unusable, this crash dump is first written to a "
+"raw partition. Usually, this is the swap partition. This partition must be "
+"at least as large as the physical RAM in the machine. On the next boot, the "
+"dump is copied to a regular file. This happens after filesystems are checked "
+"and mounted, and before swap is enabled. This is controlled with two "
+"<filename>/etc/rc.conf</filename> variables:"
+msgstr ""
+"Para depurar os panics do kernel, os dumps do núcleo do kernel são "
+"necessários. Como um kernel panic pode tornar os sistemas de arquivos "
+"inutilizáveis, esse despejo de memória é primeiramente gravado em uma "
+"partição bruta. Normalmente, esta é a partição de swap. Essa partição deve "
+"ser pelo menos tão grande quanto a RAM física na máquina. Na próxima "
+"inicialização, o despejo é copiado para um arquivo normal. Isso acontece "
+"depois que os sistemas de arquivos são verificados e montados e antes que o "
+"swap seja ativado. Isto é controlado com duas variáveis <filename>/etc/rc."
+"conf</filename>:"
+
+#. (itstool) path: sect2/programlisting
+#: article.translate.xml:206
+#, no-wrap
+msgid ""
+"dumpdev=\"/dev/ad0s4b\"\n"
+"dumpdir=\"/usr/core "
+msgstr ""
+"dumpdev=\"/dev/ad0s4b\"\n"
+"dumpdir=\"/usr/core "
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:209
+msgid ""
+"The <varname>dumpdev</varname> variable specifies the swap partition and "
+"<varname>dumpdir</varname> tells the system where in the filesystem to "
+"relocate the core dump on reboot."
+msgstr ""
+"A variável <varname>dumpdev</varname> especifica a partição de swap e "
+"<varname>dumpdir</varname> informa ao sistema onde no sistema de arquivos "
+"ele deverá realocar o dump principal na reinicialização."
+
+#. (itstool) path: sect2/para
+#: article.translate.xml:214
+msgid ""
+"Writing kernel core dumps is slow and takes a long time so if you have lots "
+"of memory (&gt;256M) and lots of panics it could be frustrating to sit and "
+"wait while it is done (twice — first to write it to swap, then to relocate "
+"it to filesystem). It is convenient then to limit the amount of RAM the "
+"system will use via a <filename>/boot/loader.conf</filename> tunable:"
+msgstr ""
+"A gravação de core dumps é lenta e leva muito tempo, então se você tiver "
+"muita memória (&gt;256M) e muitos panics, pode ser frustrante sentar e "
+"esperar enquanto isso é feito (duas vezes - primeiro para gravar para o "
+"swap, depois para realocá-lo para o sistema de arquivos). É conveniente "
+"limitar a quantidade de RAM que o sistema usará através de uma variável do "
+"<filename>/boot/loader.conf</filename>:"
+
+#. (itstool) path: sect2/programlisting
+#: article.translate.xml:222

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201809161952.w8GJqhtG037216>