Savegames: Difference between revisions
Correct info on the blockmap/journal. Also add a newly found CRC. |
|||
Line 11: | Line 11: | ||
The 3DS employs a wear leveling scheme on the savegame FLASH chips. This is done through the usage of blockmaps and a journal. The blockmap is located at offset 0 of the flash chip, and is immediately followed by the journal. The initial state is dictated by the blockmap, and the journal is then applied to that. | The 3DS employs a wear leveling scheme on the savegame FLASH chips. This is done through the usage of blockmaps and a journal. The blockmap is located at offset 0 of the flash chip, and is immediately followed by the journal. The initial state is dictated by the blockmap, and the journal is then applied to that. | ||
First, there are 8 bytes whose purposes are currently unknown. Then comes the blockmap. | |||
The blockmap structure is simple: | The blockmap structure is simple: | ||
<pre> | <pre> | ||
struct header_entry { | struct header_entry { | ||
uint8_t phys_sec; // when bit7 is set, block has checksums, otherwise checksums are all zero | |||
uint8_t alloc_cnt; | |||
uint8_t chksums[8]; | uint8_t chksums[8]; | ||
} __attribute__((__packed__)); | } __attribute__((__packed__)); | ||
</pre> | </pre> | ||
There's one entry per sector, counting from physical sector 1 (sector 0 contains the blockmap/journal). | |||
The 2 bytes that follow the blockmap are the CRC16 (modbus) of the first 8 bytes and the blockmap. | |||
Then comes the journal. | |||
The journal structure is as follows: | The journal structure is as follows: | ||
<pre> | <pre> |