In order to make a page dirty (switching on the dirty bit in the page table entry), I touch the first bytes of the page like this:
pageptr[0] = pageptr[0];
But in practice gcc will ignore the statement by dead store elimination. In order to prevent gcc optimizing it, I re-write the statement as follows:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
It seems the trick works, but somewhat ugly. I would like to know is there any directives or syntax which has the same effect? And I don't want to use a -O0
flag, since it will bring great performance penalty as well.
You can use
#pragma GCC push_options
#pragma GCC optimize ("O0")
your code
#pragma GCC pop_options
to disable optimizations since GCC 4.4.
See the GCC documentation if you need more details.