From: <Saved by Microsoft Internet Explorer 5>
Subject: Filesystems
Date: Tue, 30 Aug 2005 09:55:18 -0700
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0000_01C5AD48.EDD66AF0"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180

This is a multi-part message in MIME format.

------=_NextPart_000_0000_01C5AD48.EDD66AF0
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://osdev.berlios.de/osd-fs.html

=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" =
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML><HEAD><TITLE>Filesystems</TITLE>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Dutf-8"><LINK=20
href=3D"http://osdev.berlios.de/zhware.css" type=3Dtext/css =
rel=3Dstylesheet><LINK=20
href=3D"" rel=3Dmade>
<META content=3D"osdev, Chris Giese, OSD, file systems, FS" =
name=3Dkeywords>
<META content=3D"MSHTML 6.00.2900.2668" name=3DGENERATOR></HEAD>
<BODY>
<P class=3Dmenu align=3Dright>other formats: ( <A class=3Dmenulink=20
href=3D"http://osdev.berlios.de/osd-fs.xml">xml</A> | <A =
class=3Dmenulink=20
href=3D"http://osdev.berlios.de/osd-fs.txt">txt</A> ) </P>
<P class=3Ddochead>
<H1>Filesystems</H1>
<P></P>
<P><A class=3Daltlink href=3D"mailto:geezer@execpc.com">Chris Giese</A>=20
<BR>Homepage: <A class=3Daltlink=20
href=3D"http://www.execpc.com/~geezer/">http://www.execpc.com/~geezer/</A=
>=20
<BR><BR>$Date: 2002/07/02 07:43:38 $<BR>$Revision: 1.1.1.1 $<BR></P>
<P class=3Dchaphead>
<H2>Executive Summary</H2>
<P></P>
<P class=3Dabstract>A discussion and comparison of various file systems =
<BR></P>
<P class=3Dtochead>
<H2>Contents</H2>
<P></P>
<P>1. <A class=3Daltlink =
href=3D"http://osdev.berlios.de/osd-fs.html#fat">FAT=20
filesystem</A><BR>2. <A class=3Daltlink=20
href=3D"http://osdev.berlios.de/osd-fs.html#fat_layout">Layout of a FAT=20
volume</A><BR>3. <A class=3Daltlink=20
href=3D"http://osdev.berlios.de/osd-fs.html#fat_bpb">FAT bootsector and=20
BPB</A><BR>4. <A class=3Daltlink=20
href=3D"http://osdev.berlios.de/osd-fs.html#fat-dirent">FAT directory=20
entries</A><BR>5. <A class=3Daltlink=20
href=3D"http://osdev.berlios.de/osd-fs.html#fat-fat">The FAT</A><BR>6. =
<A=20
class=3Daltlink href=3D"http://osdev.berlios.de/osd-fs.html#ext2">ext2=20
filesystem</A><BR>7. <A class=3Daltlink=20
href=3D"http://osdev.berlios.de/osd-fs.html#iso">ISO-9660 (CD-ROM)=20
filesystem</A><BR>8. <A class=3Daltlink=20
href=3D"http://osdev.berlios.de/osd-fs.html#overview">Overview of common =

filesystems</A><BR>9. <A class=3Daltlink=20
href=3D"http://osdev.berlios.de/osd-fs.html#snippets">Filesystem code=20
snippets</A><BR>10. <A class=3Daltlink=20
href=3D"http://osdev.berlios.de/osd-fs.html#links">Links</A><BR>11. <A=20
class=3Daltlink =
href=3D"http://osdev.berlios.de/osd-fs.html#doc_chap11">TO=20
DO</A><BR></P>
<P class=3Dchaphead>
<H2><A name=3Dfat>1.</A>FAT filesystem</H2>
<P></P>
<P>FAT stands for <FONT class=3Demphasis>File Allocation Table</FONT>, =
the main=20
feature of this filesystem. The FAT filesystem is associated with DOS =
and some=20
versions of Windows. <B><FONT class=3Demphasis>VFAT</FONT></B> (virtual =
FAT) is=20
FAT with <B>long filenames</B>. </P>
<P>Newly-purchased floppy disks advertised as 'formatted' usually =
contain a=20
FAT12 filesystem. </P>
<P class=3Dchaphead>
<H2><A name=3Dfat_layout>2.</A>Layout of a FAT volume</H2>
<P></P><BR><A name=3Ddoc_fig1></A>
<TABLE cellSpacing=3D0 cellPadding=3D0 border=3D0>
  <TBODY>
  <TR>
    <TD class=3Dinfohead>Figure 1</TD></TR>
  <TR>
    <TD class=3Dinfogfx align=3Dmiddle><IMG alt=3D"Fig. 1"=20
      =
src=3D"http://osdev.berlios.de/img/fat.gif"></TD></TR></TBODY></TABLE><BR=
>
<P>A FAT volume contains:=20
<UL>
  <LI>boot sector (more than one for FAT32)=20
  <LI>root directory (not present for FAT32)=20
  <LI>one or more copies of the FAT (almost always 2 copies)=20
  <LI>the data area, where files and subdirectories are stored. For =
FAT32, the=20
  root directory is stored in the data area as well. </LI></UL>
<P></P>
<P class=3Dchaphead>
<H2><A name=3Dfat_bpb>3.</A>FAT bootsector and BPB</H2>
<P></P>
<P>The FAT boot sector contains:=20
<UL>
  <LI>Code to load and run the DOS kernel=20
  <LI>The poorly-named <FONT class=3Demphasis>BIOS Parameter =
Block</FONT> (BPB),=20
  with disk geometry and filesystem info. The BPB corresponds to the =
<FONT=20
  class=3Demphasis>superblock</FONT> of UNIX filesystems.=20
  <LI>Magic values: 55h at offset 510, 0AAh at offset 511. </LI></UL>
<P></P>
<P>Layout of FAT12/FAT16 bootsector with <B>minimal BPB</B>:</P><A=20
name=3Dlisting1></A>
<TABLE cellSpacing=3D0 cellPadding=3D0 width=3D"90%" align=3Dcenter =
border=3D0>
  <TBODY>
  <TR>
    <TD class=3Dinfohead>Code listing 1</TD></TR>
  <TR>
    <TD class=3Dinfotext><PRE>typedef unsigned char u8;
typedef unsigned short u16;	/* Note: multi-byte values are little-endian =
*/
typedef unsigned long u32;
struct fat_bootsector		/* Warning: this struct must be packed */
{
	u8 jump[3];		/* 16-bit JMP to boot code, or 8-bit JMP + NOP */
	u8 oem_id[8];		/* e.g. 'MSWIN4.0' */
	u16 bytes_per_sector;	/* usu. =3D512 */
	u8 sectors_per_cluster;
	u16 num_boot_sectors;	/* usu. =3D1 */
	u8 num_fats;		/* usu. =3D2 */
	u16 num_root_dir_ents;
	u16 total_sectors;	/* 16-bit; 0 if num sectors &gt; 65535 */
	u8 media_ID_byte;       /* usu. =3D0F0h */
	u16 sectors_per_fat;
	u16 sectors_per_track;
	u16 heads;
	u32 hidden_sectors;	/* =3DLBA partition start */
	u32 total_sectors_large;/* 32-bit; 0 if num sectors &lt; 65536 */
	u8 boot_code[474];
	u8 magic[2];		/* 55h, 0AAh */
};                              /* 512 bytes total */
</PRE></TD></TR></TBODY></TABLE>
<P>FAT32 uses additional fields (xxx - todo)</P>
<P class=3Dchaphead>
<H2><A name=3Dfat-dirent>4.</A>FAT directory entries</H2>
<P></P>
<P>FAT directory entries are 32 bytes long:</P><A name=3Dlisting2></A>
<TABLE cellSpacing=3D0 cellPadding=3D0 width=3D"90%" align=3Dcenter =
border=3D0>
  <TBODY>
  <TR>
    <TD class=3Dinfohead>Code listing 2</TD></TR>
  <TR>
    <TD class=3Dinfotext><PRE>typedef unsigned char u8;
typedef unsigned short u16;	/* Note: multi-byte values are little-endian =
*/
typedef unsigned long u32;
struct fat_dirent               /* Warning: this struct must be packed =
*/
{
        u8 name[8];             /* ALL-CAPS, pad right with spaces */
        u8 ext[3];              /* ALL-CAPS, pad right with spaces */
        u8 attrib;              /* attribute byte */
        u8 reserved;            /* =3D0 */
        u8 ctime_ms;            /* file creation time, 10ms units */
        u16 ctime;              /* file creation time, in DOS format */
        u16 cdate;              /* file creation date, in DOS format */
        u16 adate;              /* DOS date of last file access */
        u16 st_clust_msw;       /* high 16 bits of starting cluster =
(FAT32) */
        u16 mtime;              /* DOS time of last file modification */
        u16 mdate;              /* DOS date of last file modification */
        u16 st_clust;           /* starting cluster */
        u32 file_size;          /* in bytes */
};                              /* 32 bytes total =
*/</PRE></TD></TR></TBODY></TABLE>
<P>DOS times and dates are stored in these formats:</P><A =
name=3Dlisting3></A>
<TABLE cellSpacing=3D0 cellPadding=3D0 width=3D"90%" align=3Dcenter =
border=3D0>
  <TBODY>
  <TR>
    <TD class=3Dinfohead>Code listing 3</TD></TR>
  <TR>
    <TD class=3Dinfotext><PRE>struct dos_time                 /* =
Warning: this struct must be packed */
{
        unsigned two_secs : 5;  /* low 5 bits: 2-second increments */
        unsigned minutes : 6;   /* middle 6 bits: minutes */
        unsigned hours : 5;     /* high 5 bits: hours (0-23) */
};                              /* 2 bytes total */

struct dos_date                 /* Warning: this struct must be packed =
*/
{
        unsigned date : 5;      /* low 5 bits: date (1-31) */
        unsigned month : 4;     /* middle 4 bits: month (1-12) */
        unsigned year : 7;      /* high 7 bits: year - 1980 */
};                              /* 2 bytes total =
*/</PRE></TD></TR></TBODY></TABLE>
<P>The Attribute byte is similar to the file 'mode' under UNIX=20
filesystems:</P><A name=3Dlisting4></A>
<TABLE cellSpacing=3D0 cellPadding=3D0 width=3D"90%" align=3Dcenter =
border=3D0>
  <TBODY>
  <TR>
    <TD class=3Dinfohead>Code listing 4</TD></TR>
  <TR>
    <TD class=3Dinfotext><PRE>struct attrib                   /* =
Warning: this struct must be packed */
{
        int read_only : 1;      /* b0 */
        int hidden : 1;
        int system : 1;
        int volume_label : 1;
        int directory : 1;
        int archive : 1;
        int reserved : 2;       /* b6, b7 */
};                              /* 1 byte total =
*/</PRE></TD></TR></TBODY></TABLE>
<P>FAT directory entries contain all <FONT =
class=3Demphasis>metadata</FONT> for a=20
particular file. This is different from UNIX filesystems, which store =
metadata=20
separately from the directory entries (in <FONT =
class=3Demphasis>inodes</FONT>).=20
FAT directory entries are also used for disk volume labels and VFAT long =

filenames (xxx - todo).</P>
<P class=3Dchaphead>
<H2><A name=3Dfat-fat>5.</A>The FAT</H2>
<P></P>
<P>Entries in the FAT can be 12 bits wide (FAT12), 16 bits wide (FAT16), =
or 32=20
bits wide (FAT32). FAT entries do not necessarily refer to disk sectors, =
but to=20
<B><FONT class=3Demphasis>clusters</FONT></B>, which are <B>groups of =
contiguous=20
sectors</B>. The number of sectors per cluster is always a power of 2. =
The FAT=20
format used is determined solely by the number of clusters in the =
volume:=20
<UL>
  <LI>FAT12: 1...4084 (0FF4h) clusters=20
  <LI>FAT16: 4085...65524 (0FFF4h) clusters=20
  <LI>FAT32: 65525... clusters </LI></UL>
<P></P>
<P>Used FAT entries form <B><FONT class=3Demphasis>singly linked =
lists</FONT></B>,=20
indicating which clusters are used by each file or subdirectory. Some =
FAT entry=20
values are special:</P>
<P>
<TABLE class=3Dntable cellSpacing=3D0 cellPadding=3D0>
  <TBODY>
  <TR>
    <TH class=3Dinfohead><B>FAT special value</B></TH>
    <TH class=3Dinfohead><B>FAT12</B></TH>
    <TH class=3Dinfohead><B>FAT16</B></TH>
    <TH class=3Dinfohead><B>FAT32</B></TH></TR>
  <TR>
    <TD class=3Dtableinfo>Free cluster</TD>
    <TD class=3Dtableinfo>0</TD>
    <TD class=3Dtableinfo>0</TD>
    <TD class=3Dtableinfo>0</TD></TR>
  <TR>
    <TD class=3Dtableinfo>Used cluster; pointer to next</TD>
    <TD class=3Dtableinfo>2-0FF4h</TD>
    <TD class=3Dtableinfo>2-0FFF4h</TD>
    <TD class=3Dtableinfo>2-0FFFFFF4h <B>(28-bit)</B> </TD></TR>
  <TR>
    <TD class=3Dtableinfo>Bad cluster</TD>
    <TD class=3Dtableinfo>0FF7h</TD>
    <TD class=3Dtableinfo>0FFF7h</TD>
    <TD class=3Dtableinfo>0FFFFFF7h <B>(28-bit)</B> </TD></TR>
  <TR>
    <TD class=3Dtableinfo>Used cluster; last in chain</TD>
    <TD class=3Dtableinfo>0FFFh</TD>
    <TD class=3Dtableinfo>0FFFFh</TD>
    <TD class=3Dtableinfo>0FFFFFFFh <B>(28-bit)</B> =
</TD></TR></TBODY></TABLE></P>
<P class=3Dchaphead>
<H2><A name=3Dext2>6.</A>ext2 filesystem</H2>
<P></P>
<P>xxx - to do </P>
<P class=3Dchaphead>
<H2><A name=3Diso>7.</A>ISO-9660 (CD-ROM) filesystem</H2>
<P></P>
<P><A=20
href=3D"http://mobius.sf.net/tutes/iso9660.txt">http://mobius.sf.net/tute=
s/iso9660.txt</A>=20
</P>
<P class=3Dchaphead>
<H2><A name=3Doverview>8.</A>Overview of common filesystems</H2>
<P></P>
<P>Thanks to Peter Montagner for information on Macintosh HFS+ =
filesystem.</P>
<P>
<TABLE class=3Dntable cellSpacing=3D0 cellPadding=3D0>
  <TBODY>
  <TR>
    <TH class=3Dinfohead><B></B></TH>
    <TH class=3Dinfohead><B>FAT12/16 (DOS)</B></TH>
    <TH class=3Dinfohead><B>VFAT (Win95), FAT32 (Win98)</B></TH>
    <TH class=3Dinfohead><B>NTFS</B></TH>
    <TH class=3Dinfohead><B>ext2 (Linux)</B></TH></TR>
  <TR>
    <TD class=3Dtableinfo>Filename length</TD>
    <TD class=3Dtableinfo>8.3</TD>
    <TD class=3Dtableinfo>255</TD>
    <TD class=3Dtableinfo>255</TD>
    <TD class=3Dtableinfo>255</TD></TR>
  <TR>
    <TD class=3Dtableinfo>Path length</TD>
    <TD class=3Dtableinfo>80</TD>
    <TD class=3Dtableinfo>260</TD>
    <TD class=3Dtableinfo>32767</TD>
    <TD class=3Dtableinfo></TD></TR>
  <TR>
    <TD class=3Dtableinfo>Illegal characters in filenames</TD>
    <TD class=3Dtableinfo><FONT class=3Dcode>(nul) " * + , . / : ; &lt; =
=3D &gt; ? [=20
      \ ] |</FONT></TD>
    <TD class=3Dtableinfo><FONT class=3Dcode>(nul) " * / : &lt; &gt; ? \ =

    |</FONT></TD>
    <TD class=3Dtableinfo></TD>
    <TD class=3Dtableinfo><FONT class=3Dcode>(nul) /</FONT></TD></TR>
  <TR>
    <TD class=3Dtableinfo>Legal characters in filenames</TD>
    <TD class=3Dtableinfo>
      <P><FONT class=3Dcode>(space) ! # $ % &amp; ' ( ) - 0-9 @ A-Z ^ _ =
` a-z { }=20
      ~</FONT></P>
      <P>Leading . or space is illegal<BR>Trailing . or space =
ignored.</P></TD>
    <TD class=3Dtableinfo>
      <P><FONT class=3Dcode>(space) ! # $ % &amp; ' ( ) + , - . 0-9 ; =
=3D @ A-Z [ ]=20
      ^ _ ` a-z { } ~</FONT> </P>
      <P>Leading space ignored<BR>Single . or space is =
illegal<BR>Trailing . or=20
      space ignored.</P></TD>
    <TD class=3Dtableinfo></TD>
    <TD class=3Dtableinfo>everything but<BR><FONT class=3Dcode>(nul) =
/</FONT>=20
  </TD></TR>
  <TR>
    <TD class=3Dtableinfo>Limit to number of root directory entries</TD>
    <TD class=3Dtableinfo>YES</TD>
    <TD class=3Dtableinfo>VFAT12/16: YES<BR>FAT32: no</TD>
    <TD class=3Dtableinfo>no</TD>
    <TD class=3Dtableinfo>no ?</TD></TR>
  <TR>
    <TD class=3Dtableinfo>Maximum subdirectory depth</TD>
    <TD class=3Dtableinfo>no</TD>
    <TD class=3Dtableinfo>no</TD>
    <TD class=3Dtableinfo>no ?</TD>
    <TD class=3Dtableinfo>no</TD></TR>
  <TR>
    <TD class=3Dtableinfo>Directories sorted by name</TD>
    <TD class=3Dtableinfo>NO</TD>
    <TD class=3Dtableinfo>NO</TD>
    <TD class=3Dtableinfo>?</TD>
    <TD class=3Dtableinfo>yes?</TD></TR>
  <TR>
    <TD class=3Dtableinfo>Block size</TD>
    <TD class=3Dtableinfo>FAT12: 512 bytes-4K<BR>FAT16: 2K-32K</TD>
    <TD class=3Dtableinfo>4K-32K</TD>
    <TD class=3Dtableinfo>512 bytes-64K</TD>
    <TD class=3Dtableinfo>1K-</TD></TR>
  <TR>
    <TD class=3Dtableinfo>Character set</TD>
    <TD class=3Dtableinfo></TD>
    <TD class=3Dtableinfo>UCS-2 Unicode</TD>
    <TD class=3Dtableinfo>UCS-2 Unicode</TD>
    <TD class=3Dtableinfo>Undefined; can be ASCII, Latin-1, UTF-8 =
Unicode,=20
    etc.</TD></TR>
  <TR>
    <TD class=3Dtableinfo>Endian</TD>
    <TD class=3Dtableinfo>little</TD>
    <TD class=3Dtableinfo>little</TD>
    <TD class=3Dtableinfo>?</TD>
    <TD class=3Dtableinfo>little</TD></TR></TBODY></TABLE></P>
<P>
<TABLE class=3Dntable cellSpacing=3D0 cellPadding=3D0>
  <TBODY>
  <TR>
    <TH class=3Dinfohead><B></B></TH>
    <TH class=3Dinfohead><B>ISO9660 (CD-ROM)</B></TH>
    <TH class=3Dinfohead><B>Joliet</B></TH>
    <TH class=3Dinfohead><B>Mac HFS+</B></TH></TR>
  <TR>
    <TD class=3Dtableinfo>Filename length</TD>
    <TD class=3Dtableinfo>Level 1: 8.3 files, 8 for =
subdirectories<BR>Level 2/3:=20
      31</TD>
    <TD class=3Dtableinfo>64</TD>
    <TD class=3Dtableinfo>255</TD></TR>
  <TR>
    <TD class=3Dtableinfo>Path length</TD>
    <TD class=3Dtableinfo></TD>
    <TD class=3Dtableinfo></TD>
    <TD class=3Dtableinfo></TD></TR>
  <TR>
    <TD class=3Dtableinfo>Illegal characters in filenames</TD>
    <TD class=3Dtableinfo>
      <P><FONT class=3Dcode>(nul) (space) ! " # $ % &amp; ' ( ) * + , - =
. / : ;=20
      &lt; =3D &gt; ? @ [ \ ] ^ ` { | } ~</FONT> </P>
      <P>Extension with directory name is not allowed</P></TD>
    <TD class=3Dtableinfo></TD>
    <TD class=3Dtableinfo><FONT class=3Dcode>(nul) :</FONT></TD></TR>
  <TR>
    <TD class=3Dtableinfo>Legal characters in filenames</TD>
    <TD class=3Dtableinfo><FONT class=3Dcode>0-9 A-Z _</FONT></TD>
    <TD class=3Dtableinfo></TD>
    <TD class=3Dtableinfo>everything but<BR><FONT class=3Dcode>(nul) =
:</FONT>=20
  </TD></TR>
  <TR>
    <TD class=3Dtableinfo>Limit to number of root directory entries</TD>
    <TD class=3Dtableinfo>no ?</TD>
    <TD class=3Dtableinfo>no</TD>
    <TD class=3Dtableinfo>no</TD>
    <TD class=3Dtableinfo></TD></TR>
  <TR>
    <TD class=3Dtableinfo>Maximum subdirectory depth</TD>
    <TD class=3Dtableinfo>8</TD>
    <TD class=3Dtableinfo>no</TD>
    <TD class=3Dtableinfo></TD></TR>
  <TR>
    <TD class=3Dtableinfo>Directories sorted by name</TD>
    <TD class=3Dtableinfo>yes</TD>
    <TD class=3Dtableinfo>yes</TD>
    <TD class=3Dtableinfo></TD></TR>
  <TR>
    <TD class=3Dtableinfo>Block size</TD>
    <TD class=3Dtableinfo>2K</TD>
    <TD class=3Dtableinfo>2K ?</TD>
    <TD class=3Dtableinfo></TD></TR>
  <TR>
    <TD class=3Dtableinfo>Character set</TD>
    <TD class=3Dtableinfo>ASCII</TD>
    <TD class=3Dtableinfo>UCS-2 Unicode</TD>
    <TD class=3Dtableinfo>UCS-2 Unicode</TD></TR>
  <TR>
    <TD class=3Dtableinfo>Endian</TD>
    <TD class=3Dtableinfo>Big AND little (committee invention :)</TD>
    <TD class=3Dtableinfo></TD>
    <TD class=3Dtableinfo>big</TD></TR></TBODY></TABLE></P><A =
name=3Dlisting5></A>
<TABLE cellSpacing=3D0 cellPadding=3D0 width=3D"90%" align=3Dcenter =
border=3D0>
  <TBODY>
  <TR>
    <TD class=3Dinfohead><A =
href=3D"http://osdev.berlios.de/src/nametest.c">Code=20
      listing 5: Illegal characters in filenames</A></TD></TR>
  <TR>
    <TD class=3Dinfotext><PRE>#include &lt;sys/stat.h&gt;
#include &lt;stdio.h&gt;

#if defined(__TURBOC__)
#include &lt;io.h&gt;

#elif defined(__GNUC__)
#include &lt;unistd.h&gt;
#include &lt;fcntl.h&gt;
#endif
/************************************************************************=
*****
*************************************************************************=
****/
int main(void)
{
	char buf[16];
	int i, j;

	printf("These characters are illegal for file names:\n");
	for(i =3D ' '; i &lt; 256; i++)
	{
		sprintf(buf, "%c", i);
		j =3D creat(buf, S_IWRITE);
		if(j &gt;=3D 0)
		{
			close(j);
			unlink(buf);
		}
		else
			printf("%c (0x%02X)  ", i, i);
	}
	printf("\n");
	return 0;
}
</PRE></TD></TR></TBODY></TABLE>
<P class=3Dchaphead>
<H2><A name=3Dsnippets>9.</A>Filesystem code snippets</H2>
<P></P>
<P><A href=3D"http://osdev.berlios.de/src/fat_info.c">Check disk for FAT =

filesystem, display info</A></P>
<P><A href=3D"http://osdev.berlios.de/src/e2_info.c">Check disk for ext2 =

filesystem, display info</A></P>
<P class=3Dchaphead>
<H2><A name=3Dlinks>10.</A>Links</H2>
<P></P>
<P>Information on FAT12/FAT16 (DOS) filesystems:=20
<UL>
  <LI><A=20
  =
href=3D"http://www.nondot.org/sabre/os/articles/FileSystems/">http://www.=
nondot.org/sabre/os/articles/FileSystems/</A>=20

  <LI><A=20
  =
href=3D"http://www.thesky.demon.co.uk/filesystems/fat-filesystem.html">ht=
tp://www.thesky.demon.co.uk/filesystems/fat-filesystem.html</A>,=20
  <A=20
  =
href=3D"http://www.thesky.demon.co.uk/filesystems/fat16-filesystem.html">=
http://www.thesky.demon.co.uk/filesystems/fat16-filesystem.html</A>=20

  <LI><A=20
  =
href=3D"http://home.no.net/tkos/info/fat.html">http://home.no.net/tkos/in=
fo/fat.html</A>=20

  <LI>Official MS docs for FAT32: <A=20
  =
href=3D"http://www.microsoft.com/hwdev/hardware/fatgendown.asp">http://ww=
w.microsoft.com/hwdev/hardware/fatgendown.asp</A>=20
  </LI></UL>
<P></P>
<P>Information on ext2fs (Linux filesystem):=20
<UL>
  <LI><A=20
  =
href=3D"http://uranus.it.swin.edu.au/~jn/explore2fs/es2fs.htm">http://ura=
nus.it.swin.edu.au/~jn/explore2fs/es2fs.htm</A>=20
  </LI></UL>
<P></P>
<P class=3Dchaphead>
<H2><A name=3D"&#10;doc_chap11">11.</A>TO DO</H2>
<P></P>
<P>
<UL>
  <LI>linked list for used and free sectors (FAT family)=20
  <LI>tree for used sectors, bitmap for free (UNIX family)=20
  <LI>subdirectories=20
  <LI>advanced: journalling, striping=20
  <LI>sorted directories let you perform a fast binary search </LI></UL>
<P></P>
<P>
<DIV class=3Dcopyright>last updates $Date: 2002/07/02 07:43:38 $</DIV>
<P></P></BODY></HTML>

------=_NextPart_000_0000_01C5AD48.EDD66AF0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://osdev.berlios.de/img/fat.gif

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

------=_NextPart_000_0000_01C5AD48.EDD66AF0
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://osdev.berlios.de/zhware.css

ADDRESS {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
BLOCKQUOTE {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
BODY {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
CAPTION {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
CENTER {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
DD {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
DIR {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
DIV {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
DL {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
DT {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
FORM {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
LI {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
MENU {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
OL {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
P {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
PRE {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
TD {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
TH {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
TR {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
UL {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; COLOR: #000000; FONT-FAMILY: =
Arial
}
BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #c0c0c0; =
PADDING-BOTTOM: 0px; MARGIN-LEFT: 4%; CURSOR: default; MARGIN-RIGHT: 4%; =
PADDING-TOP: 0px
}
H1 {
	FONT-WEIGHT: bold; FONT-SIZE: 24px; COLOR: #8c2931; FONT-FAMILY: Arial
}
H2 {
	BORDER-TOP-WIDTH: 1px; FONT-WEIGHT: bold; BORDER-LEFT-WIDTH: 1px; =
FONT-SIZE: 20px; COLOR: #8c2931; BORDER-BOTTOM: 1px solid; FONT-FAMILY: =
Arial; BORDER-RIGHT-WIDTH: 1px
}
H3 {
	FONT-WEIGHT: bold; FONT-SIZE: 18px; COLOR: #8c2931; FONT-FAMILY: Arial
}
H4 {
	FONT-WEIGHT: bold; FONT-SIZE: 16px; COLOR: #8c2931; FONT-FAMILY: Arial
}
H5 {
	FONT-WEIGHT: bold; FONT-SIZE: 14px; COLOR: #8c2931; FONT-FAMILY: Arial
}
A {
	BACKGROUND: none transparent scroll repeat 0% 0%; CURSOR: pointer
}
A:link {
	COLOR: blue; TEXT-DECORATION: underline
}
A:visited {
	COLOR: #8c2931; TEXT-DECORATION: underline
}
A:active {
	COLOR: #8c2931; TEXT-DECORATION: underline
}
A:hover {
	COLOR: #8c2931; TEXT-DECORATION: underline
}
A.altlink {
	TEXT-DECORATION: none
}
A.menulink {
	TEXT-DECORATION: none
}
ADDRESS {
	FONT-STYLE: italic
}
BIG {
	FONT-SIZE: 18px
}
SMALL {
	FONT-SIZE: 12px
}
SUB {
	FONT-SIZE: 12px
}
SUP {
	FONT-SIZE: 12px
}
CITE {
	FONT-STYLE: italic
}
CODE {
	FONT-SIZE: 12px
}
KBD {
	FONT-SIZE: 12px
}
SAMP {
	FONT-SIZE: 12px
}
TT {
	FONT-SIZE: 12px
}
HTML {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
BUTTON {
	CURSOR: auto
}
INPUT {
	CURSOR: auto
}
TEXTAREA {
	CURSOR: text
}
DT {
	FONT-WEIGHT: bold
}
TD {
	MARGIN-LEFT: 0px
}
UL {
	MARGIN-LEFT: 0px
}
OL {
	MARGIN-LEFT: 0px
}
TH {
	FONT-WEIGHT: bold; MARGIN-LEFT: 0px; TEXT-ALIGN: center
}
PRE {
	PADDING-RIGHT: 0.5em; PADDING-LEFT: 0.5em; PADDING-BOTTOM: 0.5em; =
MARGIN: 0.5em 5% 0.5em 3%; PADDING-TOP: 0.5em; WHITE-SPACE: pre; =
font-face: monospace
}
.copyright {
	BORDER-TOP: 1px solid; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; =
BORDER-BOTTOM-WIDTH: 1px; TEXT-ALIGN: right; BORDER-RIGHT-WIDTH: 1px
}
.menu {
	BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; =
BORDER-BOTTOM: 1px solid; TEXT-ALIGN: right; BORDER-RIGHT-WIDTH: 1px
}
.abstract {
	FONT-SIZE: 12px
}
.infohead {
	FONT-SIZE: 12px; BACKGROUND-COLOR: #ffcc66
}
.infotext {
	FONT-SIZE: 12px; BACKGROUND-COLOR: #ddddff
}
.secthead {
	FONT-WEIGHT: bold
}
.path {
	COLOR: #8c2931
}
.code {
	COLOR: #8c2931
}
.note {
	BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 0.5em; BORDER-TOP: black =
1px solid; PADDING-LEFT: 0.5em; FONT-SIZE: 12px; PADDING-BOTTOM: 0.5em; =
MARGIN-LEFT: 20px; BORDER-LEFT: black 1px solid; MARGIN-RIGHT: 20px; =
PADDING-TOP: 0.5em; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: =
#d0d0d0
}
.warntext {
	BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 0.5em; BORDER-TOP: black =
1px solid; PADDING-LEFT: 0.5em; FONT-SIZE: 12px; PADDING-BOTTOM: 0.5em; =
MARGIN-LEFT: 20px; BORDER-LEFT: black 1px solid; MARGIN-RIGHT: 20px; =
PADDING-TOP: 0.5em; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: =
#ffcc66
}
.impotext {
	PADDING-RIGHT: 0.5em; PADDING-LEFT: 0.5em; FONT-SIZE: 12px; =
PADDING-BOTTOM: 0.5em; MARGIN-LEFT: 20px; MARGIN-RIGHT: 20px; =
PADDING-TOP: 0.5em; BACKGROUND-COLOR: #ddddff
}
UL {
	LIST-STYLE-TYPE: disc
}
MENU {
	LIST-STYLE-TYPE: disc
}
DIR {
	LIST-STYLE-TYPE: disc
}
OL {
	LIST-STYLE-TYPE: decimal
}
UL UL OL OL {
	LIST-STYLE-TYPE: lower-alpha
}
UL OL UL OL {
	LIST-STYLE-TYPE: lower-alpha
}
OL UL OL OL {
	LIST-STYLE-TYPE: lower-alpha
}
OL OL UL OL {
	LIST-STYLE-TYPE: lower-alpha
}
OL UL OL {
	LIST-STYLE-TYPE: lower-alpha
}
OL OL {
	LIST-STYLE-TYPE: lower-alpha
}
OL UL OL OL {
	LIST-STYLE-TYPE: lower-roman
}
OL OL UL OL {
	LIST-STYLE-TYPE: lower-roman
}
UL OL OL OL {
	LIST-STYLE-TYPE: lower-roman
}
OL OL OL {
	LIST-STYLE-TYPE: lower-roman
}
OL OL OL OL {
	LIST-STYLE-TYPE: decimal
}
UL UL {
	LIST-STYLE-TYPE: circle
}
OL OL UL UL {
	LIST-STYLE-TYPE: circle
}
OL UL OL UL {
	LIST-STYLE-TYPE: circle
}
UL OL OL UL {
	LIST-STYLE-TYPE: circle
}
OL UL UL {
	LIST-STYLE-TYPE: circle
}
UL OL UL {
	LIST-STYLE-TYPE: circle
}
OL UL UL UL {
	LIST-STYLE-TYPE: square
}
UL OL UL UL {
	LIST-STYLE-TYPE: square
}
UL UL OL UL {
	LIST-STYLE-TYPE: square
}
UL UL UL {
	LIST-STYLE-TYPE: square
}
UL UL UL UL {
	LIST-STYLE-TYPE: disc
}

------=_NextPart_000_0000_01C5AD48.EDD66AF0--

