Para ensuciar una página (activando el bit sucio en la entrada de la tabla de páginas), toco los primeros bytes de la página así:
pageptr[0] = pageptr[0];
Pero en la práctica, gcc ignorará la declaración por eliminación de tienda muerta. Para evitar que gcc lo optimice, reescribo la declaración de la siguiente manera:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Parece que el truco funciona, pero algo feo. Me gustaría saber si hay alguna directiva o sintaxis que tenga el mismo efecto. Y no quiero usar una -O0
bandera, ya que también traerá una gran penalización de rendimiento.
-O0
no impedía la "optimización" del código muerto, por ejemplo, cuando GCC detecta que algún código no tiene efecto, simplemente lo elimina. AFAIK, esta es una etapa incluso antes-O0
... Pero esa es solo mi experienciaRespuestas:
Desactivar la optimización soluciona el problema, pero no es necesario. Una alternativa más segura es hacer que sea ilegal que el compilador optimice la tienda usando el
volatile
calificador de tipo.El
volatile
calificador de tipo indica al compilador que sea estricto con las cargas y los almacenes de memoria. Uno de los objetivosvolatile
es informar al compilador que el acceso a la memoria tiene efectos secundarios y, por lo tanto, debe conservarse. En este caso, la tienda tiene el efecto secundario de provocar un error de página y desea que el compilador conserve el error de página.De esta manera, el código circundante aún se puede optimizar y su código es portátil para otros compiladores que no entienden la sintaxis
#pragma
o GCC__attribute__
.fuente
volatile
significa que el acceso a la memoria debe ocurrir como está escrito, que es exactamente lo que queremos. En otras palabras, lo hemos pensado detenidamente y significa lo que creemos que significa.Puedes usar
para deshabilitar optimizaciones desde GCC 4.4.
Consulte la documentación de GCC si necesita más detalles.
fuente
En lugar de utilizar los nuevos pragmas, también puede utilizarlos
__attribute__((optimize("O0")))
para sus necesidades. Esto tiene la ventaja de que solo se aplica a una única función y no a todas las funciones definidas en el mismo archivo.Ejemplo de uso:
fuente
-Olevel
opción pero usé las opciones individuales que se encienden por separado? (En mi caso, no puedo determinar cuál es la opción de optimización individual que está rompiendo el código) .