The memory is divided in 128 blocks of 64 kb each. A block starts with a 76 bytes block header, which holds information about the block. The rest of the block contains data sectors and sector headers. Each data sector has a 27 bytes wide header located just after the block header header. Data sectors are written to a block in a “bottom-up” fashion, and can have a maximum size of 512 bytes. Sequences of one or more data sectors constitute a stream. A single stream can represent any kind of data, for example, a file or a directory table. The data sectors that a stream consists of need not be stored in a sequential manner, and can span multiple blocks. The size and position of a data sector is determined by its sector header. The sector header also determines which stream the data block belongs to, and the sequence number of the data-block.

If a block is empty, only the block header exists. Otherwise, the block header is first followed by a sector header that
does not point to any data sector. Then a list of ‘useful’ data sector headers follows. The list of sector headers is of constant size. Table I and table II contain partial specifications (determined from experiments) of the fields of block and sector headers.

When a file is deleted the sectors of a stream become dirty, this is achieved by setting the valid bits in the sector header to 0. The sector still exists in the flash device, but is marked as dirty.

TABLE I
INTERPRETATION OF BYTES 0-75 OF A BLOCK HEADER

interpretation-of-bytes-0-75-of-a-block-header

TABLE II
INTERPRETATION OF BYTES 0-23 OF A SECTOR HEADER

interpretation-of-bytes-0-23-of-a-sector-header