Technology card
LimitedWear Leveling in Flash Storage: Dynamic and Static Methods from Early Patents to JFFS2 and Static Leveling (1992-2007)
flash wear leveling history · dynamic wear leveling · static wear leveling · static data wear leveling · erase count leveling · cold data migration flash · TrueFFS wear leveling · JFFS2 wear leveling · flash erase block wear
This card is a dated history of the idea, not a description of how a current SSD controller levels wear (see the wear-leveling, ftl and ssd cards for that). It follows five steps that the opened sources document: the mapping layers that let flash imitate a disk (1992 to 1995), the first patents that weigh erase counts (Intel and Cirrus Logic, 1992 to 1995), the file systems for raw flash (Hitachi 1995, JFFS 1999, JFFS2 2001), the separate treatment of static data (M-Systems 2001, Chang and colleagues 2007) and the Linux UBI layer. 'Dynamic' and 'static' are used as Chang et al. use them in their 2007 slides; the patents say 'static areas' (Ban) and the survey says 'static data' (Gal and Toledo). Current SSD controllers, write amplification, ECC, over-provisioning and SMART wear indicators are not covered because no source on them was opened for this card. The history of flash cells and the first flash disks is in the early-flash-and-ssd-history card, and the interface history is in scsi-ata-interface-history. The card contains no prices, sales, market-share or funding figures.
Related
In one minute
Wear leveling is the practice of steering flash erases so that no erase block reaches its erase-cycle limit long before the others; the sources read show it written down in patents filed in 1992 and 1993, split into dynamic leveling (spreading new writes over free blocks) and static leveling (also moving data that is never rewritten), and made a named mechanism of its own for static data in a 2001 M-Systems patent filing and a 2007 design paper.
Short answer: wear leveling began as part of the mapping layers that let flash imitate a disk, and the split into dynamic and static leveling is visible in the sources from the early 1990s but became a named, separately patented problem only around 2001 to 2007. Intel's Wells patent (application of October 1992, continuation filed November 1993) already says that blocks holding programs are rewritten very rarely while blocks holding changing data are cleaned more and more often, and ranks blocks by a weighted mix of invalid sectors and erase count. Cirrus Logic's 1993 filing adds per-block erase counters and an erase-inhibit flag. Axis's JFFS, released in late 1999, levelled perfectly by rewriting all data on every pass until JFFS2 replaced that with a one-in-a-hundred pick of a block holding only valid data. M-Systems' 2001 filing calls static areas the problem that the earlier methods leave open, and a 2007 design paper adds a bit-table static leveler whose memory need is a few tens to a few thousand bytes (the authors' figures).
The problem the methods answer, 1993 to 2001. Gal and Toledo say flash cells can be written only 10,000 to 1,000,000 times before they wear out, that bits can only be cleared by a write and set again only by erasing a whole erase unit of several to hundreds of kilobytes, and that if blocks are mapped straight onto flash addresses the frequently used erase units wear out quickly. Woodhouse gives 100,000 erases per block as the typical lifetime, with 128 KiB blocks on NOR flash and 8 KiB on NAND, and Kawaguchi et al. call 100,000 erasures 'not unusual'. Wells's patent estimates that erasing took one to two seconds and that switching began to slow after about ten thousand operations, with about one hundred thousand needed before the slowing affected the system. M-Systems' 2001 patent says vendors state the program and erase endurance as a number from tens of thousands to a million (a vendor statement). Gal and Toledo add a second reason for the same mapping: with 4 KB file-system blocks and 128 KB erase units, an identity mapping would copy a whole erase unit for each small write and could lose 128 KB if power failed during the rewrite.
The shared basis: write somewhere else and keep a map. Gal and Toledo describe the idea behind all the wear-leveling techniques as mapping the host's block number to a physical sector and writing the new data to another sector on each update. The 1992 to 1993 patents say the same in their own words: Wells describes a lookup table that records where a logical sector currently sits, with the old position marked dirty and a later 'clean up' that moves the valid data out of a dirty block and erases it, which can happen in the background; Ban's M-Systems patent (filed 8 March 1993) describes a virtual map that lets data be written continuously to unwritten physical locations; and the Cirrus Logic patent describes a map from logical to physical block address with flags for defective, used and old blocks. Gal and Toledo say the Flash Translation Layer was originally patented by Ban and later adopted as a PCMCIA standard, citing an Intel application note that was not opened here. Hitachi's 1995 driver used the same mapping inside a log-structured design, and its authors say plainly that their prototype 'does not implement wear-leveling'.
1992 to 1996: the first patents that weigh erase counts. Wells's patent states the static-data problem before the term existed: it says studies indicate that 'certain areas of a flash memory array such as those blocks in which application programs are stored are subject to very infrequent rewriting', that blocks with rapidly changing data are cleaned more often, and that 'a block containing data initially subject to rapid change will automatically be subject to additional rapid change due to the nature of the data architecture'. Its claims choose the block to clean by a score that weights the number of invalid sectors against the block's erase count, with weights of 0.8 and minus 0.2 when space is needed and 0.2 and minus 0.8 when a cleanup is not required but time is available, the second mode being triggered by a difference of 500 or more erase operations between blocks (Gal and Toledo describe the same score and threshold). Cirrus Logic's patent keeps an erase counter for each block with a programmable maximum: when a block reaches one below the maximum it is erased one last time, written with the file that then has the smallest count and protected from further erasing by an erase-inhibit flag, and when all blocks approach the maximum the counters and flags are cleared. Gal and Toledo describe a sibling Cirrus Logic patent that stores a bounded 8-bit unary erase counter on a different erase unit so that no erase is needed to update it, and they list other approaches in the same period: a relocation through a spare unit, triggered when reclaiming a heavily worn unit whose erase count exceeds that of the least worn unit by a threshold (Lofgren et al., a SanDisk and Western Digital patent; the example threshold is 15,000), an upper bound on wear kept in a queue of erase candidates (Jou and Jeppesen), ranking units by how long erasing takes, which grows with wear in some devices (Han, LG), and swapping the most and least worn units when their counts differ by 100 (Wu and Zwaenepoel's eNVy, 1994, which Gal and Toledo describe and which was not opened here).
A disagreement about Wells. Ban's 2001 filing says Wells 'does not really treat static areas' and 'omits the crucial step of forcing cleanup on units that don't need cleanup, but are static', and says the Cirrus Logic patents also omit that step. The claim text of Wells read for this card says the second, wear-heavy score is used when a cleanup is not required but time is available, once the erase counts differ by 500 or more, which can be read as forcing a cleanup of a block that was not due. Gal and Toledo describe the wear-heavy phase as choosing additional units for reclamation. The card shows both readings without resolving them; Ban's statement is one competitor's characterisation made to distinguish his own patent.
M-Systems: the Flash Translation Layer and TrueFFS. Gal and Toledo say M-Systems sold TrueFFS, a block-mapping driver that implements the FTL, and that M-Systems literature (a 1997 technical overview by Dan and Williams, not opened here) states that its wear leveling combines randomness with erase counts, with the claim that randomness removes the need to protect exact counters; they add that the algorithm is not described in the open literature or in patents. Woodhouse writes in 2001 that both FTL and the newer NAND variant NFTL are encumbered by patents in the United States, much of Europe and Australia, that M-Systems had licensed FTL for all PCMCIA devices and allowed NFTL only on DiskOnChip devices, and that Linux supported both but deprecated them. Ban's own patent for the original FTL mapping (US 5,404,485) contains no wear-leveling description in the text read, and Ban's 2001 filing says that patent and its 1999 successor 'do not provide means for wear leveling'; so the first FTL patent is a mapping patent, and the sources read place M-Systems' wear-leveling disclosure in the 2001 filing.
File systems for raw flash, 1995 to 2001. Kawaguchi, Nishioka and Motoda of Hitachi built a Unix driver that writes sequentially like a log-structured file system and uses a cleaner; Gal and Toledo call them probably the first to identify log-structured file systems as suitable for flash. The paper reports random write throughput falling from 222 KB per second at 30% utilisation to 40 KB per second at 90%, and that mixing hot and cold blocks hurt: their first hot-and-cold results were far worse than expected, and a modified driver that used one segment for cleaning cold segments and another for writes improved write throughput by more than 40% at 90% initial data. Gal and Toledo note that policies which cluster static data in some units improve cleaning efficiency but leave static units unreclaimed for long periods, which gives uneven wear unless a separate wear-leveling mechanism exists. Woodhouse says Axis released JFFS under the GPL in late 1999. In JFFS the garbage collector moved forward through the log, so on a 16 MiB file system holding 12 MiB of static data, 2 MiB of slack and 2 MiB of dynamic data it rewrote the 12 MiB on every pass; in his words JFFS 'provided perfect wear levelling - each block was erased exactly the same number of times - but this meant that the blocks were also erased more often than was necessary', and wear leveling 'must be provided, by occasionally picking on a clean block and moving its contents. But that should be an occasional event, not the normal behaviour.' JFFS2 takes a block from the dirty list unless the jiffies counter is divisible by 100, in which case it takes one from the clean list. Gal and Toledo describe the same one-in-100 rule, but they rely on Woodhouse's article, so the two accounts are not independent, and they point out that a method that selects units only by the amount of invalid data can leave a lightly worn unit with little invalid data unreclaimed for ever.
Static leveling becomes its own mechanism, 2001 to 2007. M-Systems' filing of 1 June 2001 (issued 4 May 2004 as US 6,732,221) names the gap: methods that choose where to write new data cannot influence 'static areas' such as operating-system and application code, and static areas occupied a major part of the media in many uses, so the lifetime could be halved if they span half of it (a vendor claim). Its method launches once per some large number of write or erase operations, picks a unit so that successive picks reach every unit, moves its data to a free unit and erases it. Gal and Toledo describe it as relying on a spare unit with a random or fixed trigger such as the 1000th erase since the last event, aimed at giving every unit about 100 swaps, and say the idea appears to have been used earlier in TrueFFS. Chang, Hsieh and Kuo presented a different design at DAC in June 2007: a Block Erasing Table with one bit for each 2^k consecutive blocks, a count of erases since the table was reset (ecnt) and of set bits (fcnt), a trigger when ecnt divided by fcnt reaches a threshold T, a request to the cleaner to copy and erase a block from a block set that the leveler selects, and a reset of the table when all bits are set. Their slides give the table's memory need as 256 bytes at k = 0 for 512 MB of flash up to 4,096 bytes for 8 GB, and 32 to 512 bytes at k = 3 (their table; for 1 GB with 256 KB blocks, 4,096 blocks at one bit each is 512 bytes, which matches). Their evaluation used a one-month trace of a mobile PC with a 20 GB hard disk (1.82 writes and 1.97 reads per second, 36.62% of logical addresses accessed) on a modelled 1 GB two-bit-per-cell flash, and reports first-failure time improved by 100.2% at k = 3, T = 100 and by 87.5% at k = 0, T = 100 with less than 3% extra block erases. The text extracted from the slides does not show whether the 87.5% figure is for the FTL or the NFTL configuration. The slides also give 100,000 erase cycles for single-level and 10,000 for two-bit-per-cell flash as the motivating bound (authors' figures).
A raw-flash layer in the Linux kernel. The Linux MTD project's UBI page says UBI has been in the mainline kernel since version 2.6.22, works on raw flash and 'is not a Flash Translation Layer', keeps an erase-counter header in every physical eraseblock, provides global wear leveling across the whole chip by moving data from more worn to less worn blocks, reserves one physical eraseblock for wear-leveling purposes, and rebuilds its tables in RAM by scanning all headers when it attaches, so attach time grows with flash size (a 256 MiB OneNAND device attached in under a second and a 1 GiB NAND in about two seconds on the devices it names). Its authors explain that they chose not to keep the erase-counter and mapping tables on flash because that would need journaling and replay code that boot loaders could not hold.
What the sources do not settle. Who first used the labels 'dynamic' and 'static' wear leveling; whether Wells's second score already forces cleanup of static blocks (Ban says it does not, the claim text can be read the other way); how TrueFFS actually levelled wear; when the FTL's wear leveling was first shipped, because the card relies on patents and later descriptions, not on product documentation; whether SanDisk, Lexar or other controller makers of the 1990s used counters, randomness or neither, beyond what Gal and Toledo say of the Lofgren patents; and whether the 87.5% to 100.2% gain generalises beyond one trace. Not covered: current SSD controllers, hot and cold data separation by temperature (the cat and dac policies that Gal and Toledo describe were read but not summarised here), the effect of wear leveling on write amplification, and the NAND-specific changes after 2007.
Compared to neighbors
Four things are easily merged. Dynamic leveling chooses a lightly worn free block when new or rewritten data needs a place, so it only shapes the wear of blocks that take writes. Static leveling also moves data that is never rewritten, so that the blocks holding it can take their share of erases; it costs extra erases and copies. Garbage collection (reclamation) frees space and is judged by how much invalid data it finds, which is not the same goal as evening wear, as Gal and Toledo stress. Bad-block management retires blocks that have already failed or were bad from the factory; the UBI page treats it as a separate feature from wear leveling.
| Mechanism (date, source) | How wear is spread | State kept | Trigger or threshold | Source and status |
|---|---|---|---|---|
| Wells, Intel US 5,341,339 (filed 1992-1993, issued 1994) | Picks the block to clean by a weighted mix of invalid sectors and erase count; a wear-heavy score when time allows | Erase count per block | Weights 0.8 and 0.2; wear-heavy cleanup at a difference of 500 erase operations or more | Patent claims read (vendor claim); also described by Gal and Toledo |
| Assar et al., Cirrus Logic US 5,479,638 (filed 1993-03-26, issued 1995) | At one below a maximum count the block is erased a last time, given the file with the smallest count and inhibited from erasing; counters cleared when all near the maximum | Erase counter and erase-inhibit flag per block | Programmable maximum count | Patent description read (vendor claim) |
| Hitachi log-structured driver (1995) | No wear leveling in the prototype; separate cleaning segment for cold data | Log and translation table | Not applicable | Kawaguchi et al., opened (research prototype) |
| Wu and Zwaenepoel, eNVy (1994) | Swap data between the most and least worn units | Erase count per unit | Difference of 100 erase cycles | Via Gal and Toledo only (paper not opened) |
| Lofgren et al., SanDisk and Western Digital (filed 1998-1999) | Relocate least-worn unit's data to a spare unit, copy the worn unit into the freed unit | Erase counter in each unit header, one spare unit | Example difference of 15,000 erase cycles | Via Gal and Toledo only (patents not opened) |
| JFFS, Axis (released late 1999) | Garbage collection rewrites all data on each pass through the log | None needed | Every pass | Woodhouse, opened; he says blocks were erased more often than necessary |
| JFFS2 (2001) | Takes a block holding only valid data on one cleaner pass in 100 | None | jiffies counter divisible by 100 | Woodhouse, opened; Gal and Toledo repeat it (not independent) |
| Ban, M-Systems US 6,732,221 (filed 2001-06-01, issued 2004) | Moves a selected unit's data to a free unit so that successive picks reach every unit | Spare unit; no per-block counters required | Once per a large number of writes or erases; Gal and Toledo give the 1000th erase as an example | Patent opened (vendor claim); Gal and Toledo's description |
| Chang, Hsieh and Kuo static leveler (2007) | Asks the cleaner to recycle a block from a selected block set, which forces cold data to move | One bit per 2^k blocks: 512 bytes for 1 GB at k = 0 | ecnt divided by fcnt at or above T; T = 100 in the reported runs | Authors' slides (research claim, one trace) |
| Linux UBI (mainline since 2.6.22) | Global leveling by moving data between more and less worn eraseblocks | Erase counter in a header on every eraseblock; one eraseblock reserved | Not stated | Project web page, opened |
Uncertainty notes
- Read in full: Gal and Toledo's manuscript text, Woodhouse's 2001 article, the Kawaguchi et al. paper text (extracted from PostScript), the Linux UBI page, and the authors' slides for Chang et al. 2007. Read in the parts that matter here: the descriptions and claims of US 5,341,339, US 5,479,638, US 5,404,485 and the background and summary of US 6,732,221 as printed by Google Patents.
- Not opened and not used for any claim except as described through Gal and Toledo: the eNVy paper (ASPLOS 1994), the Lofgren et al., Jou and Jeppesen, Han and Marshall and Manning patents, the Dan and Williams TrueFFS report, the Intel FTL application note, and the Chang et al. DAC 2007 paper itself. The ACM PDF of the DAC paper returned an access error and was not worked around.
- Not independent: Gal and Toledo's JFFS2 and Wells descriptions rest on Woodhouse's article and on the Wells patent respectively; the 1990s patents are vendor texts that describe each other and the card marks Ban's characterisation of Wells as one party's view. The Chang et al. results are the authors' own, from one trace.
- Single-source items, marked in the text: the Lofgren, Han, Jou and Wu and Zwaenepoel mechanisms and thresholds (Gal and Toledo only), the TrueFFS description (Gal and Toledo citing M-Systems literature), the 87.5% and 100.2% improvements and the memory table (the authors' slides), and the UBI attach times (one page).
- Conflicts shown without resolving them: whether Wells's second score forces cleanup of static blocks (Ban against the claim text and Gal and Toledo's description); the filing and issue dates are those printed by Google Patents and, for Wells, Ban and Cirrus Logic's US 5,479,638, repeated in Gal and Toledo's reference list, so they agree.
- Vendor claims: every patent statement (Wells, Cirrus Logic, M-Systems), including the endurance range of 'tens of thousands to a million' and the halved lifetime for half-static media. The statement of the JFFS2 author is that of a Red Hat engineer describing his own design.
- Calculations: the only calculation in the card is the check that 4,096 blocks of 256 KB at one bit each is 512 bytes, which matches the slide's table; no other figure is computed here. The Kawaguchi et al. price remark and the cost remarks in other sources were read and not used; the card contains no prices, sales, market-share or funding figures.
- Not covered: current SSD controllers, write amplification, ECC and over-provisioning, hot and cold classification by temperature, and any device made after about 2008; no source on them was opened for this card.
Sources
- 01E. Gal and S. Toledo, 'Algorithms and Data Structures for Flash Memories' (pre-publication manuscript of the ACM Computing Surveys 37(2), 2005 survey, PDF at Tel-Aviv University, text opened in full; its page numbers read 'TBD', so page references are to the manuscript; a survey that gives the authors' reading of patents, several of which were not opened by them or by this card) · accessed 2026-10-11
- 02S. E. Wells (Intel), US patent 5,341,339, 'Method for wear leveling in a flash EEPROM memory', filed 1 November 1993 as a continuation of an application filed 30 October 1992, issued 23 August 1994 (Google Patents page, description and claims opened; manufacturer's patent text, so its estimates and claims are vendor claims) · accessed 2026-10-11
- 03M. Assar, S. Nemazie and P. Estakhri (Cirrus Logic), US patent 5,479,638, 'Flash memory mass storage architecture incorporation wear leveling technique', filed 26 March 1993, issued 26 December 1995 (Google Patents page, description opened; vendor patent text) · accessed 2026-10-11
- 04A. Ban (M-Systems), US patent 5,404,485, 'Flash file system', filed 8 March 1993, issued 4 April 1995 (Google Patents page, description opened and searched for wear leveling; vendor patent text; the dates are those printed by Google Patents and by Gal and Toledo) · accessed 2026-10-11
- 05A. Ban (M-Systems Flash Disk Pioneers), US patent 6,732,221, 'Wear leveling of static areas in flash memory', filed 1 June 2001, issued 4 May 2004 (Google Patents page, background and summary opened; vendor patent text that also characterises earlier patents of competitors, so those characterisations are one party's view) · accessed 2026-10-11
- 06A. Kawaguchi, S. Nishioka and H. Motoda (Hitachi Advanced Research Laboratory), 'A Flash-Memory Based File System', USENIX Winter 1995 Technical Conference, New Orleans, January 1995 (abstract page and the paper's PostScript text opened; its price remarks are not used; text extracted from the PostScript, so a few lines were cut by the extraction and are not relied on) · accessed 2026-10-11
- 07D. Woodhouse (Red Hat), 'JFFS: The Journalling Flash File System', presented at the Ottawa Linux Symposium, July 2001 (12-page PDF at sourceware.org opened in full; the author's description of Axis's JFFS and his own JFFS2) · accessed 2026-10-11
- 08Y.-H. Chang, J.-W. Hsieh and T.-W. Kuo, slides for 'Endurance Enhancement of Flash-Memory Storage Systems: An Efficient Static Wear Leveling Design', DAC 2007 (PDF of the authors' slides from pdfs.semanticscholar.org, text opened in full; the paper itself was not opened because the ACM PDF returned an access error, which was not worked around, and a fetch of the ACM abstract page timed out; all numbers are the authors' own results on one trace) · accessed 2026-10-11
- 09Linux MTD project, 'Memory Technology Device (MTD) Subsystem for Linux - UBI' (web page, opened in full; project documentation with statements dated to several years, for example 'as of April 2009'; no author or edition date is printed) · accessed 2026-10-11