Changeset 700eaa9 in mainline


Ignore:
Timestamp:
2008-10-26T17:26:17Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
23b56ca
Parents:
f772105e
Message:

proper FAT16 boot sector initialization

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/mkfat.py

    rf772105e r700eaa9  
    3535import random
    3636import xstruct
     37
     38def align_up(size, alignment):
     39        "Return size aligned up to alignment"
     40       
     41        if (size % alignment == 0):
     42                return size
     43       
     44        return (((size / alignment) + 1) * alignment)
     45
     46def subtree_size(root, cluster_size):
     47        "Recursive directory walk and calculate size"
     48       
     49        size = 0
     50        files = 0
     51       
     52        for name in os.listdir(root):
     53                canon = os.path.join(root, name)
     54               
     55                if (os.path.isfile(canon)):
     56                        size += align_up(os.path.getsize(canon), cluster_size)
     57                        files += 1
     58               
     59                if (os.path.isdir(canon)):
     60                        size += subtree_size(canon, cluster_size)
     61                        files += 1
     62       
     63        return size + align_up(files * 32, cluster_size)
     64
     65def root_entries(root):
     66        "Return number of root directory entries"
     67       
     68        return len(os.listdir(root))
    3769
    3870BOOT_SECTOR = """little:
     
    77109                return
    78110       
     111        sector_size = 512
     112        cluster_size = 4096
     113       
     114        root_size = align_up(root_entries(sys.argv[1]) * 32, sector_size)
     115        size = subtree_size(sys.argv[1], cluster_size)
     116        fat_size = align_up(size / cluster_size * 2, sector_size)
     117       
     118        sectors = (cluster_size + 2 * fat_size + root_size + size) / sector_size
     119       
    79120        outf = file(sys.argv[2], "w")
    80121       
     
    82123        boot_sector.jmp = [0xEB, 0x3C, 0x90]
    83124        boot_sector.oem = "MSDOS5.0"
    84         boot_sector.sector = 512
    85         boot_sector.cluster = 8 # 4096 bytes per cluster
    86         boot_sector.reserved = 1
     125        boot_sector.sector = sector_size
     126        boot_sector.cluster = cluster_size / sector_size
     127        boot_sector.reserved = cluster_size / sector_size
    87128        boot_sector.fats = 2
    88         boot_sector.rootdir = 224 # FIXME: root directory should be sector aligned
    89         boot_sector.sectors = 0 # FIXME
     129        boot_sector.rootdir = root_size / 32
     130        boot_sector.sectors = (sectors if (sectors <= 65535) else 0)
    90131        boot_sector.descriptor = 0xF8
    91         boot_sector.fat_sectors = 0 # FIXME
    92         boot_sector.track_sectors = 0 # FIXME
    93         boot_sector.heads = 0 # FIXME
     132        boot_sector.fat_sectors = fat_size / sector_size
     133        boot_sector.track_sectors = 63
     134        boot_sector.heads = 6
    94135        boot_sector.hidden = 0
    95         boot_sector.sectors_big = 0 # FIXME
     136        boot_sector.sectors_big = (sectors if (sectors > 65535) else 0)
    96137       
    97         boot_sector.drive = 0
     138        boot_sector.drive = 0x80
    98139        boot_sector.extboot_signature = 0x29
    99140        boot_sector.serial = random.randint(0, 0xFFFFFFFF)
Note: See TracChangeset for help on using the changeset viewer.