Domanda

Ecco la situazione:

Sto analizzando l'interazione a programmi con un driver utilizzando un modulo LD_PRELOADed che si aggancia la chiamata di sistema ioctl (). Il sistema con cui sto lavorando (il kernel Linux 2.6.18 embedded) ha per fortuna la lunghezza dei dati codificati nel parametro 'richiesta', in modo da poter tranquillamente scaricare i dati ioctl con la lunghezza giusta.

Comunque un bel po 'di questi dati ha puntatori a altre strutture, e non so la lunghezza di questi (questo è quello che sto indagando, dopo tutto). Quindi sono la scansione dei dati per i puntatori, e il dumping i dati in quella posizione. Sono preoccupato questo potrebbe lasciare il mio codice aperto a segfaults se il puntatore è vicino a un confine segmento (e la mia primi test sembra mostrare questo è il caso).

Così mi chiedevo che cosa posso fare per preventivamente verificare se il processo in corso possiede un particolare compensato prima di tentare di risolvere il riferimento? Questo è anche possibile?

Modifica:. Solo un aggiornamento come ho dimenticato di dire qualcosa che potrebbe essere molto importante, il sistema di destinazione è basato su MIPS, anche se sto anche testando il mio modulo sulla mia macchina x86

È stato utile?

Soluzione

Apri un file descrittore di /dev/null e provare write(null_fd, ptr, size). Se restituisce -1 con set errno al EFAULT, la memoria non è valido. Se restituisce size, la memoria è al sicuro da leggere. Ci può essere un modo più elegante per la memoria di query validità / permessi con qualche invenzione POSIX, ma questo è il modo più semplice classico.

Altri suggerimenti

Se il Linux embedded ha il / proc / filesystem montato, è possibile analizzare il file / proc / self / mappe e validare il puntatore / offset contro tale. Le mappe file contiene le mappature di memoria del processo, vedere qui

Non conosco nessun tale possibilità. Ma si può essere in grado di realizzare qualcosa di simile. Come man 7 signal cita, SIGSEGV può essere catturato. Quindi, penso che si potrebbe

  1. Inizia con dereferencing una sequenza di byte noto per essere un puntatore
  2. Accesso un byte dopo l'altra, a un certo momento innescando SIGSEGV
  3. In gestore di SIGSEGV, marcare una variabile che viene verificato nel ciclo della fase 2
  4. Esci del ciclo, questa pagina è fatto.

Ci sono diversi problemi con questo.

  • Da diversi buffer possono vivere nella stessa pagina, si potrebbe uscita ciò che pensi sia un buffer che sono, in realtà, parecchi. possono essere in grado di aiutare in questo anche da LD_PRELOADing recinzione elettrica che sarebbe, AFAIK causare l'applicazione per allocare una pagina intera per ogni buffer allocato dinamicamente. Quindi non uscita diversi buffer pensando che è una sola, ma ancora non si sa dove finisce il tampone e sarebbe uscita molto più spazzatura alla fine. Inoltre, i buffer di stack basata non può essere aiutato da questo metodo.
  • Non so dove finiscono i buffer.

testato.

Non puoi solo controllare i confini del segmento? (Sto cercando di indovinare da confini segmento pagina confini significa?)

Se è così, pagina confini sono ben delimitati (sia 4K o 8K) in modo semplice mascheramento dell'indirizzo dovrebbe trattare con esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top