Restructuring and expanding storage system.
This commit is contained in:
1 parent
b18c9384b3
commit
ba38f4fd19
6 files changed
+461
-6
No files matched your search
@@ -21,7 +21,8 @@ uses
|
||||
lmemorymanager,
|
||||
storagemanagement,
|
||||
strings,
|
||||
tracer;
|
||||
tracer,
|
||||
drivemanager;
|
||||
|
||||
type
|
||||
TPortMode = (P_READ, P_WRITE);
|
||||
@@ -267,6 +268,7 @@ var
|
||||
slaveDevice : TStorage_Device;
|
||||
buffer : puint8;
|
||||
i : uint8;
|
||||
test : PStorage_device;
|
||||
begin
|
||||
push_trace('ide.load');
|
||||
console.writestringln('[IDE] (LOAD) BEGIN');
|
||||
@@ -288,14 +290,15 @@ begin
|
||||
exit;
|
||||
end;
|
||||
|
||||
masterDevice.hpc:= uint32(IDEDevices[0].info[3] DIV IDEDevices[0].info[1]);
|
||||
// masterDevice.hpc:= uint32(IDEDevices[0].info[3] DIV IDEDevices[0].info[1]); //TODO wtf is hpc
|
||||
|
||||
masterDevice.sectorSize:= 512;
|
||||
if masterDevice.maxSectorCount <> 0 then begin
|
||||
IDEDevices[0].exists:= true;
|
||||
masterDevice.readCallback:= @dread;
|
||||
masterDevice.writeCallback:= @dwrite;
|
||||
storagemanagement.register_device(@masterDevice);
|
||||
// storagemanagement.register_device(@masterDevice);
|
||||
drivemanager.register_device(@masterDevice);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
{
|
||||
Driver->Storage->MBR Master boot record
|
||||
|
||||
@author(Aaron Hance [email protected])
|
||||
}
|
||||
unit mbr;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
tracer;
|
||||
|
||||
type
|
||||
|
||||
PMaster_Boot_Record = ^TMaster_Boot_Record;
|
||||
PPartition_table = ^TPartition_table;
|
||||
|
||||
TPartition_table = bitpacked record
|
||||
attributes : uint8;
|
||||
CHS_start : array[0..2] of uint8;
|
||||
system_id : uint8;
|
||||
CHS_end : array[0..2] of uint8;
|
||||
LBA_start : uInt32;
|
||||
sector_count : uInt32;
|
||||
end;
|
||||
|
||||
TMaster_Boot_Record = bitpacked record
|
||||
bootstrap : array[0..439] of uint8;
|
||||
signature : uint32;
|
||||
rsv : uint16;
|
||||
partition_0 : TPartition_table;
|
||||
partition_1 : TPartition_table;
|
||||
partition_2 : TPartition_table;
|
||||
partition_3 : TPartition_table;
|
||||
boot_sector : uint16;
|
||||
end;
|
||||
|
||||
T24bit = array[0..2] of uint8;
|
||||
|
||||
function get_bootable(partition_table : PPartition_table) : boolean;
|
||||
procedure set_bootable(partition_table : PPartition_table);
|
||||
procedure setup_partition(partition_table : PPartition_table; address : uint32; sectorSize : uint32);
|
||||
|
||||
implementation
|
||||
|
||||
{ convert LBA address to CHS address}
|
||||
function LBA_2_CHS(lba : uint32) : T24bit;
|
||||
var
|
||||
dat : T24bit;
|
||||
begin
|
||||
//TODO impliment procedure
|
||||
LBA_2_CHS := dat;
|
||||
end;
|
||||
|
||||
{ Set a partition struct to be bootable}
|
||||
procedure set_bootable(partition_table : PPartition_table);
|
||||
begin
|
||||
push_trace('MBR.set_bootable');
|
||||
//set the bootble bit in attributes
|
||||
partition_table^.attributes := (partition_table^.attributes and $80);
|
||||
end;
|
||||
|
||||
{ Check a partitions bootable bit }
|
||||
function get_bootable(partition_table : PPartition_table) : boolean;
|
||||
begin
|
||||
push_trace('MBR.get_bootable');
|
||||
//get the bootble bit in attributes
|
||||
get_bootable := (partition_table^.attributes and $80) = $80;
|
||||
end;
|
||||
|
||||
{ Setup a partition table struct }
|
||||
procedure setup_partition(partition_table : PPartition_table; address : uint32; sectorSize : uint32);
|
||||
begin
|
||||
push_trace('MBR.setup_partition');
|
||||
//set values in both LBA and CHS addressing schemes
|
||||
partition_table^.LBA_start := address;
|
||||
partition_table^.sector_count := sectorSize;
|
||||
partition_table^.CHS_start := LBA_2_CHS(address);
|
||||
partition_table^.CHS_start := LBA_2_CHS(address + sectorSize);
|
||||
push_trace('MBR.setup_partition.end');
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
File diff suppressed because it is too large.
Load diff
@@ -234,7 +234,8 @@ begin
|
||||
fileSystems:= ll_New(sizeof(TFilesystem));
|
||||
terminal.registerCommand('DISK', @disk_command, 'Disk utility');
|
||||
|
||||
pop_trace();
|
||||
|
||||
|
||||
end;
|
||||
|
||||
{ Register a new drive with the storage manager }
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
{
|
||||
Driver->Storage->VolumeManager Drive volume manager
|
||||
|
||||
@author(Aaron Hance [email protected])
|
||||
}
|
||||
unit volumemanager;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
util,
|
||||
console,
|
||||
drivemanager,
|
||||
strings,
|
||||
lists,
|
||||
tracer,
|
||||
vfs,
|
||||
MBR;
|
||||
|
||||
type
|
||||
|
||||
TDirectory_Entry_Type = (directoryEntry, fileEntry, mountEntry);
|
||||
|
||||
PDirectory_Entry = ^TDirectory_Entry;
|
||||
PFilesystem = ^TFilesystem;
|
||||
PStorage_Volume = ^TStorage_Volume;
|
||||
|
||||
PPWriteHook = procedure(volume : PStorage_volume; directory : pchar; entry : PDirectory_Entry; byteCount : uint32; buffer : puint32; statusOut : puint32);
|
||||
PPReadHook = function(volume : PStorage_Volume; directory : pchar; fileName : pchar; fileExtension : pchar; buffer : puint32; bytecount : puint32) : uint32;
|
||||
PPHIOHook = procedure(volume : PStorage_device; addr : uint32; sectors : uint32; buffer : puint32);
|
||||
PPCreateHook = procedure(disk : PStorage_Device; sectors : uint32; start : uint32; config : puint32);
|
||||
PPDetectHook = procedure(disk : PStorage_Device);
|
||||
PPCreateDirHook = procedure(volume : PStorage_volume; directory : pchar; dirname : pchar; attributes : uint32; status : puint32);
|
||||
PPReadDirHook = function(volume : PStorage_volume; directory : pchar; status : puint32) : PLinkedListBase; //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error
|
||||
|
||||
PPHIOHook_ = procedure;
|
||||
|
||||
TFilesystem = record
|
||||
sName : pchar;
|
||||
system_id : uint8;
|
||||
writeCallback : PPWriteHook;
|
||||
readCallback : PPReadHook;
|
||||
createCallback : PPCreateHook;
|
||||
detectCallback : PPDetectHook;
|
||||
createDirCallback : PPCreateDirHook;
|
||||
readDirCallback : PPReadDirHook;
|
||||
end;
|
||||
|
||||
TStorage_Volume = record
|
||||
device : PStorage_device;
|
||||
sectorStart : uint32;
|
||||
sectorSize : uint32;
|
||||
sectorCount : uint32;
|
||||
freeSectors : uint32;
|
||||
filesystem : PFilesystem;
|
||||
{ True if this drive contains the loaded OS }
|
||||
isBootDrive : boolean;
|
||||
end;
|
||||
|
||||
{ Generic directory entry }
|
||||
TDirectory_Entry = record
|
||||
{ Contains filename and optionally file extension, seperated by the last period.}
|
||||
fileName : pchar;
|
||||
entryType : TDirectory_Entry_Type;
|
||||
// creationT : TDateTime;
|
||||
// modifiedT : TDateTime;
|
||||
end;
|
||||
|
||||
var
|
||||
|
||||
storageVolumes : PLinkedListBase;
|
||||
filesystems : PlinkedListBase;
|
||||
|
||||
procedure init();
|
||||
|
||||
procedure register_filesystem(filesystem : PFilesystem);
|
||||
procedure check_for_volumes(drive : PStorage_device);
|
||||
|
||||
//IO functions
|
||||
|
||||
implementation
|
||||
|
||||
{ Initialise volume manager }
|
||||
procedure init();
|
||||
begin
|
||||
push_trace('VolumeManager.init');
|
||||
|
||||
{ setup lists }
|
||||
storageVolumes:= ll_New(sizeof(TFilesystem));
|
||||
filesystems:= ll_New(sizeof(TFilesystem));
|
||||
end;
|
||||
|
||||
{ register a new type of filesystem }
|
||||
procedure register_filesystem(filesystem : PFilesystem); //TODO on init create null filesystem for empty partition
|
||||
begin
|
||||
//add filesystem
|
||||
|
||||
//check drives for volumes of new type
|
||||
end;
|
||||
|
||||
{ Check for volumes on a physical device }
|
||||
procedure check_for_volumes(drive : PStorage_device);
|
||||
var
|
||||
bootrecord : PMaster_Boot_Record;
|
||||
storageVolume : TStorage_Volume;
|
||||
i : uint32 = 0;
|
||||
elm : void;
|
||||
begin
|
||||
|
||||
drive^.readCallback(drive, 0, 1, puint32(bootrecord));
|
||||
|
||||
//TODO multipe partition entries
|
||||
if bootrecord^.partition_0.LBA_start <> 0 then
|
||||
begin
|
||||
//set volume information
|
||||
storageVolume.device := drive;
|
||||
storageVolume.sectorStart := bootrecord^.partition_0.LBA_start;
|
||||
storageVolume.sectorCount := bootrecord^.partition_0.sector_count;
|
||||
storageVolume.freeSectors := 0; //TODO impliment
|
||||
|
||||
//check for filesystem type
|
||||
for i:=0 to LL_Size(filesystems) - 1 do begin
|
||||
if bootrecord^.partition_0.system_id = PFilesystem(LL_Get(filesystems, i))^.system_id then
|
||||
begin
|
||||
storageVolume.filesystem := PFilesystem(LL_Get(filesystems, i));
|
||||
end;
|
||||
end;
|
||||
|
||||
//add volume to list
|
||||
elm := LL_Add(storageVolumes);
|
||||
memcpy(uint32(@storageVolume), uint32(elm), SizeOf(TStorage_Volume));
|
||||
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
end.
|
||||
+6
-2
@@ -41,6 +41,8 @@ uses
|
||||
E1000,
|
||||
IDE,
|
||||
storagemanagement,
|
||||
drivemanager,
|
||||
volumemanager,
|
||||
lists,
|
||||
net,
|
||||
fat32,
|
||||
@@ -205,7 +207,9 @@ begin
|
||||
tracer.push_trace('kmain.DRVMGMT');
|
||||
drivermanagement.init();
|
||||
tracer.push_trace('kmain.STRMGMT');
|
||||
storagemanagement.init();
|
||||
// storagemanagement.init();
|
||||
drivemanager.init();
|
||||
volumemanager.init();
|
||||
|
||||
{ Hook Timer for Ticks }
|
||||
tracer.push_trace('kmain.TMR');
|
||||
@@ -213,7 +217,7 @@ begin
|
||||
TMR_0_ISR.hook(uint32(@bios_data_area.tick_update));
|
||||
|
||||
{ Filsystems }
|
||||
fat32.init();
|
||||
// fat32.init();
|
||||
|
||||
{ Device Drivers }
|
||||
tracer.push_trace('kmain.DEVDRV');
|
||||
|
||||
Reference in new issue
Block a user