Suscribirse al Feed
26Jun

[how-to] Tu primer módulo cargable para el Linux kernel

codigo cEste 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 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!

¿Es necesario tener privilegios de root?

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 usuario root para cargar o remover los módulos.

Prerrequisitos

Antes de comenzar es necesario saber/tener algunas cosas:

  • La versión del kernel con la que vamos a trabajar (usualmente la que estamos corriendo). Esto lo hacemos con el comando uname -r:
    $ uname -r
    2.6.29-gentoo-r5
  • El uso de herramientas de desarrollo, como gcc, binutils, etc.
  • Tener instalados las utilidades para trabajar con módulos (insmod, rmmod, etc.), el cual se encuentra en el paquete module-init-tools.
  • El código del kernel de Linux, de tal manera que puedas compilar tu módulo contra este.

¿Para qué el código del kernel?

Esto es realmente importante, así que echaremos un vistazo un poco más profundo. Cuando compilamos un módulo para Linux es necesario tener el código fuente de algunas partes del kernel, puesto que muchas instrucciones de preprocesador usadas no se encuentran en los headers estándar de desarrollo. En vez de ello, se encuentran en los headers de kernel.

Podrías simplemente descargar el código del kernel directamente de la página oficial, aunque lo más sencillo es instalar el paquete que corresponda a la versión del kernel que estemos ejecutando. Por lo general, este tipo de paquetes instala el código en /usr/src o /usr/src/kernels. Por ejemplo, en Fedora el paquete que debes instalar se llama kernel-dev, mientras que en Gentoo es gentoo-sources.

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 /lib/modules:

$ ls -l /lib/modules/`uname -r`
total 104
lrwxrwxrwx 1 root root    31 jun 11 10:24 build -> /usr/src/linux-2.6.29-gentoo-r5
...

El enlace simbólico que buscamos es build, 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.

"Hola, kernel!"

Bien, es hora de crear nuestro primer módulo. Sin más rodeos, el código sería el siguiente:


/* El nombre del archivo es 'hola.c'. */
#include <linux/module.h>      // para todos los modulos
#include <linux/init.h>        // para las macros entry/exit
#include <linux/kernel.h>      // para usar la macro printk
#include <asm/current.h>       // informacion del proceso (solo por diversion)
#include <linux/sched.h>       // para usar la estructura "task_struct"
static int hola(void)
{
     printk(KERN_INFO "Hola, el modulo esta siendo cargado.\n");
     printk(KERN_INFO "El user space del proceso es '%s'\n", current->comm);
     printk(KERN_INFO "El PID es  %i\n", current->pid);
     return 0;       // para indicar que todo ha salido bien
}
static void adios(void)
{
     printk(KERN_INFO "Chao, el modulo esta siendo removido.\n");
}
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("Robert P. J. Day");
MODULE_AUTHOR("Cristian Castiblanco [solo lo puse en castellano]");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("Aqui puedes poner una descripcion de tu modulo");

Algunas observaciones acerca del código de arriba:

  • Técnicamente, no es necesario imprimir cosas cada vez que se carga o remueve un módulo (con printk). Pero puesto que es nuestro primer módulo, y aún no hace nada especial, es más divertido si lo dejamos así.
  • Es necesario hacer que la función de inicio retorne 0, si queremos indicar que la carga fue satisfactoria.
  • No, no es necesario poner una coma después de indicar el nivel de logs (KERN_INFO). Es un error común hacerlo.

Eso es todo... ¡vamos a compilarlo!

El archivo Makefile

Este es el archivo Makefile que necesitaremos:


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

Como has de saber, los archivos Makefile indican las reglas necesarias para compilar código. 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 make:

$ make
make -C /lib/modules/2.6.29-gentoo-r5/build  M=/tmp/hola   modules
make[1]: se ingresa al directorio `/usr/src/linux-2.6.29-gentoo-r5'
Building with KERNELRELEASE = 2.6.29-gentoo-r5
CC [M]  /tmp/hola/hola.o
Building modules, stage 2.
Building with KERNELRELEASE = 2.6.29-gentoo-r5
MODPOST 1 modules
CC      /tmp/hola/hola.mod.o
LD [M]  /tmp/hola/hola.ko
make[1]: se sale del directorio `/usr/src/linux-2.6.29-gentoo-r5'

Examinar el módulo

Una vez compiles el módulo obtendrás un archivo con extensión .ko. Si quieres echarle un ojo a dicho archivo, puedes usar el comando modinfo así:

$ sudo modinfo hola.ko
filename:       hola.ko
description:    Aqui puedes poner una descripcion de tu modulo
license:        Dual BSD/GPL
author:         Cristian Castiblanco [solo lo puse en castellano :P ]
author:         Robert P. J. Day
depends:
vermagic:       2.6.29-gentoo-r5 SMP mod_unload CORE2

En Gentoo es necesario ejecutarlo con privilegios; en otras distros puedes ejecutarlo normalmente.

Cargar o remover el módulo

Llego la hora de cargar nuestro módulo. Para ello, como comenté anteriormente, es necesario poseer privilegios administrativos. Al grano:

# insmod hola.ko
# lsmod
Module                  Size  Used by
hola                    1148  0   <-- GENIAL! Es nuestro módulo!
vboxnetflt             69976  0
vboxdrv                94368  1 vboxnetflt
nvidia               9531788  40
...
$ sudo rmmod hola

¿Y donde está lo que imprimimos con printk? Bien, no es común imprimir en consola cosas mientras un módulo es cargado o removido; en este caso, la salida va a dar al archivo de logs principal de Linux (/var/log/messages); puedes ver la salida con el comando dmesg o directamente en dicho archivo:

# dmesg | tail
[20651.176989] Hola, el modulo esta siendo cargado.
[20651.176993] El user space del proceso es 'insmod'
[20651.176997] El PID es  13786
[20678.497134] Chao, el modulo esta siendo removido.
# tail /var/log/messages

Conclusión

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.

Descargar código fuente del ejemplo

25Jun

Video Tutoriales – Creación de Juegos

videoLa siguiente es una recopilación de tutoriales hechos por Jorge Rubira, en donde explica el desarrollo de diferentes juegos en diferentes lenguajes de programación (Java, JSP, laszlo, etc.)

24Jun

[How-to] Instalar Firefox 3.5 RC en Gentoo

Hola a todos, mi nombre es Juan Esteban (Cortex), y al igual que mi amigo Cristian uso la meta-distribución Gentoo Linux. Para los que no lo sabían la organización Mozilla anda trabajando actualmente en la versión 3.5 del navegador Firefox y hace un par de días se encuentra disponible la versión Release Candidate 2, la cual incluye ya múltiples mejoras y agregados.

Entre sus nuevas funciones podemos destacar:

  • La posibilidad de ver videos sin hacer uso de plugins ó reproductores externos.
  • La disponibilidad del modo de navegación privado y la herramienta para limpiar el historial, la cual ha sido actualizada, permitiendo seleccionar también el rango de tiempo del cual se hará la limpieza.
  • Controlar los resultados de la barra de localización haciendo uso de caracteres especiales.
  • Mucho más...

Ahora bien, veamos como podemos instalarlo en Gentoo.

1. Actualizar el árbol de Portage

Lo primero es actualizar el árbol de Portage para poder hacer uso del ebuild de Firefox 3.5 RC2.

emerge --sync

Para verificar si ya se encuentra disponible el ebuild en nuestro directorio de Portage, podríamos hacerlo de la siguiente manera:

ls -l /usr/portage/www-client/mozilla-firefox-bin/ | grep 3.5

2. Desenmascarar el paquete

Al ser una versión aún inestable el paquete viene por defecto enmascarado así que debemos primero desenmascararlo para poder hacer uso de él.

touch /usr/portage/profiles/package.unmask # En caso de que no tengas el archivo creado
echo '>=www-client/mozilla-firefox-bin-3.1_alpha1' >> /usr/portage/profiles/package.unmask
Advertencia: Recuerda que aún es una versión de pruebas y no debería de ser usada sino para eso, probar. Además los bugs que detectes no deben ser reportados al Bugzilla de Gentoo sino directamente a Mozilla.

3. Instalar Firefox 3.5 RC2

De momento sólo se encuentra disponible el paquete precompilado. Para instalarlo con el idioma español podríamos editar nuestro archivo /etc/make.conf y agregarle la línea:

LINGUAS="es es_ES"

En caso de que sólo quieras hacerlo temporalmente y sólo para este paquete ó agregar también el soporte para otros idiomas, puedes anteponer la línea escrita anteriormente al emerger el paquete.

Ahora sí, instalemos:

emerge -av =mozilla-firefox-bin-3.5_rc2
Nota: Recuerda agregar un = antes del paquete para especificarle cual es la versión que queremos instalar, si no lo haces te aparecerá que el ebuild no existe.

4. Ejecutar Firefox

En Gnome se encuentra en el menú Aplicaciones -> Internet -> Mozilla Firefox (bin). Sí, el que tiene el ícono más colorido :)

Con esto terminamos. Espero les sirva, y además espero escribir más seguido :P

Saludos!

16Jun

[how-to] Activando soporte para ext4 en Gentoo u otras distros

Este es un pequeño how-to en donde explico cómo activar el soporte para el sistema de archivos ext4 en Gentoo.  El tutorial está enfocado hacia distribuciones que, como Gentoo, no tengan activado dicho soporte y en donde es necesario recompilar el kernel para hacerlo funcionar.

Espero que sirva de paso para mostrar un poco el proceso de recompilación del kernel, que a primera vista puede sonar difícil, pero que en realidad es algo muy sencillo y saludable ;)

0. Prerequisitos

Es necesario tener el paquete e2fsprogs y las fuentes del kernel de linux. Para ello, basta con ejecutar este comando:

emerge -au e2fsprogs gentoo-sources

1. Configurando nuestro kernel

Lo que haremos a continuación será configurar el kernel para activar el soporte al sistema de archivos ext4. Para ello, abrimos una consola y entramos en el directorio donde se encuentren las fuentes, por ejemplo /usr/src/linux-2.6.30-gentoo-r5. Estando allí, iniciamos el configurador gráfico del kernel con este comando:

make menuconfig

Una vez hayamos hecho esto, debemos navegar y dar enter en la opción File systems, y seleccionar (con la tecla espacio) The Extended 4 (ext4) filesystem. Debería quedar así:

File systems  --->
     <*> The Extended 4 (ext4) filesystem
     [ ]   Enable ext4dev compatibility
     [ ]   Ext4 extended attributes
     [ ]     Ext4 POSIX Access Control Lists
     [ ]     Ext4 Security Labels

Además, por defecto las particiones que se crean con ext4 tienen activada la opción huge_file, lo cual permite que se manejen ficheros de un gran tamaño. Por ello, es necesario activar la opción Support for Large single files del kernel. Dicha opción se encuentra en Enable the block layer y debería lucir así:

Enable the block layer --->
     --- Enable the block layer
     [*]   Support for Large single files

Una vez hayamos configurado el kernel, salimos de la configuración presionando el botón exit, compilamos e instalamos:

make
cp arch/x86/boot/bzImage /boot/kernel <-- depende de tu configuración

2. Crear y montar particiones con el sistema de archivos ext4

Para ello basta con usar el comando mkfs.ext4, por ejemplo:

mkfs.ext4 /dev/sda2

Para montar la partición:

mount -t ext4 /dev/sda2 /media/cosas

3. Convirtiendo ext3 a ext4

Ten en cuenta que puedes montar una partición ext3 con la opción -t ext4 y todo funcionará bien, aunque no tendrás disponibles las características de ext4. Si deseas, puedes convertir una partición que se encuentra en ext3 a ext4. Para ello puedes ejecutar el siguiente comando:

Advertencia: esto hará que no puedas volver a montar la partición como ext3.
tune2fs -O extents,uninit_bg,dir_index /dev/dispositivo

Es recomendable hacer un chequeo de la partición para verificar que todo haya salido bien:

fsck -pf /dev/dispositivo

Más información:

http://fr.gentoo-wiki.com/wiki/Ext4

10Jun

Video Tutorial de Introducción a MonoDevelop

¡Hola de nuevo! En esta ocasión me gustaría compartir con ustedes este video tutorial acerca de MonoDevelop. No es nada avanzado, solo muestra algunas características de este IDE. El video en cuestión lo grabé hace más o menos siete meses, pero casualmente había olvidado que lo había grabado :P Y, aunque ya vamos en la versión 2 de MonoDevelop, no quiero perder el trabajo que alguna vez hice.

Como siempre, pueden encontrar el vídeo en Youtube o en Vimeo. Aunque creo que hay un pedazo que se ve feo y el sonido no es el mejor, espero que les guste y disculpen lo feo :D

11May

Video Tutorial VirtualBox: ejecutar sistemas operativos REALES

Hola amigos... he grabado un pequeño vídeo en donde enseño cómo ejecutar varios sistemas operativos REALES, es decir, que no son virtuales, al mismo tiempo usando VirtualBox. Por ejemplo, si tienes instalado Windows XP, Ubuntu y Fedora, y en cada uno tienes aplicaciones que usas a diario, podrías ejecutar Windows XP desde Ubuntu sin necesidad de tener que reiniciar el equipo.

Esto tiene una gran ventaja frente al típico entorno en el cual tienes máquinas virtuales instaladas ya que, cuando realmente quieras usar el otro sistema operativo, lo ejecutas directamente en tu máquina sin las limitaciones de RAM o aceleración gráfica. Es más o menos lo que explicaba en esta entrada, en donde lo hacia con Windows XP. Pero puesto que algunos han tenido problemas con eso, y otros más me han pedido algo de información más detallada, mejor dejar todo registrado en este vídeo.

Como siempre lo he subido en Blip.tv, Youtube y Vimeo. El vídeo es completamente libre, puedes darle el uso que desees; si deseas el vídeo original para cualquier propósito me contactan por correo.

© 2007 - 2008 Dezinerfolio. Todos los derechos reservados.
Powered by Wordpress. Entradas RSS