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:

Anuncios




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…





bootchart

10 06 2009

Es una utilidad que existe en varias de las distribuciones de Linux, entre ellas openSuSE que es la distribución que estoy usando actualmente. A pesar de su simplicidad brinda mucha información interesante. Este programa muestra un gráfico en donde podemos apreciar todo lo que sucede durante la carga de nuestro sistema, se puede apreciar un eje X donde aparece el tiempo que transcurre durante la carga del sistema y en el eje Y aparece la carga al CPU, la utilización de la RAM, los procesos que se ejecutan y sus respectivos estados durante el tiempo de carga (aparte de la información general del sistema).

A continuación dejo un screenshot de lo que salio al ejecutarlo en mi máquina.

Encabezado bootchart

Encabezado bootchart

Entre los parametros mas relevantes están (ninguno es obligatorio)

  • -o  <direccion_para_guardar_imagen>
  • -f  <formato_de_imagen_(png, eps, o svg -default- )>

Sitios





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.   😀





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





Sábados de Software Libre (5)

19 03 2009

Se viene el quinto Sábado de Software Libre. Esta vez esta orientado a usuarios finales, así que pueden invitar a quien quieran, igualmente la invitación es para todos.

SSL5

SSL5





Instalar Windows después de Linux

15 03 2009

Más de alguno talvez piensa que es dificil o que no es dificil la cuestion de la recuperada del grub, que Windows hecha a perder cuando se instala, gracias a que este sistema operativo (SO) no respeta el espacio y el libre albedrio de los demas sistemas que no sean sus hermanos (digase cualquier otra “distribución de Windows”, como dijo un cuate).

Total tenía instalado únicamente GNU/Linux en mi máquina y por gajes del oficio (o de la carrera, cosa que no me enoja en absoluto) tuve que instalar el otro SO, fue entonces cuando estuve pensando y pensando que hacia si instalaba Win en todo mi disco y luego reinstalar Linux o arriesgarme a posiblemente perder mis datos (en Linux) y ver como instalaba Windows manteniendo mis configuración de Linux, lo que no sabia es que sí se puede hacer una instalación limpia (y es por eso que hoy escibo esta entrada).

Como esta carrera es mucho de prueba y error, entonces hice un pequeño backup con unicamente los datos mas importantes (arriesgue hasta los varios capitulos de Futurama que ya habia bajado, los deje en disco duro) y me puse a hechar punta.

Primero hay que crear una partición NTFS. Si alguien ha intentado crear una particion con gParted, QtParted o desde la consola (como yo lo intente), cuando su sistema esta corriendo ya se habrán dado cuenta que no les dejará. Esto se debe a que las particiones deben estar desmontadas, por eso se debe hacer con un liveCD (lCD), así por ejemplo yo tengo un linuxMint. Entonces hay que insertar el lCD y reiniciar el ordenador, cuando el sistema del lCD este cargado, hay que elegir la opción <nombreDeMujer> -> Administración -> Partition Editor, ahí nos mostrará una ventanita con las particiones de nuestro disco, le damos click derecho a la partición que queremos redimensionar (generalmente será la de mayor espacio) y elegimos la opción Resize/Move y creamos la partición, esto nos creará un espacio no asignado, el cual luego de terminar la redimensión hay que formatear con sistema de archivos NTFS (clickDerecho -> Format to). Luego pues instalamos Windows en la particion creada (en la instalación elegir la partición del tamaño que creamos).

Cuando se termine la instalación de Windows y se reinicie… sorpresa!!!, hizo mierda el grub, todo porque como ya dije no respeta la libre existencia de la demas mara (SO’s) en el mismo disco. Bueno, cuando yo ya estaba, en este punto tenía hueva de usar superGrub, así que me dispuse a experimentar algo nuevo y que me pasaba por la cabeza. Fue entonces cuando se me ocurrio ver la tabla de particiones, redefinir la partición de “buteo”  y modificar el archivo menu.lst, de esa partición. Asi que volvi a meter el lCD, cuando el sistema cargo, abrí una una terminal (<nombreDeMujer> -> Accesorios -> Terminal) y escribí el comando para listar la tabla de particiones.

sudo fdisk -l #Te mostrará algo como lo que sigue, el orden en que lo muestre no importa, lo que si importa es notar los números enteros X, Y, Z, W.

Device        Boot      Start         End      Blocks               Id     System
/dev/sdaX       *           1               3824    30716248+   7      HPFS/NTFS
/dev/sdaY                 3825       14242    83682585      83     Linux
/dev/sdaZ                 14243       14593     2819407+   5       Extended
/dev/sdaW                14243       14593     2819376      82     Linux swap / Solaris

Donde X, Y, Z, W son números enteros. Lo que hay que hacer acá es redefinir la partición del boot (la del asterisco), para esto tecleamos

sudo fdisk /dev/sda #accedemos al gestor de particionamiento desde consola sobre el disco seleccionado.

a #Pulsamos a y luego enter, nos pedira un numero de partición ingresamos X, para quitarle el asterisco.

a #Pulsamos a de nuevo y luego enter, nos pedirá un numero de partición ingresamos Y, para asignar la nueva partición de “buteo”.

w #Pulsamos w y luego enter, con esto guardamos los cambios y salimos del programa de particionamiento.

sudo mount -t ext3 /dev/sdaY    /home/mint #montamos la partición que contiene nuestro sistema Linux.

sudo nano /home/mint/boot/grub/menu.lst #con el programa nano vamos a modificar el archivo menu.lst

#al final del archivo agregamos lo siguiente, para que en el menu del grub, poder elegir el otro SO

title                    <algunTituloParaWind>
rootnoverify    (hd0,X-1)
makeactive
chainloader     +1

#mas arribita en el archivo donde encontremos la linea    root  (hd0,n) (donde n es un numero entero) la debemos cambiar por    root    (hd0,Y-1)

#Pulsamos    Ctrl-X, luego   Y y luego   enter, con esto habremos guardado y salido del programa nano.

Cerramos la ventana de la terminal y reiniciamos el sistema (<nombreDeMujer> -> Salir -> Restart). Y… uuuaaala! todo ha regresado a la normalidad.

Bueno ojala y alguien le sirva esto. Si, mas de alguien dirá “que vergueo, mejor usa superGrub”, pero mi huevo… que de ahuevo es saber como funcionan las chivas a fondo, por lo menos ahora ya se como funciona superGrub y los programas de particionamiento y porque lo que tienen que hacer lo hacen cuando se reinicia el sistema.

Un saludo a todos los lectores.