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 -O0bandera, ya que también traerá una gran penalización de rendimiento.

-O0no 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
volatilecalificador de tipo.El
volatilecalificador de tipo indica al compilador que sea estricto con las cargas y los almacenes de memoria. Uno de los objetivosvolatilees 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
#pragmao GCC__attribute__.fuente
volatilesignifica 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
-Olevelopció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) .