add directory Minix
This commit is contained in:
226
Minix/CD-ROM-2.0/DOSUTILS/FIPS/TECHINFO.TXT
Normal file
226
Minix/CD-ROM-2.0/DOSUTILS/FIPS/TECHINFO.TXT
Normal file
@@ -0,0 +1,226 @@
|
||||
Technical Info on FIPS
|
||||
----------------------
|
||||
|
||||
FIPS was written in C++ V2.0 with the Turbo C++ 1.0 and Borland C++ 3.1
|
||||
compilers.
|
||||
It should compile with any newer C++ compiler (perhaps after minor changes
|
||||
to the BIOS calls).
|
||||
|
||||
If you're a C++ wizard, don't look too closely at the code, this is my first
|
||||
C++ program, so it is far from acceptable (too much public data, some ini-
|
||||
tializers and assignment operators are missing etc.). Constructive critizism
|
||||
is always welcome however.
|
||||
|
||||
How FIPS works:
|
||||
|
||||
FIPS uses the BIOS interrupts 13h 00h (reset disks), 13h 02h (read sector),
|
||||
13h 08h (get drive parameters), 13h 03h (write sector) and 13h 04h (verify
|
||||
sector).
|
||||
|
||||
Here is the sequence of function calls in main:
|
||||
|
||||
evaluate_argument_vector
|
||||
read the commandline arguments and set the global variables accordingly
|
||||
notice
|
||||
display copyright notice and version number
|
||||
ask_for_drive_number
|
||||
let the user choose the drive (if more than 1)
|
||||
harddrive.reset
|
||||
reset harddrive
|
||||
harddrive.rootsector->read
|
||||
read the sector 0,0,1 of the chosen drive into an array of unsigned char
|
||||
hd.partition_table().get
|
||||
extract the necessary information from the root sector (see below - The
|
||||
root sector)
|
||||
hd.print_partition_table
|
||||
print the information
|
||||
hd.check
|
||||
check if everything is ok (see below - The root sector)
|
||||
ask_for_partition_number
|
||||
let the user choose the partition
|
||||
partition->bootsector->read
|
||||
read the first sector of the chosen partition to another array
|
||||
partition->bpb().get
|
||||
extract info from the boot sector (see below - The boot sector)
|
||||
partition->print_bpb
|
||||
print the info
|
||||
partition->info().get
|
||||
calculate no. of clusters, starting sector of FATs etc.
|
||||
partition->check
|
||||
check boot sector (see below - The boot sector)
|
||||
fat1.check_against(fat2)
|
||||
check if FAT 1 is identical to FAT 2 (see below - The FAT)
|
||||
save_root_and_boot
|
||||
write root- and boot sector to floppy disk (optional)
|
||||
ask_for_new_start_cylinder
|
||||
ask the user for the first cylinder of the new partition
|
||||
fat2.check_empty
|
||||
check if chosen part of partition is empty (see below - The FAT)
|
||||
hd.calculate_new_root
|
||||
from the chosen start cylinder calculate the new partition table
|
||||
Note that the partition entries will be moved to the beginning of the par-
|
||||
tition table, so that the new partition will be the last one and the drive
|
||||
names will not change.
|
||||
hd.partition_table.put
|
||||
write the new partition table into the root sector buffer
|
||||
hd.partition_table.get,hd.print_partition_table,hd.check
|
||||
check if new root sector is ok
|
||||
partition->calculate_new_boot
|
||||
put new number of sectors in boot sector info
|
||||
partition->bpb()->put
|
||||
write new boot sector info into boot sector buffer
|
||||
partition->bpb()->get,partition->print_bpb,partition->check
|
||||
check if new boot sector is ok
|
||||
ask_for_write_permission
|
||||
ask if user wants to proceed
|
||||
harddrive.rootsector->write
|
||||
write the changed root sector to the disk
|
||||
partition->bootsector->write
|
||||
write the changed boot sector to the disk
|
||||
|
||||
|
||||
The root sector
|
||||
---------------
|
||||
|
||||
The root sector is the first sector on every hard disk. It contains the
|
||||
program that loads the boot sector of the bootable partition and the
|
||||
partition table. The last two bytes of the root sector must be 55 aa (hex).
|
||||
The partition table begins at 1be. It contains 4 * 16 Bytes for the four
|
||||
possible partitions.
|
||||
All numbers are zero based except the start/end-sector number (may be 1-63).
|
||||
One partition entry contains the following:
|
||||
|
||||
1 Byte - Bootable Flag. Must be 0 (not bootable) or 80h (bootable).
|
||||
At most one Partition may be bootable at a time.
|
||||
(somewhere I read the bootable flag may also be 81h for the
|
||||
second drive - does anybody know anything about that?)
|
||||
|
||||
1 Byte - Start Head. The number of the head of the first sector of the
|
||||
partition.
|
||||
|
||||
2 Bytes - Start Sector + Cylinder. The Bits are as follows:
|
||||
|
||||
CCSSSSSS CCCCCCCC
|
||||
|
||||
where the first byte contains the sector number (1 - 63), and
|
||||
the high two bits of the cylinder number. The second byte con-
|
||||
tains the low eight bits of the cylinder number.
|
||||
|
||||
1 Byte - System Indicator. For DOS this may be:
|
||||
|
||||
1 - 12-bit FAT, 16-bit sector number
|
||||
4 - 16-bit FAT, 16-bit sector number
|
||||
5 - Extended Partition
|
||||
6 - 16-bit FAT, 32-bit sector number
|
||||
|
||||
1 Byte - End Head. Head Number of the last sector of the partition
|
||||
|
||||
2 Bytes - End Sector + Cylinder. Same format as Start Sector + Cylinder
|
||||
|
||||
4 Bytes - First Sector. Number of the first sector of the partition. This
|
||||
corresponds to the Start Head, Sector + Cylinder. High Byte
|
||||
comes first.
|
||||
|
||||
4 Bytes - Total number of Sectors.
|
||||
|
||||
The function check_rootsector_validity checks the following:
|
||||
|
||||
- Signature Bytes (55 aa) in the last two bytes of the sector
|
||||
- not more than one bootable partition
|
||||
- Bootable flag is 0 or 80h
|
||||
- Start/End sector of a partition is not 0
|
||||
- Start/End sector & head are not greater than drive geometry allows
|
||||
- Start cylinder * sectors * heads + start head * sectors + start sector - 1
|
||||
= first sector (where sectors is no. of sectors per track, heads is
|
||||
no. of heads of the drive)
|
||||
- End cylinder * sectors * heads + end head * sector + end sector = first
|
||||
sector + number of sectors
|
||||
- if System Indicator is 0, all other bytes of partition entry are 0
|
||||
- all partitions except the first begin on cylinder boundaries (head = 0,
|
||||
sectors = 1)
|
||||
- all partition end on cylinder boundaries
|
||||
- partitions don't overlap
|
||||
- no free space between partitions
|
||||
|
||||
|
||||
The boot sector
|
||||
---------------
|
||||
|
||||
The boot sector is the first sector of every partition. It contains the
|
||||
program that boots the operating system and the bios parameter block.
|
||||
The last two bytes must again contain 55 aa. The information in the
|
||||
boot sector is the following:
|
||||
|
||||
00 3 bytes jump instruction ('eb xx 90' or 'e9 xx xx')
|
||||
03 8 bytes OEM name and version - e.g. MSDOS5.0
|
||||
0b 2 bytes bytes per sector - should be 512
|
||||
0d 1 byte sectors per cluster - power of two
|
||||
0e 2 bytes reserved sectors - typically 1 (boot sector)
|
||||
10 1 byte number of FATs - must be 2
|
||||
11 2 bytes number of rootdirectory entries - typically 512
|
||||
13 2 bytes number of sectors (short) - 0, if BIGDOS partition
|
||||
15 1 byte media descriptor - typically f8h
|
||||
16 2 bytes sectors per FAT - varies
|
||||
18 2 bytes sectors per track
|
||||
1a 2 bytes number of heads
|
||||
1c 2 bytes number of hidden sectors (low)
|
||||
|
||||
- extended BPB since DOS 4.0 -
|
||||
|
||||
1e 2 bytes number of hidden sectors (high)
|
||||
20 4 bytes number of sectors (long)
|
||||
24 1 byte physical drive number - 80h or 81h
|
||||
25 1 byte reserved
|
||||
26 1 byte signature - 29h
|
||||
|
||||
The function check_bootsector_validity checks the following:
|
||||
|
||||
- correct jump instruction
|
||||
- signature bytes 55 aa in the last two bytes of the sector
|
||||
- bytes per sector = 512
|
||||
- sectors per cluster is power of two
|
||||
- reserved sectors = 1
|
||||
- number of FATs = 2
|
||||
- number of rootdirectory entries is multiple of 16
|
||||
- media descriptor = f8h
|
||||
- sectors per fat <= 256
|
||||
- sectors per fat big enough to hold complete FAT
|
||||
- sectors per track matches BIOS info
|
||||
- number of heads matches BIOS info
|
||||
- hidden sectors = start sector
|
||||
- signature = 29h, if BIGDOS
|
||||
- physical drive number = actual drive number
|
||||
- number of sectors matches partition info
|
||||
- system indicator byte in root sector matches partition type
|
||||
|
||||
|
||||
The FAT
|
||||
-------
|
||||
|
||||
The File Allocation Table contains the information how the clusters of the
|
||||
disk are linked to files. Every directory entry contains a pointer to the
|
||||
first cluster of the file. The corresponding cluster entry in the FAT con-
|
||||
tains a pointer to the next cluster, or an EOF marker (FFFF for 16-bit FATs,
|
||||
FFF for 12-bit FATs) if the cluster is the last one of the file.
|
||||
Bad clusters are marked with FFF7 or FF7. Empty clusters are marked with 0.
|
||||
The first cluster on the disk is cluster number 2, it begins at the first
|
||||
sector after the root directory. The FAT entries for the clusters 0 and 1
|
||||
contain the media descriptor byte (usually F8h for harddisk) and two or
|
||||
three FFh bytes.
|
||||
There exist two copies of the FAT on a normal DOS partition, these two
|
||||
copies must be identical. FAT 2 is the primary FAT.
|
||||
|
||||
The function check_fat_validity checks if the two FATs are identical and if
|
||||
the entries 0 and 1 contain what they are supposed to.
|
||||
|
||||
The function check_fat_empty checks if the cluster entries that cover the
|
||||
new partition contain either 0 (empty) or FFF7 (Bad cluster).
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
I hope you find this information useful. If you found anything not to be
|
||||
exact or if you have additions, please let me know asap.
|
||||
|
||||
Arno Schaefer
|
||||
schaefer@rbg.informatik.th-darmstadt.de
|
||||
Reference in New Issue
Block a user