Hi,
First of all, in dual image boot, the application code image can be put to different flash address, it is okay that the application code is put in the higher half flash space and executed, and you can access the lower half flash space.
Regarding the function memcpy(readPage, 0x0, 512); I suppose that the readPage destination address is absolute RAM address, when the source address is in lower half flash space(0x0), you will access the lower half flash space, when the source address is in higher half flash space(0x20000), you will access the higher half flash space.
Hope it can help you
BR
XiangJun Rong