Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ddmmvv12 en 1 Abril 2011, 03:10 am



Título: Modulo en Linux
Publicado por: ddmmvv12 en 1 Abril 2011, 03:10 am
Hola necesito hacer 2 modulos en linux que hagan lo siguiente

El objetivo de la práctica consiste en la implementación de dos módulos cargables en el núcleo de Linux. Dichos módulos A y B
deberán realizar las siguientes acciones:
1. Ambos módulos han de mostrar en el momento de inserción y de extracción un mensaje informativo mediante la función
del núcleo printk () con los siguientes datos:
• El instante de inserción y de extracción (Dato que se puede obtener de 3 formas distintas:
• Para ello se puede consultar la variable xtime(kernel/sched.c:52 volatile struct timeval xtime. struct timeval esta
definido en include/linux/time.h:12.
• Utilizar la macro CURRENT_TIME
• Invocar la función void do_gettimeofday(struct timeval *tv) que ofrece precisión en micro segundos.
• El pid del proceso invocante de la orden correspondiente (insmod o rmmod).
Para ello habrá que acceder a la estructura que mantiene la información sobre el proceso padre del proceso actual. El
proceso actual será el propio insmod o rmmod. Al proceso actual se puede acceder con la macro current definida en
include/linux/sched.h:323 que es un puntero a la estructura del proceso (struct task_struct *). En dicha estructura
son de interés, para este caso, las entradas siguientes:
int pid; /* pid del proceso */
struct task_struct * p_pptr; /* puntero al proceso padre */
El tipo struct task_struct está definido en include/linux/sched.h:174
2. Además de imprimir la información anterior, el modulo A deberá implementar una función pública del tipo yo-he-estadoaquí, que muestre, al igual que en caso anterior, en qué instante ha sido invocada, y qué proceso (pid). A su vez, deberá
registrar en una variable interna, cual ha sido la última visita recibida, y mostrar su información cuando el modulo A sea
extraído del núcleo cleanup_module.
3. El módulo B deberá visitar al modulo A, invocando a la función yo-he-estado-aquí, tanto al ser insertado en el núcleo, como
al ser extraído del mismo.

Pueden ayudarme, darme ideas , consejos, documentación

Gracias !!!


Título: Re: Modulo en Linux
Publicado por: satu en 1 Abril 2011, 09:04 am
Hola

Aquí nadie te va a hacer la tarea, postea el code que llevas hecho hasta ahora y te podrán ayudar, yo no te puedo orientar porque no tengo idea del kernel de linux, lo siento. Pon lo que tengas hasta ahora. Puedes buscar en google las funciones que debes utilizar para orientarte y tener una idea de lo que tienes que hacer.

Saludos


Título: Re: Modulo en Linux
Publicado por: Leber en 1 Abril 2011, 14:49 pm
ddmmvv12, pon lo que tengas hecho, y se te ayudará.

De todos modos, eso es parte de un libro? Es que me interesa ese tipo de temario.


Título: Re: Modulo en Linux
Publicado por: ddmmvv12 en 1 Abril 2011, 17:37 pm
Hola. la idea no es que me hagan la tarea, lo que pasa es que nunca he hecho un programa en C para Linux y menos para el Kernel. Lo que necesito es que me orienten o me brinden funciones que me puedan servir o una buena documentación

para satu, es una practica de la universidad

Gracias


Título: Re: Modulo en Linux
Publicado por: D4RIO en 1 Abril 2011, 18:04 pm
Por un lado, lo que dicen es correcto, esto no es para que te hagan la tarea, pero por otro, lo que solicitas es documentación, así que te facilito algo, y nos posteas el código y lo que has resuelto, de manera que lo que te ayudamos se vuelva una ayuda para todos cuando pongas lo que has aprendido, y de donde.

http://casidiablo.net/desarrollar-compilar-modulo-linux/ (http://casidiablo.net/desarrollar-compilar-modulo-linux/)
http://es.tldp.org/Manuales-LuCAS/doc-progmodlinux/doc-progmodlinux-html/ (http://es.tldp.org/Manuales-LuCAS/doc-progmodlinux/doc-progmodlinux-html/)
http://rdebug.blogspot.com/2010/08/programar-modulos-para-el-kernel-en-c.html (http://rdebug.blogspot.com/2010/08/programar-modulos-para-el-kernel-en-c.html)
http://www.wikilearning.com/tutorial/guia_de_programacion_de_modulos_del_nucleo_linux-llamadas_al_sistema/9762-9 (http://www.wikilearning.com/tutorial/guia_de_programacion_de_modulos_del_nucleo_linux-llamadas_al_sistema/9762-9)
http://www.ubuntu-es.org/node/49313 (http://www.ubuntu-es.org/node/49313)
http://www.wikilearning.com/tutorial/guia_de_programacion_de_modulos_del_nucleo_linux-hola_mundo/9762-2 (http://www.wikilearning.com/tutorial/guia_de_programacion_de_modulos_del_nucleo_linux-hola_mundo/9762-2)

Dedica tiempo a leer, a ejercitar, y retribuye con lo que aprendiste

Saludos!


Título: Re: Modulo en Linux
Publicado por: ddmmvv12 en 1 Abril 2011, 20:12 pm
Gracias por la ayuda, me doy cuenta que es básicamente igual que programar C en Windows

pongo una parte del codigo, podrian ayudarme en la ultima sentencia . cual es el indicador para variable tipo "struct timespec" que es lo que me pide en la compilacion

GRACIAS !!


#include <linux/module.h>     

#include <linux/init.h>       

#include <linux/kernel.h>     

#include <linux/sched.h>       
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);
     printk("la hora es * , CURRENT_TIME)
   


     return 0;     
1


Título: Re: Modulo en Linux
Publicado por: D4RIO en 2 Abril 2011, 19:54 pm
Usa las etiquetas de código o el menú de código personalizado para hacer más legible tu código.

Por otra parte, en la última línea escribías:
Código
  1.    printk("la hora es * , CURRENT_TIME)
  2.  
Esto no tiene ';' al final, ni termina las comillas, supongo que será un error. Reemplazandolo y dejandolo como lo indico debajo, compila correctamente. Deberías agregarle información para modinfo (por ejemplo: MODULE_AUTHOR, MODULE_DESCRIPTION).

Código
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/kernel.h>
  4. #include <linux/sched.h>
  5.  
  6. static int hola(void)
  7. {
  8.  
  9.     printk(KERN_INFO "Hola, el modulo esta siendo cargado.\n");
  10.     printk(KERN_INFO "El user space del proceso es '%s'\n", current->comm);
  11.     printk(KERN_INFO "El PID es  %i\n", current->pid);
  12.     printk("la hora es *" , CURRENT_TIME);
  13.  
  14.  
  15.  
  16.     return 0;    
  17. }