<?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>Linux, Java y programación &#187; módulos</title>
	<atom:link href="http://casidiablo.net/tag/modulos/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Mon, 08 Mar 2010 03:41:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Instalar/reinstalar VMware 7 en Linux con el kernel 2.6.32</title>
		<link>http://casidiablo.net/error-vmware-linux-kernel/</link>
		<comments>http://casidiablo.net/error-vmware-linux-kernel/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 18:19:07 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[2.6.32]]></category>
		<category><![CDATA[compilación]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[módulos]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3520</guid>
		<description><![CDATA[

Si has intentado instalar VMware 7 sobre una máquina Linux corriendo el kernel 2.6.32 tal vez hayas tenido problemas. También, como en mi caso, tener VMware instalado con el kernel 2.6.31 y actualizar a 2.6.32 resulta en problemas al recompilar los módulos (específicamente el vmnet y el vmci).
Los errores que arroja VMware al momento de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Ferror-vmware-linux-kernel%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Instalar%2Freinstalar%20VMware%207%20en%20Linux%20con%20el%20kernel%202.6.32%22%20%7D);"></div>
<p style="text-align: justify;">Si has intentado instalar VMware 7 sobre una máquina Linux corriendo el kernel 2.6.32 tal vez hayas tenido problemas. También, como en mi caso, tener VMware instalado con el kernel 2.6.31 y actualizar a 2.6.32 resulta en problemas al recompilar los módulos (específicamente el vmnet y el vmci).</p>
<p style="text-align: justify;">Los errores que arroja VMware al momento de tratar de recompilar los módulos son similares a esto:</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/error-vmware.png"><img class="size-full wp-image-3522 aligncenter" title="error-vmware" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/error-vmware.png" alt="error-vmware" width="382" height="341" /></a></p>
<p style="text-align: justify;">Errores con el vmnet que se muestran en consola:</p>
<div class="consola">CC [M]  /tmp/vmware-root/modules/vmnet-only/vnetUserListener.o<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: En la función ‘VNetUserListenerEventHandler’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: (Cada identificador no declarado solamente se reporta una vez<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: para cada funcion en la que aparece.)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: En la función ‘VNetUserListenerRead’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: declaración implícita de la función ‘signal_pending’<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: declaración implícita de la función ‘schedule’<br />
make[2]: *** [/tmp/vmware-root/modules/vmnet-only/vnetUserListener.o] Error 1<br />
make[1]: *** [_module_/tmp/vmware-root/modules/vmnet-only] Error 2<br />
make[1]: se sale del directorio `/usr/src/linux-2.6.32&#8242;<br />
make: *** [vmnet.ko] Error 2</div>
<p style="text-align: justify;">Errores con el vmci (Virtual Machine Communication Interface) que se muestran en consola:</p>
<div class="consola">CC [M]  /tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.o<br />
In file included from /tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:48:<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h: En la función ‘PgtblVa2MPN’:<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h:301: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h: En la función ‘PgtblVa2Page’:<br />
/tmp/vmware-root/modules/vmci-only/./include/pgtbl.h:373: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCIHost_SignalCall’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:328: error: ‘TASK_NORMAL’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:328: error: (Cada identificador no declarado solamente se reporta una vez<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:328: error: para cada funcion en la que aparece.)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCIHost_WaitForCallLocked’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:370: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:370: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:378: error: declaración implícita de la función ‘schedule’<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:386: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:386: error: ‘TASK_RUNNING’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:390: error: declaración implícita de la función ‘signal_pending’<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCI_SignalEvent’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:682: error: ‘TASK_NORMAL’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCI_WaitOnEventInterruptible’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:739: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:739: error: ‘TASK_INTERRUPTIBLE’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:751: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:751: error: ‘TASK_RUNNING’ no se declaró aquí (primer uso en esta función)<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c: En la función ‘VMCIHost_GetUserMemory’:<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1438: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1440: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1459: error: puntero deferenciado a tipo de dato incompleto<br />
/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.c:1487: error: puntero deferenciado a tipo de dato incompleto<br />
make[2]: *** [/tmp/vmware-root/modules/vmci-only/linux/vmciKernelIf.o] Error 1<br />
make[1]: *** [_module_/tmp/vmware-root/modules/vmci-only] Error 2<br />
make[1]: se sale del directorio `/usr/src/linux-2.6.32&#8242;<br />
make: *** [vmci.ko] Error 2</div>
<p style="text-align: justify;">La <a href="http://blog.chmouel.com/2009/12/05/vmware-vmplayer-and-kernel-2-6-32/">solución</a> la comentan en Chmouel Blog y me la a sugerido <a href="http://casidiablo.net/author/c0rtex/">Cortex</a>, aunque hablan solamente de errores en el vmnet y no en el vmci. De cualquier forma, la solución prácticamente la misma:</p>
<ul>
<li><code>cd /tmp</code></li>
<li><code>tar xf /usr/lib/vmware/modules/source/vmnet.tar</code></li>
<li>Entramos al directorio (<code>cd vmnet-only</code>)</li>
<li>Abrimos el archivo <code>vnetUserListener.c</code> con un editor de texto</li>
<li>Añadimos esto al final de todos los <em>includes</em>:<br />
<!--INFOLINKS_OFF-->
<pre class="brush: cpp; pad-line-numbers: false; toolbar: false;">add this line #include &quot;compat_sched.h&quot;</pre>
<p><!--INFOLINKS_ON-->
</li>
<li>Salimos del directorio (cd /tmp)</li>
<li>Reemplazamos el arvhivo vmnet de vmware con el que hemos editado:<br />
<code>sudo tar cf /usr/lib/vmware/modules/source/vmnet.tar vmnet-only</code></li>
</ul>
<p>Lo anterior es para evitar el problema con vmnet&#8230; con esto puedes intentar correr de nuevo VMWare. Si lo que ahora falla es el vmci puedes hacer lo mismo pero con el archivo <code>/usr/lib/vmware/modules/source/vmci.tar</code>.<br />
Luego de esto, intentamos iniciar VMware o VMplayer los cuales recompilarán los módulos esta vez sin problemas:</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/vmware-compilacion-correcta.png"><img class="size-full wp-image-3523 aligncenter" title="vmware-compilacion-correcta" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/12/vmware-compilacion-correcta.png" alt="vmware-compilacion-correcta" width="382" height="341" /></a></p>
<h3>SEO thing XD&#8230;</h3>
<p>Pongo los errores como salen en inglés por si alguien los busca así <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<div class="consola">CC [M] /tmp/vmware-root/modules/vmnet-only/vnetEvent.o<br />
CC [M] /tmp/vmware-root/modules/vmnet-only/vnetUserListener.o<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: In function ‘VNetUserListenerEventHandler’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: (Each undeclared identifier is reported only once<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:240: error: for each function it appears in.)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c: In function ‘VNetUserListenerRead’:<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: implicit declaration of function ‘signal_pending’<br />
/tmp/vmware-root/modules/vmnet-only/vnetUserListener.c:282: error: implicit declaration of function ‘schedule’<br />
make[2]: *** [/tmp/vmware-root/modules/vmnet-only/vnetUserListener.o] Error 1<br />
make[1]: *** [_module_/tmp/vmware-root/modules/vmnet-only] Error 2<br />
make[1]: Leaving directory `/opt/temp/linux-2.6.32′<br />
make: *** [vmnet.ko] Error 2<br />
Failed to compile module vmci</div>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/2-6-32/" rel="tag nofollow">2.6.32</a>, <a href="http://casidiablo.net/tag/compilacion/" rel="tag nofollow">compilación</a>, <a href="http://casidiablo.net/tag/error/" rel="tag nofollow">error</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/modulos/" rel="tag nofollow">módulos</a>, <a href="http://casidiablo.net/tag/vmware/" rel="tag nofollow">vmware</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/error-vmware-linux-kernel/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>[how-to] Tu primer módulo cargable para el Linux kernel</title>
		<link>http://casidiablo.net/desarrollar-compilar-modulo-linux/</link>
		<comments>http://casidiablo.net/desarrollar-compilar-modulo-linux/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 20:31:15 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[módulos]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3113</guid>
		<description><![CDATA[

Este how-to está basado en el artículo The Kernel Newbie Corner: Your First Loadable Kernel Module escrito por Rob Day en Linux.com. En él se enseñan las bases de la programación de módulos para el kernel de Linux. Este primer artículo pretende ilustrar de manera clara los conceptos básicos y espero que, a medida que [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fdesarrollar-compilar-modulo-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%5Bhow-to%5D%20Tu%20primer%20m%C3%B3dulo%20cargable%20para%20el%20Linux%20kernel%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float:right;" title="codigo c linux" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/06/codigo-c.png" alt="codigo c" width="150" height="158" />Este how-to está basado en el artículo <a href="http://www.linux.com/news/software/linux-kernel/23685-the-kernel-newbie-corner-your-first-loadable-kernel-module">The Kernel Newbie Corner: Your First Loadable Kernel Module</a> escrito por <a href="http://www.linux.com/community/profile?userid=7433">Rob Day</a> en Linux.com. En él se enseñan las bases de la <strong>programación de módulos para el kernel de Linux</strong>. Este primer artículo pretende ilustrar de manera clara los conceptos básicos y espero que, a medida que Rob vaya escribiendo más artículos, pueda ir traduciéndolos para ofrecer este excelente contenido en español. Además, funciona para cualquier distro, aunque en este caso lo hice todo sobre Gentoo. Sin más, ¡vamos al grano!</p>
<h3>¿Es necesario tener privilegios de root?</h3>
<p style="text-align: justify;">Mientras desarrollamos el módulo, no. Pero al momento de cargar el módulo necesitaremos privilegios administrativos. Por supuesto, es recomendable que el desarrollo lo hagamos con un usuario normal, y solo al final usemos un <strong>usuario root para cargar o remover los módulos</strong>.</p>
<h3>Prerrequisitos</h3>
<p style="text-align: justify;">Antes de comenzar es necesario saber/tener algunas cosas:</p>
<ul style="text-align: justify;">
<li>La versión del kernel con la que vamos a trabajar (usualmente la que estamos corriendo). Esto lo hacemos con el comando <code>uname -r</code>:
<div class="consola">$ uname -r<br />
2.6.29-gentoo-r5</div>
</li>
<li>El uso de herramientas de desarrollo, como <code>gcc</code>, <code>binutils</code>, etc.</li>
<li>Tener instalados las utilidades para trabajar con módulos (<code>insmod</code>, <code>rmmod</code>, etc.), el cual se encuentra en el paquete <code>module-init-tools</code>.</li>
<li style="text-align: justify;">El código del kernel de Linux, de tal manera que puedas compilar tu módulo contra este.</li>
</ul>
<h3>¿Para qué el código del kernel?</h3>
<p style="text-align: justify;">Esto es realmente importante, así que echaremos un vistazo un poco más profundo. <strong>Cuando compilamos un módulo para Linux es necesario tener el código fuente de algunas partes del kernel</strong>, puesto que muchas instrucciones de preprocesador usadas no se encuentran en los <em>headers</em> estándar de desarrollo. En vez de ello, se encuentran en los headers de kernel.</p>
<p style="text-align: justify;">Podrías simplemente descargar el código del kernel directamente de la página oficial, aunque <strong>lo más sencillo es instalar el paquete que corresponda a la versión del kernel que estemos ejecutando</strong>. Por lo general, este tipo de paquetes instala el código en <code>/usr/src</code> o <code>/usr/src/kernels</code>. Por ejemplo, en Fedora el paquete que debes instalar se llama <code>kernel-dev</code>, mientras que en Gentoo es <code>gentoo-sources</code>.</p>
<p style="text-align: justify;">Una vez tengas el código instalado, es necesario saber exactamente en donde se encuentra, de tal manera que podamos referenciarlo al momento de compilar el módulo. Podrías revisar eso manualmente o, mejor aún, buscar el enlace simbólico hacia el kernel, que por lo general se encuentra en <code>/lib/modules</code>:</p>
<div class="consola" style="text-align: justify;">$ ls -l /lib/modules/`uname -r`<br />
total 104<br />
lrwxrwxrwx 1 root root    31 jun 11 10:24 build -&gt; /usr/src/linux-2.6.29-gentoo-r5<br />
&#8230;</div>
<p style="text-align: justify;">El enlace simbólico que buscamos es <code>build</code>, y como puedes ver en el ejemplo, apunta a la raíz del código del kernel. Esto significa que, cada vez que quieras hacer referencia al kernel en el momento de compilar el módulo, basta con usar dicho enlace.</p>
<h3 style="text-align: justify;">&#8220;Hola, kernel!&#8221;</h3>
<p style="text-align: justify;">Bien, es hora de crear nuestro primer módulo. Sin más rodeos, el código sería el siguiente:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">/* El nombre del archivo es 'hola.c'. */
#include &lt;linux/module.h&gt;      // para todos los modulos
#include &lt;linux/init.h&gt;        // para las macros entry/exit
#include &lt;linux/kernel.h&gt;      // para usar la macro printk
#include &lt;asm/current.h&gt;       // informacion del proceso (solo por diversion)
#include &lt;linux/sched.h&gt;       // para usar la estructura &quot;task_struct&quot;
static int hola(void)
{
     printk(KERN_INFO &quot;Hola, el modulo esta siendo cargado.\n&quot;);
     printk(KERN_INFO &quot;El user space del proceso es '%s'\n&quot;, current-&gt;comm);
     printk(KERN_INFO &quot;El PID es  %i\n&quot;, current-&gt;pid);
     return 0;       // para indicar que todo ha salido bien
}
static void adios(void)
{
     printk(KERN_INFO &quot;Chao, el modulo esta siendo removido.\n&quot;);
}
module_init(hola);     // lo que se debe llamar al cargar un modulo
module_exit(adios);    // lo que se debe llamar al remover un modulo

MODULE_AUTHOR(&quot;Robert P. J. Day&quot;);
MODULE_AUTHOR(&quot;Cristian Castiblanco [solo lo puse en castellano]&quot;);
MODULE_LICENSE(&quot;Dual BSD/GPL&quot;);
MODULE_DESCRIPTION(&quot;Aqui puedes poner una descripcion de tu modulo&quot;);</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Algunas observaciones acerca del código de arriba:</p>
<ul style="text-align: justify;">
<li>Técnicamente, <strong>no es necesario imprimir cosas cada vez que se carga o remueve un módulo</strong> (con <code>printk</code>). Pero puesto que es nuestro primer módulo, y aún no hace nada especial, es más divertido si lo dejamos así.</li>
<li><strong>Es necesario hacer que la función de inicio retorne 0</strong>, si queremos indicar que la carga fue satisfactoria.</li>
<li>No, no es necesario poner una coma después de indicar el nivel de logs (<code>KERN_INFO</code>). Es un error común hacerlo.</li>
</ul>
<p style="text-align: justify;">Eso es todo&#8230; ¡vamos a compilarlo!</p>
<h3 style="text-align: justify;">El archivo Makefile</h3>
<p style="text-align: justify;">Este es el archivo Makefile que necesitaremos:</p>
<p style="text-align: justify;"><!--INFOLINKS_OFF-->
<pre class="brush: python;">ifeq ($(KERNELRELEASE),)  

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)  

.PHONY: build clean

build:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules  

clean:
	rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
else  

$(info Building with KERNELRELEASE = ${KERNELRELEASE})
obj-m :=    hola.o

endif</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Como has de saber, <strong>los archivos Makefile indican las reglas necesarias para compilar código</strong>. En este caso, explicándolo a groso modo, lo que hace el Makefile es detectar que aún nos encontramos en el directorio de desarrollo de nuestro módulo, y por lo tanto se dirige al directorio del kernel, compila el módulo desde ahí y se devuelve. Para probarlo basta con ejecutar el comando <code>make</code>:</p>
<div class="consola" style="text-align: justify;">$ make<br />
make -C /lib/modules/2.6.29-gentoo-r5/build  M=/tmp/hola   modules<br />
make[1]: se ingresa al directorio `/usr/src/linux-2.6.29-gentoo-r5&#8242;<br />
Building with KERNELRELEASE = 2.6.29-gentoo-r5<br />
CC [M]  /tmp/hola/hola.o<br />
Building modules, stage 2.<br />
Building with KERNELRELEASE = 2.6.29-gentoo-r5<br />
MODPOST 1 modules<br />
CC      /tmp/hola/hola.mod.o<br />
LD [M]  /tmp/hola/hola.ko<br />
make[1]: se sale del directorio `/usr/src/linux-2.6.29-gentoo-r5&#8242;</div>
<h3 style="text-align: justify;">Examinar el módulo</h3>
<p style="text-align: justify;">Una vez compiles el módulo <strong>obtendrás un archivo con extensión <code>.ko</code></strong>. Si quieres echarle un ojo a dicho archivo, puedes usar el comando <code>modinfo</code> así:</p>
<div class="consola" style="text-align: justify;">$ sudo modinfo hola.ko<br />
filename:       hola.ko<br />
description:    Aqui puedes poner una descripcion de tu modulo<br />
license:        Dual BSD/GPL<br />
author:         Cristian Castiblanco [solo lo puse en castellano <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ]<br />
author:         Robert P. J. Day<br />
depends:<br />
vermagic:       2.6.29-gentoo-r5 SMP mod_unload CORE2</div>
<p style="text-align: justify;">En Gentoo es necesario ejecutarlo con privilegios; en otras distros puedes ejecutarlo normalmente.</p>
<h3 style="text-align: justify;">Cargar o remover el módulo</h3>
<p style="text-align: justify;">Llego la hora de cargar nuestro módulo. Para ello, como comenté anteriormente, es necesario poseer privilegios administrativos. Al grano:</p>
<div class="consola" style="text-align: justify;"># insmod hola.ko<br />
# lsmod<br />
Module                  Size  Used by<br />
hola                    1148  0   &lt;&#8211; GENIAL! Es nuestro módulo!<br />
vboxnetflt             69976  0<br />
vboxdrv                94368  1 vboxnetflt<br />
nvidia               9531788  40<br />
&#8230;<br />
$ sudo rmmod hola</div>
<p style="text-align: justify;">¿Y donde está lo que imprimimos con <code>printk</code>? Bien, no es común imprimir en consola cosas mientras un módulo es cargado o removido; en este caso, <strong>la salida va a dar al archivo de logs principal de Linux</strong> (<code>/var/log/messages</code>); puedes ver la salida con el comando <code>dmesg</code> o directamente en dicho archivo:</p>
<div class="consola" style="text-align: justify;"># dmesg | tail<br />
[20651.176989] Hola, el modulo esta siendo cargado.<br />
[20651.176993] El user space del proceso es &#8216;insmod&#8217;<br />
[20651.176997] El PID es  13786<br />
[20678.497134] Chao, el modulo esta siendo removido.<br />
# tail /var/log/messages</div>
<h3 style="text-align: justify;">Conclusión</h3>
<p style="text-align: justify;">Estas son apenas las bases que deberíamos tener para comenzar con la construcción de un módulo para el kernel de Linux. Es de valiosa ayuda jugar un poco con este ejemplo, de tal manera que podamos estar seguros que todo irá bien cuando hagamos algo un poco más complejo.</p>
<p><a class="tooltip descargacodigo" title="Descargar el código::Contiene: hola.c y Makefile" href="http://casidiablo.net/descargar/Codigo+Kernel+Modulo+Hola">Descargar código fuente del ejemplo</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/modulos/" rel="tag nofollow">módulos</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/desarrollar-compilar-modulo-linux/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
