Flash memory card design

Most modern memory cards contain a single NAND flash chip and a smaller controller chip that provides a high-level interface to the data, implemented with a microcontroller that runs software which understands the host protocol (MMC, USB, ATA, ...) and abstracts the block allocation, bad block management, wear leveling and garbage collection that is necessary to be done on the NAND chip.

See also [https://lwn.net/Articles/428584/] for a detailed description of some of the concepts.

Access Units

Pages

Most NAND flash chips are organized in pages of 4KB or (for smaller devices) 2KB of data. It is possible to write meaningful data of units as small as 512 bytes into a page by doing multiple page sized writes to the same block and letting the chip logically OR together the data, but the time it takes to write 512 byte will be the same as writing the full page.

Often the pages are combined into larger units by the controller, which can write multiple pages simultaneously using multi-plane and multi-channel access, effectively increasing the effective page size further, typically to 8KB or 16KB. The block device should not be accessed in units smaller than this effective page size to get the best-case performance, and on some devices the minimum alignment of an access is also the effective page size.

Erase blocks and GC Units

An erase block is the smallest unit that a NAND flash can erase, typically the size is 2 MB depending on the size of the actual NAND flash chips, although older NAND flashes sometimes have erase blocks as small as 128 KB.

Traditionally, an erase block is also the unit in which a block device used to be managed, meaning that a logically contiguous erase block would also be a physically contiguous erase block, although the position of the physical erase block would not be known. All wear leveling and garbage collection would operate either on full erase blocks or on pages within one erase block.

In all SLC and MLC flash, the erase block size is a power-of-two size. In TLC flash (Also known as MLC3, three-bit MLC, 8LC, or eight-level cell), there are two possible layouts: An erase block can have either three power-of-two sections, resulting in a total size of e.g. 1.5MB or 3 MB, or it can have a non-power-of-two number of pages for each level, 43+43+42 pages for a total of 128 pages per erase block.

Allocation Groups

With multi-plane and multi-channel designs, a small number of erase blocks can be combined into an allocation group, the largest size that has been observed in 2011 is 12 MB. The SDHC standard calls this an "allocation unit" and defines sizes in power-of-two numbers up to 4 MB. With SDXC, larger sizes up to 64 MB including non-power-of-two number of 12/24/48 MB have been defined. The most common size today is 4 MB, but devices normally do not report that number. SDHC cards are supposed to report the true allocation unit number, but in practice, all cards report 4 MB, including those that use nonstandard sizes like 1.5 or 8 MB erase blocks.

The size of the medium is (almost) always a multiple of entire allocation groups, and the most common size today is 4 MB. CompactFlash cards usually report a size that is a multiple of 63*255 512 byte sectors, because of limitations in the CHS address format specified in the ATA standard. Rounding that number up to the next full 512 KB is a multiple of full allocation groups.

One USB stick has been seen that uses a slightly larger size for the allocation group, 4128 KB in this case. The controller (USB ID 13fe:3d00) appears to be fairly common. Apparently, the size results from a TLC flash using 43+43+43 pages instead of the intended 43+43+42 pages as an attempt to increase the usable address space. On a few older devices, the first allocation group can be smaller than the others, or each allocation group is one page short, which indicates that a little space has been used by the controller for internal housekeeping purposes. Optimizations added to file systems based on the more regular allocation group sizes will be less effective on these media, but should not be counterproductive. Hopefully, these devices will become even less common in the future.

Writing to random addresses on the medium will result in read-modify-write operation being performed on a whole allocation group, because each write access requires a garbage collection. For instance on a typical SDHC card with 4 MB erase blocks, a workload writing 4 KB file system blocks to completely random locations results in a write amplification factor of 1024.

Wear Leveling

Wear leveling happens on full allocation groups.

The card performs wear leveling by keeping a pool of physical allocation groups that are invisible to the user and choosing a new group from that pool when writing to a new logical group, putting the previous physical group back into the pool after either the new group has been completely written, or the old data been moved over to the new group as part of garbage collection. This method is called dynamic wear leveling and guarantees that all logical allocation groups that sometimes get written to are aging at about the same rate.

The dynamic wear leveling can be easily observed by analyzing the timing for the garbage collection.

Very few SD cards use static wear leveling, which would also puts allocation groups back into the pool that are only written once during initialization of the card but remain stable afterwards. This would be necessary to maximize the expected lifetime of a memory card that is mostly filled with a typical root file system but has a few files being written constantly.

However, some CF cards are known to do static wear leveling in a way that leads to data loss when the supply voltage gets lost while the card is doing static wear leveling. This is even the case for read-only cards, since the static wear leveling can get triggered by read accesses on those cards.

Access modes

Through timing analysis while writing to the card, a number of algorithms can be observed. In some cases, the cards use a fixed algorithm, in other cases the algorithm changes with the kind of access and can even stay persistent on an allocation group until changed by another access pattern.

These are the algorithms that have been identified so far:

Linear write

Writing to the first write unit in the allocation group opens a group in linear mode by taking a fresh physical allocation group. The card expects the host to write the next write unit or the FAT following this. Writing to any other position inside the allocation group or writing to a card specific number of other allocation groups causes the linear allocation group to go through garbage collection and be closed. When the allocation group has been written from start to end, no garbage collection is required, which gives best case write performance.

Partial linear write

Like the simple linear write, data is written directly to a new physical allocation group. However, the first write access need not be at the start of the allocation group and writing can skip over blocks that are intended to remain unmodified. The garbage collection consist of simply copying over the data from the old physical allocation group into the new one when skipping over it and for any blocks at the end of the allocation group that were not written at the time of garbage collection. Copying from one allocation group to another is a relatively fast operation. No block can be written more than once before the garbage collection and all accesses must have increasing block addresses within the allocation group.

Random write unit access

Within the allocation group, any write unit can be written at the same speed, including writing the same write unit multiple times. A new physical allocation group is used to store all blocks written to this logical allocation group. When the new allocation group is filled with data but some blocks still reside on the old allocation group, a garbage collection of the blocks needs to happen, sorting all blocks of of the logical allocation group so they are all on one physical group and the other one can be freed. If blocks smaller than the write unit are written, a full write unit gets used and garbage collection needs to happen earlier.

Random sector or page access

Like in the random write unit access, data can be written anywhere in the allocation group, but in smaller units. The allocation group here seems to have a lookup-table that makes it possible to find data again when reading it back a later stage. This tends to be slower than the random write unit access in the best case, but requires fewer garbage collection cycles when writing small units. In many USB sticks and smaller SD cards, the write unit is identical to the page size, these would typically be considered random page access.

Mixed SLC/MLC flashes

Some current Sandisk drives made in late 2010 or later use a mix of MLC and SLC flash access as an optimization This has been observed on Cruzer Blade USB sticks as well as microSDHC cards.

This combines rather slow linear access with much faster random access. In case of the Cruzer blade, all data is first written in a 1 MB (or 1.33 MB) SLC erase block in log-structured mode, making it possible to overwrite directory entries, FAT or journal data at up to 20 MB/s. When a garbage collection is required, that small SLC erase block gets flushed back to an MLC erase block of 3 MB (or 4 MB), which is much slower, so writing linear data to multiple erase blocks can only sustain around 4-5 MB/s.

In case of the microSDHC cards, a variation of that algorithm seems to be used, where linear data can get written directly into MLC mode, instead of having to be written as SLC first, and later as MLC.

Media that use this mode are typically comparably well-behaved on Linux file systems, but have a low maximum throughput because of their use of TLC flash.

FAT optimization

Most portable flash media come preformatted as with a FAT32 file system. This is not only done because there is support for this file system in all operating systems, it is actually a reasonably good choice for the media: The data on a FAT32 file system is always written in clusters of e.g. 32 KB, and the media are normally formatted with a cluster size matching the optimum write size, as well as aligning the clusters to the start of internal units, and the access patterns on a FAT32 file system are relatively predictable, alternating between data blocks, file allocation table (FAT) and directories.

The cards take advantage of this knowledge by optimizing for the access patterns that are observed on FAT32, which unfortunately can lead to worst-case access patterns when using ext3 or other Linux file systems. In particular, the following (mis-)optimizations are commonly seen on flash media:

  • Most allocation groups are in linear write mode by default, only the first one or two allocation groups allow efficient write patterns in smaller units at all times. Since the FAT is known to be in the beginning of the partition, the controller only needs to allow writing small updates there, while it can expect other parts of the medium to be used for large image or video files.
  • SDHC cards in particular rely on a specific partition table layout that guarantees the start of the partition to be aligned to a full allocation group (typically 4 MB), so that the FAT actually ends up in the location that is optimized for it. Repartitioning the device with fdisk usually moves the start of each partition to a cylinder boundary in C/H/S addressing. Due to legacy reasons and backward-compatibility with MS-DOS, the cylinder usually has 255 heads and 63 sectors of 512 bytes, which puts the start of the first partition just behind the optimum area. To make matters much much worse, the alignment of the partition then becomes just 512 bytes instead of 4 MB, which gives worst-case behavior when the file system attempts to do aligned writes to the partition.
  • Only a small number of allocation groups is kept open at a time, on many SD cards only a single one, the largest observed number of open erase blocks was ten. Writing data to another allocation unit while having multiple units open causes the least recently used one to go through garbage collection. In the worst case, this can lead to the card writing a full allocation unit of multiple megabytes for each 512 byte block that gets written by the file system. All authentic Sandisk cards tested so far can write to six allocation units, and keep the most commonly written ones open, while most cheap cards have a smaller number and also use a simple one-stage least-recently-used algorithm for deciding with AU to clean up.
  • The smallest write unit is significantly larger than a page. Reading or writing less than one of these units causes a full unit to be accessed. Trying to do streaming write in smaller units causes the medium to do multiple read-modify-write cycles on the same write unit, which in turn causes multiple garbage collection cycles for writing a single allocation group from start to end. Small SD (non-SDHC) and MMC cards, as well as most USB sticks of any size use the page size as write unit.

Fake Cards

There is a large market for selling non-authentic flash media, both through fraudulent eBay accounts and through regular retail channels. The three common variants of this are:

  • Incorrect capacity: The controller is configured for a larger flash chip than the one used. This is the easiest to notice and the most profitable way of faking flash drives, the profit margins are normally extremely low, and selling a chip that costs a fraction of the real product's market value guarantees a huge profit. See http://sosfakeflash.wordpress.com/ for a forum discussing these cards, and http://www.heise.de/software/download/h2testw/50539 for a tool that can be used to detect them (Windows version only. TODO: add corresponding code into flashbench).

  • Used cards: Cards that are sold without the original packaging are often products returned by their previous owner. This is fine as long as they are marked as used, but in many cases, the seller pretends that they are brand new. Obviously the life time of these products may have been reduced significantly by the previous owners. This is a common problem with small Amazon merchants, but can also be found at large web shops such as Reichelt in Germany. When you buy with one of these, watch out for signs of usage on the USB or SD card connectors, and look at the drive using hexdump -C, since they often are only quick-formatted but still contain data from the previous owner.

  • Graveyard shift products: This is the most sneaky kind of fake cards, although sometimes can be found in combination with the other two categories. Bunnie has an excellent analysis of this at [http://www.bunniestudios.com/blog/?p=918]. The brands that are the most commonly ripped off like this are (as found so far) Sandisk and Kingston. Typically they will contain low-grade flash chips with third-party SD card or USB controllers, which makes it easy to spot by looking at the USB or SD card manufacturer ID (using lsusb or looking into /sys/block/mmcblk0/device/manfid, respectively). Sandisk has confirmed that they only use manufacturer ID 0x03, while Kingston has not made an official statement. Known-authentic Kingston cards normally have manufacturer ID 0x02, while (probably) fake ones have been seen with IDs 0x41 and 0x27. The fake Sandisk cards were using substantially worse controllers than the authentic ones, which are normally among the best. Kingston generally uses a rather simple controller with just one AU open for linear writing and can only sustain the required bandwidth of the speed class. The fake Kingston cards were no better in that respect and one of them was significantly slower in its maximum bandwidth.

List of flash memory cards and their characteristics

When using ext3, the card should be able to provide high throughput in random write-unit mode with five or more allocation units open (data, inode, dentry, block bitmap, journal). Good characteristics are marked in bold.

SD Cards

Name

Size

Allocation Unit

Write Size

Page Size

FAT Location

# open AUs linear

# open AUs random

Algorithm

Manuf ID

OEMID

Filemate (Fry's) Class 4 micro '49362'

16 GB

8 MB

64 KB

8 KB

-

10

10

Random write-unit access everywhere (10MB/s)

0x0028

"BE"

extrememory Hyperformance Class 10 'flash'

8 GB

4 MB

32 KB

8 KB

0-8 MB

2

1

Linear write (10MBps), Random write-unit (3.6MBps)

0x003E

"H-"

Panasonic Class 10 'SW04G'

4 GB

4 MB

64 KB

16-32 KB

0-8 MB

2

0?

Unidentified so far

0x0001

"PA"

Pretec Class 10 'SE04G'

4 GB

2 MB

16 KB

4 KB

-

6

6

0x0003

"SD"

Sandisk Class 4 micro 'SU04G'

4 GB

4 MB ?

32 KB

4 KB

0-16MB

4

4

Random write-unit access

0x0003

"SD"

Kingston micro SD-C02G 'SA02G'

2 GB

2 MB

64 KB

8-16K B

0-2MB

1

0

linear write-unit access

0x0002

"TM"

Patriot Class 4 'SD08G'

8 GB

4 MB

256 KB

4-8 KB

0-8 MB

1

1

linear write-unit access

0x0027

"PH"

Transcend Class 10 '00000'

8 GB

4 MB

64 KB

16 KB

0-8 MB

2

2

random write-unit access

0x001B

"SM"

eMMC (u8500)

8 GB

4 MB

32KB

16KB

4-8 MB

2

2

random write-unit access

--

--

small eMMC (u8500)

1 GB

--

128 KB

4 KB

0-4 MB (?)

?

?

random page access

--

--

Sandisk Class 2 'SD04G'

4 GB

2 MB (reports 4 MB)

64 KB

16 KB

--

6

6

linear (5 MB/s), random (3 MB/s)

0x0003

"SD"

Kingston SDV Class 4 'SD16G'

16 GB

4 MB

64 KB

16 KB

4-8 MB

1

1

linear write-unit 10MBps

0x0002

"TM"

Kingston SD4 Class 4 'SD08G'

8 GB

4 MB

64 KB (?)

16 KB

4-8 MB

1

1

linear write-unit, write-zero faster than write-one

0x0002

"TM"

Kingston SD4 Class 4 'SA08G'

8 GB

4 MB

64 KB

16 KB

4-8 MB

1

1

linear write-unit, write-zero faster than write-one

0x0002

"TM"

Sandisk Video Extreme 20MB/s 'SD04G'

4 GB

4 MB

32 KB

8 KB

4-8 MB

6

6

random write-unit access

0x0003

"SD"

Kingston micro class 10 'SD16G' (fake?)

16 GB

4 MB

64 KB

8 KB

4-8 MB

1

0

linear write-unit access 7MB/s

0x0041

"42"

Sandisk Class 4 'SD08G'

8 GB

4 MB

64 KB

8-16 KB

--

3

3

linear (5.3 MB/s), random (3 MB/s), zeros faster

0x0003

"SD"

Microcenter 'SD '

16 GB

8 MB

64 KB

16 KB

--

10

5

random write-unit (10MB/s)

0x001d

"AD"

Transcend Class 4 '00000'

4 GB

2 MB

64 KB

8 KB

0-8 MB

5

5

random write-unit (11MBps)

0x001b

"SM"

Kingston micro Class 4 'SD04G'

4 GB

2 MB (reports 4 MB)

64-128 KB

16 KB

6-8 MB

1

1

linear write-unit (9 MB/s)

0x0002

"TM"

Wintec filemate Professional C10 60 min HD 'SD '

4 GB

4 MB

64 KB

16 KB

--

5

5

linear (9.5 MB/s), random write-unit (8.6 MB/s)

0x006f

0xFFFF

CFD Class 6 'Ncard'

16 GB

4MB ?

32 KB

16 KB

--

8

8

random write-unit (8.5 MB/s)

0x0089

0x0303

Patriot LX Series Class 10 'SD32G'

32 GB

4 MB

64 KB 

 16-32 KB

0-12 MB

1

0

linear (12.5 MB/s)

0x0027

"PH"

extrememory Performance Class 6 'SD '

8 GB

 4 MB

32 KB

8 KB

0-8 MB ?

1

0

linaear (12.5), random (3.5 MB/s)

0x001d

"AD"

Bestmedia Platinum SD '00000' (not SDHC)

4 GB

4 MB

32 KB

16 KB

0-4 MB

5

5

random (8 MB/s)

0x0000

0x0000

Bestmedia Platinum SDHC Class 6 '00000'

4 GB

1.5 MB (reports 4)

32 KB

16 KB

0-3 MB

5

5

random (9 MB/s)

0x0000

0x0000

Sandisk micro Class 4 'SU04G'

4 GB

4 MB

64 KB

16 KB

?

10

5

log-structured (7 MB/s)

0x0003

"SD"

Sandisk Ultra Class 4 'SD16G'

16 GB

4MB

256 KB

16-32 KB

4-8 MB

6

6

linear page (13 MB/s), random write unit (9 MB/s)

0x0003

"SD"

Sandisk micro Class 2 'LEXAR' (fake)

16 GB

4 MB

64 KB

16 KB

--

5

5

random (7.8 MB/s)

0x0028

"BE"

Sandisk micro Class 4 '00000' (fake)

15,452,160 KB

2 MB (reports 4)

64 KB

16-32 KB

-- (?)

2

2

random (7-10 MB/s)

0x001b

"SM"

Sandisk micro Class 2 'SU16G' (real)

16 GB

4 MB

64 KB

16 KB

--

5

 5

random (9 MB/s)

0x0003

"SD"

Kingston Class 6 Ultimate 133 'SD16G' (fake?)

16 GB

 4 MB

 64 KB

16 KB

0-8 MB

1

0

linear (12.5 MB/s)

0x0041

 0x3432

Samsung 2009 micro class 4 '00000'

4 GB

1 MB

16 KB

8 KB

0-8 MB

5

5

linear (7 MB/s), random (3.2MB/s)

0x001b

"SM"

Apacer 60X high speed 'SEC '

1 GB

512 KB

8 KB

4 KB

0-512 KB

2

0

linear (5.4 MB/s)

0x0028

"BE"

Unknown '2GU2M'

2 GB

1 MB

16 KB

4 KB

-- 

 5

5

linear (8.4 MB/s), random (3-5 MB/s)

0x0060

"HS"

Sandisk 2009 Netbook Edition 'SD08G'

8 GB

2 MB (reports 4)

64 KB

8-16 KB

?

6

4

linear (5.4 MB/s), random write-unit (2.3 MB/s)

0x0003

"SD"

danelec 16G class 4 micro SD 'SD16G'

4 GB

2 MB

64 KB

16 KB

0-8 MB

1

?

linear (3.7 MB/s)

0x0002

"TM"

Sandisk 2009 White Label 'SD02G'

1,931,264 KB

2 MB (reports 4)

64 KB

8-16 KB

0-2 MB

6

0

linear (11 MB/s)

0x0003

 "SD"

Kingston micro class 2 'SA02G

1,927,168 KB

2 MB (reports 4)

64 KB

8-16 KB

0-2 MB

1

 0

linear (9.4 MB/s)

0x0002

"TM"

A-data class 6 'SD '

7,905,280 KB

4 MB

64 KB

32 KB

0-8 MB

4 ?

4?

random (5MB/s)

0x001d

"AD"

Kingston class 6 'SD4GB'

3,921,920 KB

4 MB

64 KB

32 KB

0-8 MB

3

2

linear (9 MB/s), random (2 MB/s)

0x0041

0x3432

Transcend class 6 'SDC'

3,905,536 GB

2 MB

32 KB

8 KB

0-6 MB

5

5

linear (11 MB/s), random (4 MB/s)

0x001c

"SV"

Transcend class 10 'SDC'

3,931,136 KB

4 MB

64 KB

16 KB

--

5

5

random (7.5 MB/s)

0x001e

"AB"

Sandisk class 4 'SD04G'

3,872,256 KB

1536 KB ?

64 KB

16 KB ?

?

?

?

?

0x0003

"SD"

Sandisk Extreme-III 'SD04G' (2007)

3,979,776 KB

1 MB

32 KB

8 KB

--

7

3

linear (11 MB/s), random (6 MB/s)

0x0003

"SD"

Fake 32 GB Class 6 ' '

4,046,848 KB (reports 32,512,512 KB)

1 MB

32 KB

4 KB

--

4

4

random (4 MB/s)

0x0000

0x2020

extrememory HYperformance class 10 'SD ' (2009)

16,186,368 KB

4 MB

64 KB

16 KB

--

5

5

random (9 MB/s)

0x001d

"AD"

extrememory performance class 6 'SD16G' (2008)

15,757,312 KB

4 MB

64 KB

16 KB

0-8 MB

3

1

linear (10 MB/s), log-structured (4 MB/s)

0x0027

"PH"

Transcend microSD

3,941,376 KB

1 MB

128 KB

16 KB

?

5

5

random (10 MB/s)

0x0074

"JE"

Transcend 32 GB Class 10

31,702,016 KB

4 MB

64 KB

16 KB

--

5

5

random (19 MB/s)

0x0074

"JE"

Sandisk micro SDHC class 2 (2007)

3,979,776 KB

512 KB

32 KB

4 KB

--

7

3

linear (5 MB/s), random (2 MB/s)

0x0003

"SD"

Sandisk micro SDHC class 2 (2009)

3,872,256

3 MB

64 KB

8 KB

--

6

6

linear (6 MB/s), random (2 MB/s)

0x0003

"SD"

Kingston SD4 class 4 (japan 2010)

7,782,400 KB

4 MB

64 KB

16 KB

12-16 MB

1

0

linear (9 MB/s)

0x0002

"TM"

Kingston SD4 class 4 (taiwan 2010)

7,561,216 KB

4 MB

32 KB

4 KB

0-8 MB

1

0

linear (5 MB/s) 23KB/s < 4kb blocks!

0x0002

"TM"

Kingston SD10 Class 10 (fake?)

7,773,696 KB

4 MB

64 KB

16 KB

--

8

4

linear (9 MB/s), random (3 MB/s)

0x0041

0x3432

Transcend Class 6 (2008) 'SDC'

7,830,016 KB

2 MB

64 KB

16 KB

--

7

4

linear (10 MB/s), random (5 MB/s)

0x001c

"SV"

PQI microsd class 6 (2009) 'uSD '

7,829,504 KB

 2 MB

64 KB

8 KB

--

5

5

linear (9 MB/s), random (4.2 MB/s)

0x001a

"PQ"

Sandisk micro class4 (2010) 'SU04G'

~4 GB

1.33 MB?

32 KB

?

--

?

 ?

linear (9MB/s), random (?)

0x0003

"SD"

Sandisk mobile ultra micro class 4 (2010) 'SU08G'

~8GB

4 MB

64 KB

16 KB

?

10 * 1.33 MB

10 * 1.33 MB

random SLC (10 MB/s), linear MLC (4 MB/s)

0x0003

"SD"

Apacer micro class 2 (2010) 'SU16G'

15,558,144 KB

1.5 MB (reports 4 MB)

64 KB

16 KB

?

?

?

linear (7.4 MB/s), random (?)

0x0003

"SD"

Kingston micro (2010) 'SA02G'

1,927,168 KB

1 MB

 ?

 ?

?

1

0

linear (10MB/s)

0x0002

"TM"

Emtec micro class 4 (2011) 'SA04G'

3,858,432 KB

4 MB

64 KB

4 KB

?

1

0

linear (6 MB/s)

0x0002

"TM"

Lexar micro class 4 (2011) 'LEXAR'

7,822,336 KB

4 MB

64 KB

8 KB

?

5

5

random (10 MB/s)

0x0028

"BE"

Lexar micro class 6 (2011) ' '

7,822,336 KB

4 MB

64 KB

8 KB

?

5

5

random (10 MB/s)

0x0009

"AP"

Lexar micro class 6 (2011) 'LEXAR'

15,637,504 KB

8 MB

64 KB

8 KB

?

5

5

random (16 MB/s)

0x0028

"BE"

Integral ultima pro class 10 'SD04G'

3,883,008 KB

4 MB

64 KB

8 KB

0-8 MB

1

0

linear (11 MB/s)

0x0027

"PH"

CnMemory SDHC Class 4 (2011) 'NCard'

3,879,936 KB

3 MB

64 KB

16 KB

--

5

5

random (7 MB/s)

0x0089

0x0303

Samsung Class 10 Full HD (2011) '00000'

7,879,680 KB

4 MB

64 KB

16 KB

--

7

7

linear (10MB/s), random (6MB/s)

0x001b

"SM"

Kingston SD6 (2010) 'SD4GB'

3,866,624

4 MB

64 KB

16 KB

0-8MB

1

0

linear (7 MB/s)

0x0027

 "PH" 

Transcend Class SDHC 'SDC '

15,674,368 KB

4 MB

64 KB

16 KB

?

5

5

random (9 MB/s)

0x0074

"JE"

PNY Professional Class 10 '00000'

7,778,304 KB

6 MB

64 KB

16 KB

?

2 (+1)

1

linear (7 MB/s), random (1 MB/S), random+linear 3 AUs

0x001b

"SM"

Patriot microSDHC class 4 'SA04G' (2011)

3,858,432 KB

4 MB

64 KB

8 KB

0-8MB

1

0

linear (5 MB/s)

0x0002

"TM"

HP class 4 microSDHC 'SA04G' (2010)

3,866,624 KB

4 MB

64 KB

16 KB

0-8 MB

1

0

linear (5 MB/s)

0x0002

"TM"

Polaroid class 4 microSDHC 'SDU8G' (2011)

7,822,336 KB

4 MB

64KB

8 KB

--

5

5

random (8 MB/s)

0x0028

"BE"

Sony microSDHC class 4 'SD ' (2010)

7,774,208 KB

4 MB

64 KB

4 KB

0-8 MB

1

0

linear (5 MB/s)

0x0027

"PH"

PNY microSDHC class 4 'SA04G' (2009)

3,866,624 KB

4 MB

64 KB

16 KB

0-8 MB

1

0

linear (5 MB/s)

0x0002

"TM"

Transcend microSDHC class 4 'USD ' (2011)

3,941,376 KB

2 MB

64 KB

16 KB

--

4

4

random (8 MB/s)

0x0074

"JE"

Kingston SDC4 'SA04G' (2010)

3,858,432 KB

4 MB

16 KB

4 KB

0-8 MB

1

0

linear (5 MB/s)

0x0002

"TM"

Kingston SDC10 'SD4GB' (2011)

3,887,104 KB

4 MB

16 KB

8 KB

0-8 MB

1

0

linear (13 MB/s)

0x0041

0x3432

Amazon Basics class 10 B0058GH3II 'SD04G' (2011)

3,887,104 KB

4 MB

16 KB

8 KB

0-8 MB

1

0

linear (13 MB/s)

0x0027

"PH"

Samsung Essential MB-MS4GA '00000' (2011)

3,880,960 KB

2 MB

64 KB

8 KB

?

2

0

linear (4.5 MB/s)

0x001b

"SM"

SanDisk Mobile Ultra SDSDQY-004G-A11A 'SU04G' (2011)

3,870,720 KB

2 MB (?)

16 KB

16 KB

?

9

0

linear (13 MB/s)

0x0003

"SD"

AmazonBasics class 10 'SD04G' (2011)

3,866,624 KB

4 MB

64 KB

8 KB

0-8MB

1

linear (9 MB/s)

0x0027

"PH"

Samsung Essential class 6 MB-MS8GA/EU/F microSDHC '0000' (2011)

7,778,304 KB

6 MB

64 KB

16 KB

0-4 MB?

2

0

linear (7 MB/s)

0x001b

"SM"

Toshiba microSDHC Class 4 'SA08G' (2012)

7,639,040 KB

4 MB

32 KB

16 KB

0-8 MB

2

2

linear (5 MB/s), random (2 MB/s)

0x02

"TM"

Sandisk Extreme UHS-1 "SU16G" (2012)

15,558,144 KB

8 MB

64 KB

16 KB

8-10 MB ?

9

0

linear (11 MB/s), caches small random writes

0x0003

"SD"

Sandisk Ultra SDSDU-032G-A11 "SU32G" (2012)

31,166,976 KB

12 MB

64 KB

16 KB

4-12 MB

11*4MB

?

linear (18 MB/s), random 256KB-unit

0x0003

"SD"

Samsung Essential class 6 MB-MS8GA/EU '0000' (2011)

7,778,304 KB

6 MB

64 KB

16 KB

0-4 MB?

2

0

linear (7 MB/s)

 0x001b

"SM"

Samsung Essential class 6 MB-SS8GA/EU '0000' (2011)

7,778,304 KB

6 MB

64 KB

16 KB

0-4 MB?

2

0

linear (8 MB/s)

0x001b

"SM"

Samsung microSDHC Plus clas 10 MB-MP8GA '0000' (2012)

7,879,680 KB

4 MB

64 KB

8 KB ?

--

7

7

random (8 MB/s)

0x001b

"SM"

Samsung 8 GB class 6 MB-SS8GA

7,778,304 KB

6 MB

64 KB

?

--

2

0

linear (13 MB/s)

?

?

CF Cards and SSD

Name

ATA mode

Size

Allocation Unit

Write Size

Page Size

FAT Location

# open AUs linear

# open AUs random

GC Algorithm

Transcend 266x 'TRANSCEND'

UDMA4

15,663,104 KB

4 MB

32 KB

8 KB

?

3

1

linear (26 MB/s), random (4 MB/s)

Transcend ultra 2GB Industrial 'CF100BA8'

PIO4

1,990,296 KB

1 MB (?)

16 KB

4 KB

0-1 MB

4 (?)

4 (?)

random (5 MB/s)

Kingston 'ELITE PRO CF CARD 4GB'

UDMA5

3,940,272 KB

2 MB

64 KB

4 KB

 --

4

4

random (4 MB/s)

Sony CompactFlash 66x 10MB/s 'Sony NCFB1G'

MDMA2

1,000,944 KB

 512 KB

16-64KB

4 KB

--

3

3

random (13 MB/s)

Kingston 'CF CARD 4GB'

UDMA5

3,923,640 KB

2 MB

16 KB

8 KB

--

7

7

random (9.5 MB/s)

Kingston 'CF CARD 2GB'

MDMA2

1,982,232 KB

1 MB

32 KB

2 KB

?

3

2

linear (11 MB/s), log-structured (6 MB/s)

Silicon Systems SSD-C02G-3500

PIO2

2,048,287 KB

128 KB

32 KB

1 KB

--

4

4

random (5.36 MB/s)

PQI Hi-Speed 512 MB 'SAMSUNG CF/ATA'

PIO4

498,015 KB

256 KB

64 KB

2 KB

--

5

4

random write-unit (4 MB)

Transcend 133x

?

7,823,655 KB

2 MB

64 KB

16 KB

--

3

4

linear (18 MB/s), random (6 MB/s)

Transcend 133x 'TRANSCEND 20080422'

MDMA4

7,831,152 KB

2 MB

64 KB

4 KB

--

3

2

linear (24 MB/s), random (5 MB/s)

Numonyx Industrial SMC02GBFK6E (2007)

MDMA4

2,000,092 KB

512 KB

64 KB

4 KB

0-512 KB

2

0

linear (14 MB/s)

Kingston CF4 'CF CARD 4GB' (20090410)

UDMA4

3,919,860 KB

2 MB

16 KB

8 KB

--

6

6

linear (9.4 MB/s), random (3.8 MB/s)

XCeedCF Industrial Grade 16 GB 'SMART CF', Hyperstone FX, 20091110

PIO6

16,007,040 KB

1 MB

64 KB

2 KB

--

6

0

linear (27 MB/s)

XCeedCF Industrial Grade 16 GB 'SMART CF', SMI 233, 20080820

PIO6/MDMA4/UDMA6

15,663,104 KB

2 MB

64 KB

16 KB

--

3

4

linear (17 MB/s), random (8 MB/s)

Swissbit SFCF8192H3BK4SA

PIO4

8,003,520 KB

512 KB

16 KB

4 KB

--

4

4

random (16 MB/s)

STEC SLCF16GM2PU 'STEC M2+ CF 9.0.2'

PIO6/MDMA4/UDMA4

15,463,224 KB

992 KB (!)

64 KB

 4 KB

--

1

0

linear (19 MB/s)

Transcend 133x 'TS4GCF133 20101227'

PIO6/MDMA4/UDMA4

3,915,576 KB

4 MB

64 KB

16 KB

--

11

11

linear (10 MB/s), random (3 MB/s)

Lexar Professional 400x 60MB/s 16GB 'LEXAR ATA FLASH CARD'

UDMA6/PIO6/MDMA4

15,630,048 KB

16 MB

256 KB

64 KB

--

11

11

linear (56 MB/s), random (22.5 MB/s)

'Sandisk pSSD-P2 64GB'

UDMA6/PIO4

62,522,712 KB

16 MB

256 KB

 32 KB

--

14 * 8MB

0

linear (40-70 MB/s), uses 8MB SLC blocks for writing

USB Flash (historic)

Name

Size

Allocation Unit

Write Size Unit

Page Size

FAT Location

# open AUs linear

# open AUs random

Algorithm

USB ID

 Name

noname USB1.1 (OSDL Gift)

128 MB

128 KB

16 KB

4-8 KB

-

4

4

random page access (1MB/s)

0204:6025

Chipsbank Microelectronics Co., Ltd CBM2080

Sandisk cruzer micro

512 MB

256 KB

16 KB

4 KB

-

3

3

random page access (5.5 MB/s)

0781:5406

Sandisk Corp. Cruzer Micro U3

noname USB1.1

128 MB

?

16 KB

?

-

?

?

fully associative write unit remapping (0.7MB/s)

09a6:8001

Poinchips Mass Storage Device

noname USB2.0 (plumbersConf Gift)

1GB

256 KB

4 KB

2 KB

--

6

6

random write unit (1.4 MB/s), linear page (2.4 MB/s)

0204:6025

Chipsbank Microelectronics Co., Ltd CBM2080

noname USB2.0 (LCA Gift)

1GB

128 KB

16 KB

4 KB

--

1

0

linear write-unit (9 MB/s)

0457:0150

Silicon Integrated Systems Corp. Super Talent 1GB Flash Drive

smart modular eUSB MFD eng sample SMI325AC

7,863,817 KB

2 MB

64 KB

8 KB

0-16 MB

5

5

linear (26 MB/s), random (10 MB/s)

0e39:2b00

Smart Modular Technologies, Inc.

STEC USB MFD 8 GB

8,203,104 KB

128 KB @ 48KB offset

--

2 KB

0-304 KB !

1

0

linear ( 6 MB/s)

136b:0918

STEC

Sandisk 8 GB eUSB

8,028,159 KB

1 MB @ -16KB offset

64 KB

4 KB

--

7

3

linear (25 MB/s), random (13 MB/s)

0781:6500

SanDisk Corp.

USB Flash (current)

Name

Size

Allocation Unit

Write Size Unit

Page Size

FAT Location

# open AUs linear

# open AUs random

Algorithm

USB ID

Name

Kingston Datatraveller

8 GB

1 MB

8 KB

8 KB

-

4

4

random page access

SuperTalent Pico-C

8 GB

4 MB

16 KB

16 KB

-

3

3

random page access (10 MB/s)

090c:1000

Feiya Technology Corp. Flash Drive

Sandisk cruzer blade

3,910,656 KB

4 MB

256 KB

16 KB

-

18*1.33MB

18*1.33MB

random write-unit SLC (18 MB/s), random page SLC (1.5 MB/s), MLC (5.6 MB/s)

0781:5567

SanDisk Corp. Cruszer Blade

Tevion P89069 / Medion MD86443

8 GB

4128 KB (!)

32 KB

16 KB

-

5

10

linear write unit (25 MB/s), log-structured write cache (9MB/s) , nonstandard allocation unit size

13fe:3d00

Kingston

OCZ OCZUSBR2TDC

8,028,160 KB

?

64 KB

8 KB

-

4

4

random (29 MB/s)

0325:ac02

OCZ Technology Inc ATV Turbo / Rally2 Dual Channel USB 2.0 Flash Drive

Corsair FlashVoyager GT

15,859,712

12 MB

32 KB

16 KB

-

3

1-4?

linear (25 MB/s), 4*4 MB random access (7 MB/s)

1b1c:1a90

Patriot xporter XT Boost

16 GB  

8 MB

64 KB

16 KB

-

8

8

linear (15 MB/s), random 16 KB page (3 MB/s), no random access > 16 KB

13fe:3100

Kingston Technology Company Inc. 2 GB USB stick

Patriot Rage XT (partial data)

16 GB

24 MB ?

64 KB

?

?

12

?

linear (17 MB/s), random unknown

13fe:3800

Kingston Technology Company Inc.

JetFlash Transcend 8GB

8 GB

2 MB

4KB

4KB

-

5

5

random page access, first 2MB AU is slow so different algorithm?

8564:1000

JetFlash Transcend 16GB

16 GB

2 MB

8KB

8KB

-

6

6

random page access

8564:1000

Fake Kingston DataTraveller 150 "64 GB"

4,028,416 KB (reports 66,083,377 KB)

2 MB

32 KB

8 KB

?

6

6

linear (6.4 MB/s), random write-unit (2.75 MB/s)

1234:5678

Sandisk cruzer blade

7,812,608 KB

3 MB

256 KB

8 KB

--

10*1MB

10*1MB

random write-unit SLC (18 MB/s), random page SLC (1.5 MB/s), MLC (4.8 MB/s)

0781:5567

SanDisk Corp. Cruszer Blade

ADATA S102 USB 3.0

7,716,864 KB

4 MB

16 KB

8 KB

--

4

16

linear (12 MB/s), random (1-4 MB/s), write cache

125f:312a

A-DATA Technology Co., Ltd.

Corsair Voyager USB 3.0

16 GB

8 MB

128 KB

16 KB

--

4

18

linear (22 MB/s), random write-unit (3-5 MB/s)

1b1c:1a00

 

Verbatim Executive Metal 44066

7,823,360 KB

8 MB

64 KB

32 KB

--

12

12

linear (17 MB/s), random page/write-unit (5.8/6.5 MB/s), buffer for sub-pages

18a5:0240

Verbatim, Ltd

KINGSTON 8GB Datatraveler DT101 G2

7,811,072 KB

4 MB

32 KB

16 KB

0-4 MB

12

14

linear (15 MB/s), random (5 MB/s)

0930:6545

Toshiba Corp. Kingston DataTraveler 102 Flash Drive / HEMA Flash Drive 2 GB / PNY Attache 4GB Stick

Lexar JumpDrive TwistTurn 4GB

3,915,776 KB

1 MB

32 KB

8 KB

0-6MB (?)

4

4

linear (7 MB/s), random (4 MB/s)

05dc:a764

 Lexar Media, Inc.

SuperTalent USB3.0 Express DUO

7,684,096 KB

8 MB

32-256KB

16 KB

--

4

16

linear (25 MB/s), random (25 MB/s), assumes linear access when writing first page in erase block

1b8f:0305

MA LABS, Inc.

TS32GSSD 34E-M ExpressCard

31,539,200 KB

8 MB

64 KB

32 KB

--

125 (?)

125 (?)

random (20 MB/s), measurements really show 125 erase blocks!

152d:0602

TS32GSSD 34E-M

Sandisk Cruzer Fit

15,633,408 KB

4 MB

64 KB

16 KB

--

27 * 1.33MB

0

linear SLC (22 MB/s), Linar MLC (5 MB/s)

0781:5571

SanDisk Cruzer Fit 1.26 PQ:

Kingston DT101 G2

15,347,712 KB

12 MB

64 KB

16 KB

--

11-16

?

linear (10 MB/s), random (4 MB/s)

0951:1642

Kingston Technology DT101 G2

WorkingGroups/KernelArchived/Projects/FlashCardSurvey (last modified 2013-02-18 07:29:09)