Módulo cargable en Linux

27 10 2009

Como parte de uno de los cursos que estoy llevando este semestre tuvimos que realizar un módulo cargable “en tiempo de ejecución” en Linux. Este aparte de mostrar mensajes de carga y descarga mediante dmesg, tenía que crear un archivo en el directorio /proc. A continuación la solución.

Primeramente hay que crear el archivo con el código fuente del módulo y agregar el código para el mismo. Abrimos una terminal de comandos y creamos una carpeta para tener un mejor orden y ahí dentro creamos el archivo.

mkdir modulo

cd modulo

nano primerModulo.c

A continuación el código fuente para el módulo.

/* El nombre del archivo es primerModulo */
#include <linux/module.h>          //para los detalles del modulo (Author, License…)
#include <linux/kernel.h>          //para usar la macro printk, KERN_INFO y KERN_ALERT
#include <linux/sched.h>           //para usar la estructura “task_struct”
#include <linux/proc_fs.h>    //para poder hacer la escritura en el archivo que estara en /proc

struct proc_dir_entry *structDirEntrada= NULL;
#define procfs_name “miprimermodulo”    //Nombre del archivo que se creara en /proc
char buff[500];        //buffer para escribir al archivo /proc/miprimermodulo

/*A continuacion viene la funcion de escritura en el archivo en /proc*/
int procfile_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int *eof, void *data){
int len;
static int count=1;
static char bufo[500];
if(offset>0)
return 0;
len=sprintf(bufo, “%s”, buff);
count++;
*buffer_location=bufo;
return len;
}

static int cargar(void){
//create_proc_entry lleva parametros nombre, modo, y padre de la estructura a la que se hace la asignacion.
structDirEntrada = create_proc_entry(procfs_name, 0644, NULL);

if (structDirEntrada == NULL) {
remove_proc_entry(buff, structDirEntrada);
printk(KERN_ALERT “Error: Could not initialize /proc/%s\n”, procfs_name);
return -ENOMEM;
}

//Ingresa el texto que se guardara en el archivo al buffer “buff”
sprintf(buff, “\n*** Hola soy el primer modulo de G10 – 200413044 ***\n\n”);

//A continuacion se setean varios de los parametros a los elementos de la estructura proc_dir_entry
structDirEntrada->read_proc = procfile_read;
structDirEntrada->owner = THIS_MODULE;
structDirEntrada->mode = S_IFREG | S_IRUGO;
structDirEntrada->uid = 0;
structDirEntrada->gid = 0;
structDirEntrada->size = 100000; //Se establece el tamaño del archivo en /proc (bytes)

//Lo siguiente tiene que ir hasta aca porque el estandar ISO C90 prohíbe las declaraciones mezcladas y código
printk(KERN_INFO “********************************************************\n”);
printk(KERN_INFO “* Hola, ahora se inicia la carga del modulo…\n”);
printk(KERN_INFO “* El user space del proceso es ‘%s’\n”, current->comm);
printk(KERN_INFO “* El PID del programa que lo inserto… %i\n”, current->pid);
printk(KERN_INFO “********************************************************\n”);
printk(KERN_INFO “——————————————————–\n”);
printk(KERN_INFO “——————————————————–\n”);
return 0;    //Se retorna 0 para indicar que todo salio bien, de lo contrario retorna != 0
}

static void descargar(void){
printk(KERN_INFO “#######################################\n”);
printk(KERN_INFO “# Se inicia la descarga del modulo… #\n”);
printk(KERN_INFO “#######################################\n”);
remove_proc_entry(buff, structDirEntrada);
}

module_init(cargar);    // Lo que se debe llamar al cargar un modulo
module_exit(descargar);    // Lo que se debe llamar al remover un modulo

MODULE_AUTHOR(“G10 – 200413044”);
MODULE_LICENSE(“Dual MIT/GPL”);
MODULE_DESCRIPTION(“Este es un modulo para la practica 3 de Sistemas Operativos 2.”);
MODULE_VERSION(“1:1.0-Beta1”);
//Existen mas licencias en module.h, y es quiza uno de los paramatros mas importantes.

Cuando terminanos de agregar el código, guardamos y cerramos el archivo. A continuación debemos crear el archivo make para la construcción del modulo. Esto se hace con los comandos siguientes.

nano Makefile


#Codigo del Makefile para la compilacion del modulo…
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
.PHONY: build clean
build:
#— Importante la linea siguiente debe ir tabulada —
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
#— Importante la linea siguiente debe ir tabulada —
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
else
$(info Building with KERNELRELEASE = ${KERNELRELEASE})
obj-m :=    primerModulo.o
endif

Guardamos y cerramos el archivo, a continuación para construirlo, en la terminal de comandos tecleamos el comando. Esto nos crea varios archivos, entre ellos uno con extensión .ko, el cual es módulo a cargar en sí.

make

Podemos ver las propiedades del modulo con el comando

modinfo primerModulo.ko

A continuación montamos/insertamos el módulo en el sistema, esto se hace con el comando

sudo insmod primerModulo.ko

Podemos ver los mensajes de bitacora del módulo con el comando

dmesg

Con el modulo ya cargado podemos ver que en /proc se creó el archivo que tiene como objetivo el módulo, este lo podemos abrir con programas como nano, cat o less. Cabe mencionar que este archivo es accesible unicamente mientras el módulo este cargado, cuando se descarga aparece, pero no es accesible.

cat /proc/miprimermodulo

Ahora tenemos que descargar el módulo, esto se hace con el comando.

sudo rmmod primerModulo

Para ver todos los mensajes de bitácora del módulo, podemos teclear el comando siguiente.

tail /var/log/messages

Este es un módulo bastante básico, sin embargo, bastante interesante para iniciarse en la programación de los mismo o simplemente para saber como funcionan los mismos.

Referencias:





Youtube sin sonido en Kubuntu 9.04

20 09 2009

Quizá el titulo no sea el más adecuado, pero puede que sea el más descriptivo y fácil de buscar para alguien que puede toparse con el mismo problema. Todo esto dado que, no son solo los videos de youtube, sino cualquier video que se encuentre en la web y que este basado en flash (como los de youtube) tiene ese problema.

Sucede que luego de la instalación de Kubuntu y posteriormente de Firefox, al reproducir un video, solo podemos observar el mismo pero no se escucha el sonido de este. A continuación les dejo la solución que yo encontré, pues aunque parece lógico, pero por algo tan simple yo pase como una semana (por cuestiones de hueva y principalmente de tiempo), sin poder escuchar los dichosos videos, pues también espere a que cargaran completamente (y literalmente hueviarmelos de la carpeta /tmp) y luego reproducirlos en VLC player, pero tampoco se escuchaba el sonido.

Lo que hay que hacer es dar un click sobre el ícono de la bocina (de KMix) que aparece en la parte inferior derecha de la pantalla (en el panel  de tareas). Seguidamente dar click sobre el botón mezclador. Eso abrirá una ventana pequeña donde lo único que tenemos que hacer es (con un click sostenido) subir el control que aparece en el medio de la ventana siguiente (PCM).

ventanaKMix

ventanaKMix

Y uuuala!, ya hay sonido para los videos…





JUnit y Asserts

4 07 2009

A continuación les presento una investigación sobre el framework de pruebas para codigo Java JUnit, este framework es uno de los mas utilizados para la realización de pruebas unitarias de código Java y sabiendolo implementar se suele utilizar en pruebas de integración. Su uso principalmente esta basado en la utilización de asserts, término que en la investigación no se deja de lado.

A continuación les dejo el link para que puedan descargar el material en formato pdf. JUnit_Asserts





Ubuntu Jaunty Jackalope Party

8 05 2009

En los últimos días se ha estado organizando una pequeña reunión de tipo informal, esto en conmemoración del nuevo release de Ubuntu y a la vez por la formación de una manera más formal del grupo de usuarios de Ubuntu en Guatemala, ubuntu-gt y la migración de este a donde estan concetradas las listas de Ubuntu al rededor del mundo.

Esta actividad tiene como finalidad principal que todos se conozcan entre sí, ya que en la web, listas de correos y canales IRC en muchas ocasiones uno sólo sabe el nombre o el nick de la mara, sin embargo, son muy pocos a los que conocemos en persona. Pero eso no es impedimento para que quien tenga una duda sobre Ubuntu, quiera una copia del sistema, hacer un par de instalaciones o que simplemente quiera participar, no llegue. A esta actividad están todos cordialmente invitados. La misma se estará llevando a cabo en:

Plaza Fontabella, Sophos el día sábado 16 de mayo en horario de 1600 a 1900 hrs. (aproximadamente), este lugar esta ubicado en la 4ta.  Av. 12-59 zona 10

Ubuntu Jackalope Party

Ubuntu Jackalope Party

Todos los que esten en el rollo, los que no (quizá usan otra distro) y los que se quieran iniciar son bienvenidos.

Y para quienes gustan del beber… luego de esta reunión en un horario mas “decente”, nos estaremos trasladando a un lugar mas “decente” para el respectivo e infaltable post-evento.   😀  😀  😀

Mapa del lugar

Mapa del lugar

Para quienes no conocen Sophos, yo igual no conozco, pero el Dios programador bendiga a googleMaps.   😀





Nueva lista de información de Ubuntu-gt

5 05 2009

Hasta el día de hoy todos los usuarios de Ubuntu concentrados en Guatemala (así como también algunos extranjeros), hacen uso de uno de los tan utiles grupos de Google, sin embargo, con miras a ser reconocidos y obtener apoyo de parte de Canonical, se ha tomado la decisión de que deje de funcionar este grupo, para migrar hacia uno de los foros oficiales destinados para esto.

Es por eso que a partir del viernes 15 de mayo la lista de google groups de ubuntu-guatemala, será cerrada, esto por la confusión que se genera por el hecho de usar dos listas (la de google groups y esta nueva) y que no se tiene concentrada a todas las personas en un lugar en común.

Es por ello que de ahora en adelante la lista que se utilizará será https://lists.ubuntu.com/mailman/listinfo/ubuntu-gt ahí pueden suscribirse para ser parte de esta lista y a la vez acá pueden remitir a las nuevas almas que se quieran iniciar o unir a este team.





Ubuntu Release Party

5 05 2009

Así es como se conoce a la fiesta/reunión que se realiza (aunque no obligatoriamente) cada vez que sale una nueva versión de Ubuntu y acá en Guatemala se tiene en mente la realización de una de estas fiestas, aún no hay nada concreto, sin embargo, se espera que se pueda organizar y se esta coordinando para que se logre.

Esta es una reunión de caracter no tan formal, pues de lo que se trata es de intercambiar ideas o hacer comentarios sobre las nuevas caracteristicas y mejoras del nuevo release de este sistema operativo, así como también molestar un rato con los cuates.

Si quieren enterarse aún más sobre esta actividad, quieren participar, aportar ideas o simplemente curiosear, este martes 05 de mayo en horario de las 2100 hrs. se estará realizando una reunión para definir detalles para esta actividad. La reunión se llevará a cabo mediante IRC en el servidor irc.freenode.net en el canal #ubuntu-gt

Y a cualquier hora también son bienvenidos en el canal casi siempre hay alguien (gente que conoce bastante del tema) que les puede ayudar con alguna duda que tengan, solo que quiza si deben de tener un poco de paciencia, pues como bien lo profesa el lema del canal… “Bienvenidos a Ubuntu Guatemala – Haz tu pregunta con confianza”.

A continuacion les dejo el link del wiki para la realización del evento, para que le den una ojeada y tengan una idea de lo que se quiere y tiene pensado https://wiki.ubuntu.com/GuatemalanTeam/Re_UBR_01

También aca esta el wiki del team de Ubuntu Guatemala, acá hay información sobre eventos, un enlace directo al canal de IRC (mediante tu browser), entre otras cosas    https://wiki.ubuntu.com/GuatemalanTeam

Enlace directo al canal de ubuntu-gt  irc.freenode.net, #ubuntu-gt





Amigos de Facebook en Pidgin

6 01 2009

Pidgin

Pidgin

Sí, así es, Pidgin es tan bueno que nos da la posibilidad de poder chatear con nuestros amigos de Facebook ahora desde su entorno gráfico, sin necesidad de tener que logguearnos a la página de la ya famosa red social. Y para poder lograr esto es necesario descargar el plugin pidgin-facebookchat, el cual esta disponible en .deb para distribuciones Debian y Ubuntu, así como también para las demas distribuciones empaquetado en .bz2 y como Pidgin es multiplataforma, también esta disponible en .exe para Windows.

Facebook chat es el cliente de mensajería instantanea integrado en Facebook, el cual esta basado en Jabber (utilizado por googleTalk), que es un protocolo de mensajería instantanea basado en software libre (por lo cual nos da todos beneficios y libertades del mismo), con varios servidores al rededor del mundo y la alternativa con mas auge a sus contrapartes no libres como Windows Live Messenger, Yahoo Messenger, entre otros.

Lista de amigos Facebook

Lista de amigos Facebook

Así es de bueno el Software Libre, entonces a disfrutar.

Visto en:      Desde Ubuntu para el mundo

Pluggin:        Pluging pidgin-facebookchat