diff --git a/Makefile b/Makefile index 5f7cbd5..173bd5c 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,9 @@ iso: clean_iso clean build cp build/myos.bin root/boot/myos.bin cp src/grub.cfg root/boot/grub/grub.cfg grub-mkrescue -o build/barinkOS.iso root - +run: all + virtualboxvm --startvm "BarinkOS_test" + test: $(EMULATOR) -kernel $(BUILD_DIR)/myos.bin -serial stdio -vga std -display gtk -m 2G -cpu core2duo diff --git a/src/kernel/filesytems/FAT32/BiosParameterBlock.h b/src/kernel/filesytems/FAT/BiosParameterBlock.h similarity index 100% rename from src/kernel/filesytems/FAT32/BiosParameterBlock.h rename to src/kernel/filesytems/FAT/BiosParameterBlock.h diff --git a/src/kernel/filesytems/FAT/DirectoryEntry.h b/src/kernel/filesytems/FAT/DirectoryEntry.h new file mode 100644 index 0000000..c3e48ec --- /dev/null +++ b/src/kernel/filesytems/FAT/DirectoryEntry.h @@ -0,0 +1,19 @@ +#pragma once +#include + +struct DirectoryEntry { + uint8_t filename [8]; + uint8_t Extension [3]; + uint8_t attribute; + uint8_t Reserved; + uint8_t creation; + uint16_t CreationTime; + uint16_t CreationDate; + uint16_t LastAccessDate; + uint16_t ReservedFAT32; + uint16_t LastWriteTime; + uint16_t LastWriteDate; + uint16_t StartingCluster; + uint32_t FilesizeInBytes; + +}__attribute__((packed)); \ No newline at end of file diff --git a/src/kernel/filesytems/FAT32/ExtendBootRecord.h b/src/kernel/filesytems/FAT/ExtendBootRecord.h similarity index 100% rename from src/kernel/filesytems/FAT32/ExtendBootRecord.h rename to src/kernel/filesytems/FAT/ExtendBootRecord.h diff --git a/src/kernel/kernel.cpp b/src/kernel/kernel.cpp index 407f637..9e1a416 100644 --- a/src/kernel/kernel.cpp +++ b/src/kernel/kernel.cpp @@ -3,40 +3,17 @@ #define GB2 262144 -extern "C" void kernel_main (void); - extern "C" void early_main(unsigned long magic, unsigned long addr){ - /** initialize terminal interface */ - kterm_init(); - - if (magic != MULTIBOOT_BOOTLOADER_MAGIC){ - printf("Invalid magic number: 0x%x\n", magic); - return; - } - - CheckMBT( (multiboot_info_t *) addr); - - multiboot_info_t* mbt = (multiboot_info_t*) addr; - - /* Are mmap_* valid? */ - if (CHECK_FLAG(mbt->flags, 6)){ - PhysicalMemoryManager_initialise( mbt->mmap_addr, GB2/* Seriously dangerous hardcoded memory value*/); - PhysicalMemoryManager_initialise_available_regions(mbt->mmap_addr, mbt->mmap_addr + mbt->mmap_length); - PhysicalMemoryManager_deinitialise_kernel(); - extern uint8_t* kernel_begin; - extern uint8_t* kernel_end; - - printf("Kernel MemoryMap:\n"); - printf("kernel: 0x%x - 0x%x\n", &kernel_begin , &kernel_end); + extern "C" void wait_until_shutdown(){ + while (true){ + //Read time indefinetely + read_rtc(); + printf( "UTC time: %02d-%02d-%02d %02d:%02d:%02d [ Formatted as YY-MM-DD h:mm:ss]\r" ,year, month, day, hour, minute, second); + delay(1000); } - initGDT(); - - - kernel_main(); } - extern "C" void kernel_main (void) { @@ -96,11 +73,11 @@ extern "C" void kernel_main (void); i, PT.Number_sectors_inPartition, PT.PartitionType, mbr->uniqueID, PT.LBA_partition_start ); } - // Find the super block - uint16_t superBlock[256]; - ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, mbr->TableEntries[0].LBA_partition_start, superBlock); + // Find the BiosParameter block + uint16_t biosparameterblock[256]; + ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, mbr->TableEntries[0].LBA_partition_start, biosparameterblock); - BiosParameterBlock* bpb = (BiosParameterBlock*) superBlock; + BiosParameterBlock* bpb = (BiosParameterBlock*) biosparameterblock; printf("\nBPB: Bytes per Sector %d\n", bpb->BytesPerSector ); @@ -113,23 +90,124 @@ extern "C" void kernel_main (void); printf("Total Sectors in volume: %d\n", bpb->TotalSectorsInLogicalVolume); printf("Sectors per FAT: %d\n", bpb->NumberOfSectorsPerFAT); - uint32_t PartitionAddress = mbr->TableEntries[0].LBA_partition_start *512 ; - uint32_t RootDirAddress = PartitionAddress + ((bpb->ReservedSectors + bpb->NumberOfSectorsPerFAT * bpb->NumberOfFileAllocationTables ) * bpb->BytesPerSector); - uint32_t RootDirLBA =RootDirAddress/512; - - uint16_t RootDir [16]; - ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER,RootDirLBA, (uint16_t*) RootDir ); - + + /** + * @brief File Allocation Table + */ + uint32_t FATAddress = mbr->TableEntries[0].LBA_partition_start + bpb->ReservedSectors ; + uint16_t FAT[256]; + ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, FATAddress, FAT ); - while (true){ - //Read time indefinetely - read_rtc(); - printf( "UTC time: %02d-%02d-%02d %02d:%02d:%02d [ Formatted as YY-MM-DD h:mm:ss]\r" ,year, month, day, hour, minute, second); - delay(1000); + // Show data in terminal + for(int i = 0; i < 256; i++ ) { + printf("%x ", FAT[i]); } + kterm_put('\n'); + + + uint32_t RootDirectoryRegion = FATAddress + ( bpb->NumberOfFileAllocationTables * bpb->NumberOfSectorsPerFAT ); + uint32_t DataRegion = RootDirectoryRegion + ((bpb->NumberOfDirectoryEntries * 32) / bpb->BytesPerSector ); + + uint16_t data2 [256]; + ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, RootDirectoryRegion, data2 ); + DirectoryEntry* RootDirectory = (DirectoryEntry*) data2; + // List files in root + for(int i= 0; i < bpb->NumberOfDirectoryEntries ; i++ ) + { + DirectoryEntry* entry = (DirectoryEntry*)((uint32_t) RootDirectory + (i * sizeof(DirectoryEntry))); + + if( entry->filename[0] == (uint8_t) 0x00 ) + break; // There are no more entries in this directory or the entry is free + + if( entry->attribute & 0x01 == 0x01 || entry->attribute & 0x20 == 0x20) + continue; // Skip listing if hidden or Achieve flag is set + + // Print the filename; + for( int n = 0; n < 8; n++ ){ + if(entry->filename[n] == 0x20) + break; + kterm_put(entry->filename[n]); + }kterm_put('\n'); + + for( int n = 0; n < 3; n++){ + kterm_put(entry->Extension[n]); + }kterm_put('\n'); + + printf("Attribute: %x \n" , entry->attribute); + printf("FileSize: %d Bytes\n", entry->FilesizeInBytes); + + if( entry->FilesizeInBytes != 0x0 || entry->attribute & 0x8 == 0x0){ + printf("Show contents"); + + printf( "Start cluster of the file: 0x%x\n" , entry->StartingCluster); + + printf("IS it only 1 cluster? %s\n" , FAT[i] == 0xFFFF? "Yes": "No" ); + + uint32_t sector = DataRegion + ((entry->StartingCluster - 0x02 ) * bpb->SectorsPerCluster); + + + uint16_t dataBlob [256]; + ATA_DEVICE::Read(BUS_PORT::Primary, DEVICE_DRIVE::MASTER, sector, dataBlob ); + for( int n = 0; n < 256; n++) + { + kterm_put(dataBlob[n] & 0x00ff); + + kterm_put(dataBlob[n] >> 8); + }kterm_put('\n'); + + + } + + printf("======================\n"); + + + } + + + + + + + wait_until_shutdown(); } + + + + + extern "C" void early_main(unsigned long magic, unsigned long addr){ + /** initialize terminal interface */ + kterm_init(); + + if (magic != MULTIBOOT_BOOTLOADER_MAGIC){ + printf("Invalid magic number: 0x%x\n", magic); + return; + } + + CheckMBT( (multiboot_info_t *) addr); + + multiboot_info_t* mbt = (multiboot_info_t*) addr; + + /* Are mmap_* valid? */ + if (CHECK_FLAG(mbt->flags, 6)){ + PhysicalMemoryManager_initialise( mbt->mmap_addr, GB2/* Seriously dangerous hardcoded memory value*/); + PhysicalMemoryManager_initialise_available_regions(mbt->mmap_addr, mbt->mmap_addr + mbt->mmap_length); + PhysicalMemoryManager_deinitialise_kernel(); + extern uint8_t* kernel_begin; + extern uint8_t* kernel_end; + + printf("Kernel MemoryMap:\n"); + printf("kernel: 0x%x - 0x%x\n", &kernel_begin , &kernel_end); + } + + initGDT(); + + + kernel_main(); + } + + diff --git a/src/kernel/kernel.h b/src/kernel/kernel.h index fe75fb4..3dad1ef 100644 --- a/src/kernel/kernel.h +++ b/src/kernel/kernel.h @@ -22,8 +22,9 @@ extern "C"{ #include "ide/ide.h" #include "./drivers/IO/ata/ataDevice.h" #include "./PartitionTable/MBR/MasterBootRecord.h" -#include "./filesytems/FAT32/BiosParameterBlock.h" -#include "./filesytems/FAT32/ExtendBootRecord.h" +#include "./filesytems/FAT/BiosParameterBlock.h" +#include "./filesytems/FAT/ExtendBootRecord.h" +#include "./filesytems/FAT/DirectoryEntry.h" #include "drivers/ACPI/rsdp.h"