• Martes 7 de Mayo de 2024, 22:22

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - marcialre

Páginas: [1]
1
C/C++ / Re: Ubicación y obtención de task_struct
« en: Domingo 25 de Octubre de 2009, 15:37 »
No tiene muchas utilidades acceder a la estructura task_struct o hacerse un mapa de la memoria (excepto en depuradores). Como bien dices en el otro hilo, un mecanismo de protección de memoria en el espacio de usuario puede ocultar las causas de los errores y hacer muy difícil la depuración. Mis preguntas son simplemente para saber algo más, curiosidad.

Gracias otra vez.

2
C/C++ / Re: Ubicación y obtención de task_struct
« en: Domingo 25 de Octubre de 2009, 01:56 »
Si que lo está... La idea era obtener el puntero mm_struct *mm (entre otras cosas) para conocer el mapa de memoria del proceso.

Por ahora la mejor opción es leer /proc/self/maps. Seguiré investigando.

EI: juntando mensajes.

La estructura task_struct (<2.6) o thread_info (=2.6) se encuentra al final de al pila del núcleo, es decir, no es accesible en modo usuario. Para acceder a ella no queda más remedio que programar una llamada al sistema. Una cosa es no hacer uso de la librería estándar y limitarse a las llamadas al sistema y otra muy diferente es añadir llamadas al sistema... Portabilidad = 0.

Gracias por la ayuda.

3
C/C++ / Re: Comprobar de forma segura el acceso a memoria
« en: Domingo 25 de Octubre de 2009, 01:54 »
El archivo /proc/self/maps (man proc) nos da toda la información necesaria. No es una llamada al sistema, pero por ahora es la solución que ofrece más información.

Como mera curiosidad, intentar generar una tabla como la que ofrece /proc/self/maps a mano es una opción en una arquitectura de 32 bits, pues solo hay que comprobar 1,7·10^7 páginas, pero en una arquitectura de 64 bits, el número de páginas asciende a 4,5·10^15.

Para dar más significado a las cifras supondremos que una comprobación de página (intento de escritura y captura la SIGSEGV) tarda 1 us (microsegundo).
  • 1,7·10^7 comprobaciones tardarían 1,7·10^7 x 1·10^-6 = 17 segundos.
  • 4,5·10^15 comprobaciones tardarían 4,5·10^15 x 1·10^-6 = 4,5·10^9 segundos, es decir, 170 años.

4
ASM (Ensamblador) / Re: Llamadas al systema den Linix x86_64
« en: Domingo 25 de Octubre de 2009, 01:52 »
Mil gracias. En un día me has solucionado 4 dudas... :good:

5
C/C++ / Ubicación y obtención de task_struct
« en: Domingo 25 de Octubre de 2009, 00:13 »
Linux almacena la información relativa al proceso en una estructura task_struct. La intuición me dice que la ubicación de dicha estructura se encuentra en el espacio de direcciones del núcleo para evitar errores y manipulaciones indebidas por parte del proceso. ¿La estructura task_struct de un proceso en que espacio de direcciones se encuentra, en el del proceso o en el de usuario?

Gracias.

6
ASM (Ensamblador) / Llamadas al systema den Linix x86_64
« en: Domingo 25 de Octubre de 2009, 00:01 »
He visto que hay dos métodos para realizar una llamada al sistema en Linux x86_64. Uno hace uso del tradicional int $0x80 y otro hace uso de la instrucción syscall. ¿Cuál es más adecuado?

También he visto que el orden de los parámetros es diferente si se utiliza el segundo método. ¿Cuál es el nuevo orden?

Gracias.

7
C/C++ / No me funciona la E/S asíncrona en las tuberías con nombre
« en: Sábado 24 de Octubre de 2009, 17:53 »
En el mismo directorio que el ejecutable hay una tubería con nombre llamada fifo (mkfifo fifo).
Código: C
  1.  
  2. int main()
  3. {
  4.    int file;
  5.    file = open("fifo", O_RDWR|O_ASYNC|O_NONBLOCK);
  6.    if(file == -1)
  7.    {
  8.       puts("Error al abrir el archio "fifo".");
  9.       exit(EXIT_FAILURE);
  10.    }
  11.    signal(SIGIO, faction);
  12.    pause();
  13.    close(file);
  14.    exit(EXIT_SUCCESS);
  15. }
  16.  
  17.  
Código: C
  1.  
  2. void faction()
  3. {
  4.    puts("SIGIO recibida.");
  5. }
  6.  
  7.  
En principio se debería lanzar la señal SIGIO cuando otro proceso lee o escribe del archivo fifo. ¿En qué me equivoco?

SO: Linux 2.6.28, gcc.

Gracias.

8
C/C++ / Re: Comprobar de forma segura el acceso a memoria
« en: Sábado 24 de Octubre de 2009, 17:37 »
Creo que con esto me las apañaré. Muchas gracias por tu tiempo.

9
C/C++ / Re: Comprobar de forma segura el acceso a memoria
« en: Sábado 24 de Octubre de 2009, 16:32 »
Estoy de acuerdo contigo, pero me interesa conocer la forma de hacerlo. En Windows podría utilizar la función VirtualQuery para averiguar si la página a la que pertenece la dirección es accesible, pero no conozco la forma de hacerlo en Linux.

Me interesa una forma que haga uso únicamente de las llamadas al sistema y no requiera una librería externa o lenguaje específico. Debería ser implementable en C y en el caso más extremo en ensamblador.

Gracias otra vez.

10
C/C++ / Re: Comprobar de forma segura el acceso a memoria
« en: Sábado 24 de Octubre de 2009, 15:55 »
Es para aumentar la seguridad en una función de una librería. No puedo confiar en que el código del usuario sea correcto y escribir directamente en la dirección. Debo comprobar que eso es posible y comunicarlo en caso de que no lo sea.

Gracias.

11
C/C++ / Comprobar de forma segura el acceso a memoria
« en: Sábado 24 de Octubre de 2009, 15:09 »
Necesito comprobar si la dirección de memoria apuntada por un puntero es accesible, es decir, una lectura o escritura no generará un Segmentation Fault.

Una forma de realizarlo es leyendo o escribiendo en la dirección y tratar la señal SIGSEGV cuando se produzca. El problema es que necesito una forma más segura que no requiera generar la excepción para averiguar si la dirección es accesible.

¿Hay alguna forma de hacerlo?

SO: Linux 2.6.28, gcc.

Gracias.

Páginas: [1]