start messing with fat32
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# Define the object files
|
||||
OBJS = bin/boot.o bin/kernel.o bin/idt.o bin/isr.o bin/screen.o bin/utils.o bin/string.o bin/stdio.o bin/disk.o bin/pic.o bin/pit.o bin/keyboard.o bin/paging.o bin/page.o
|
||||
OBJS = bin/boot.o bin/kernel.o bin/idt.o bin/isr.o bin/screen.o bin/utils.o bin/string.o bin/stdio.o bin/disk.o bin/pic.o bin/pit.o bin/keyboard.o bin/paging.o bin/page.o bin/fat.o
|
||||
|
||||
# Define the compiler and assembler
|
||||
CC = gcc -D__is_katauos
|
||||
@@ -10,7 +10,7 @@ CFLAGS = -std=gnu99 -ffreestanding -O0 -Wall -Wextra -m32 -g
|
||||
ASFLAGS = -f elf32
|
||||
|
||||
# Define the linker flags
|
||||
LDFLAGS = -ffreestanding -O0 -nostdlib -m32 -g
|
||||
LDFLAGS = -ffreestanding -O0 -nostdlib -m32 -g -lgcc
|
||||
LDSCRIPT = link.ld
|
||||
|
||||
# Define the output file
|
||||
@@ -18,9 +18,32 @@ OUTPUT = myos.bin
|
||||
|
||||
all: $(OUTPUT)
|
||||
|
||||
image:
|
||||
create-image:
|
||||
cp myos.bin grubshit/boot/
|
||||
grub-mkrescue -o boot.iso grubshit
|
||||
#grub-mkrescue -o boot.iso grubshit
|
||||
dd if=/dev/zero of=boot.iso bs=1M count=256
|
||||
fdisk boot.iso
|
||||
#sudo mkdosfs -F 32 -I boot.iso
|
||||
sudo losetup /dev/loop0 boot.iso
|
||||
sudo losetup /dev/loop1 boot.iso -o 1048576
|
||||
#sudo mkdosfs -F32 -f 2 /dev/loop1
|
||||
sudo mkfs.vfat -F 32 -f 2 /dev/loop1
|
||||
sudo mount /dev/loop1 /mnt
|
||||
sudo grub-install --root-directory=/mnt --no-floppy --modules="normal part_msdos ext2 multiboot biosdisk" /dev/loop0 #there was biosdev also
|
||||
sudo cp -r grubshit/boot/ /mnt/
|
||||
sync
|
||||
sudo umount /mnt
|
||||
sudo losetup -D
|
||||
|
||||
image:
|
||||
cp myos.bin grubshit/boot
|
||||
sudo losetup /dev/loop0 boot.iso
|
||||
sudo losetup /dev/loop1 boot.iso -o 1048576
|
||||
sudo mount /dev/loop1 /mnt
|
||||
sudo cp -r grubshit/boot /mnt/
|
||||
sync
|
||||
sudo umount /mnt
|
||||
sudo losetup -D
|
||||
|
||||
test:
|
||||
qemu-system-i386 -drive file=boot.iso,media=disk,format=raw -m 512M -d int
|
||||
@@ -73,6 +96,9 @@ bin/paging.o: src/paging.c
|
||||
bin/page.o: src/page.asm
|
||||
$(AS) $(ASFLAGS) $< -o $@
|
||||
|
||||
bin/fat.o: src/fat.c
|
||||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
clean:
|
||||
rm -rf bin/
|
||||
rm -f $(OUTPUT)
|
||||
|
||||
+3
-2
@@ -2,6 +2,7 @@
|
||||
#define DISK_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef struct {
|
||||
unsigned short cylinders;
|
||||
@@ -11,7 +12,7 @@ typedef struct {
|
||||
|
||||
void get_disk_info(disk_info *info);
|
||||
int ide_check_disk_present();
|
||||
uint8_t ata_read(uint8_t *buffer, uint32_t lba);
|
||||
void ata_write(uint8_t *buffer, uint32_t lba);
|
||||
bool ata_read(uint8_t *buffer, uint32_t lba);
|
||||
bool ata_write(const uint8_t *buffer, uint32_t lba);
|
||||
|
||||
#endif
|
||||
|
||||
+159
@@ -0,0 +1,159 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2025, Bjørn Brodtkorb. All rights reserved.
|
||||
|
||||
#ifndef FAT_H
|
||||
#define FAT_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
//#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
#define SECT_SIZE 512
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
enum
|
||||
{
|
||||
FAT_ERR_NONE = 0,
|
||||
FAT_ERR_NOFAT = -1,
|
||||
FAT_ERR_BROKEN = -2,
|
||||
FAT_ERR_DISK = -3,
|
||||
FAT_ERR_PARAM = -4,
|
||||
FAT_ERR_PATH = -5,
|
||||
FAT_ERR_EOF = -6,
|
||||
FAT_ERR_DENIED = -7,
|
||||
FAT_ERR_FULL = -8,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
FAT_ATTR_NONE = 0x00,
|
||||
FAT_ATTR_RO = 0x01,
|
||||
FAT_ATTR_HIDDEN = 0x02,
|
||||
FAT_ATTR_SYS = 0x04,
|
||||
FAT_ATTR_LABEL = 0x08,
|
||||
FAT_ATTR_DIR = 0x10,
|
||||
FAT_ATTR_ARCHIVE = 0x20,
|
||||
FAT_ATTR_LFN = 0x0f,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
FAT_SEEK_SET,
|
||||
FAT_SEEK_END,
|
||||
FAT_SEEK_CURR,
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct
|
||||
{
|
||||
bool (*read)(uint8_t* buf, uint32_t sect);
|
||||
bool (*write)(const uint8_t* buf, uint32_t sect);
|
||||
} disk_ops_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t hour;
|
||||
uint8_t min;
|
||||
uint8_t sec;
|
||||
|
||||
uint8_t day;
|
||||
uint8_t month;
|
||||
uint16_t year;
|
||||
} timestamp_t;
|
||||
|
||||
typedef struct fat_t
|
||||
{
|
||||
struct fat_t* next;
|
||||
disk_ops_t ops;
|
||||
char path[32];
|
||||
int pathlen;
|
||||
|
||||
uint32_t sect_per_clust;
|
||||
uint32_t clust_cnt;
|
||||
uint32_t info_sect;
|
||||
uint32_t fat_sect;
|
||||
uint32_t data_sect;
|
||||
uint32_t root_sect;
|
||||
|
||||
uint32_t info_last;
|
||||
uint32_t info_cnt;
|
||||
bool info_dirty;
|
||||
|
||||
uint8_t win[SECT_SIZE];
|
||||
uint32_t win_sect;
|
||||
bool win_dirty;
|
||||
|
||||
uint8_t name[260];
|
||||
int namelen;
|
||||
uint8_t crc;
|
||||
} fat_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
timestamp_t created;
|
||||
timestamp_t modified;
|
||||
|
||||
uint32_t size;
|
||||
uint8_t attr;
|
||||
|
||||
char name[256];
|
||||
int namelen;
|
||||
} dir_info_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
fat_t* fat;
|
||||
uint8_t attr;
|
||||
uint32_t first_clust;
|
||||
uint32_t clust;
|
||||
uint32_t sect;
|
||||
int idx;
|
||||
} dir_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
dir_t dir;
|
||||
uint32_t first_clust;
|
||||
uint32_t clust;
|
||||
uint32_t sect;
|
||||
uint32_t off;
|
||||
uint32_t size;
|
||||
|
||||
uint8_t buf[SECT_SIZE];
|
||||
uint32_t buf_sect;
|
||||
bool buf_dirty;
|
||||
|
||||
bool modified;
|
||||
bool accessed;
|
||||
bool read;
|
||||
bool write;
|
||||
} file_t;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
int fat_mount(disk_ops_t* ops, int part_num, fat_t* fs, const char* path);
|
||||
int fat_umount(fat_t* fs);
|
||||
|
||||
int fat_fopen(file_t* file, const char* path, const char* mode);
|
||||
int fat_fclose(file_t* file);
|
||||
int fat_fread(file_t* file, void* buf, int len);
|
||||
int fat_fwrite(file_t* file, const void* buf, int len);
|
||||
int fat_fprintf(file_t* file, const char* str, ...);
|
||||
int fat_fseek(file_t* file, int offset, int seek);
|
||||
int fat_ftell(file_t* file);
|
||||
int fat_fsize(file_t* file);
|
||||
int fat_fsync(file_t* file);
|
||||
int fat_unlink(const char* path);
|
||||
|
||||
int fat_mkdir(const char* path);
|
||||
int fat_opendir(dir_t* dir, const char* path);
|
||||
int fat_readdir(dir_t* dir, dir_info_t* info);
|
||||
int fat_nextdir(dir_t* dir);
|
||||
|
||||
const char* fat_get_error(int err);
|
||||
|
||||
void fat_get_timestamp(timestamp_t* dt);
|
||||
|
||||
#endif
|
||||
+5
-2
@@ -161,8 +161,9 @@ void ata_poll()
|
||||
|
||||
//https://wiki.osdev.org/ATA_PIO_Mode
|
||||
//x86 directions section
|
||||
uint8_t ata_read(uint8_t *buffer, uint32_t lba)
|
||||
bool ata_read(uint8_t *buffer, uint32_t lba)
|
||||
{
|
||||
printf("ata_read: 0x%X\n", lba);
|
||||
outb(0x1F6, 0xE0 | ((lba >> 24) & 0x0F));//E0 is for master, F0 is for slave
|
||||
//outb(0x1F1, 0x00);//TODO: this is probably ignored so could be removed maybe?
|
||||
outb(0x1F2, 1);//1 is sector count, how many sectors are we reading
|
||||
@@ -177,9 +178,10 @@ uint8_t ata_read(uint8_t *buffer, uint32_t lba)
|
||||
*(uint16_t*)(buffer+i*2) = data;
|
||||
}
|
||||
ata_400ns_delay();
|
||||
return true;
|
||||
}
|
||||
|
||||
void ata_write(uint8_t *buffer, uint32_t lba)
|
||||
bool ata_write(const uint8_t *buffer, uint32_t lba)
|
||||
{
|
||||
outb(0x1F6, 0xE0 | ((lba >> 24) & 0x0F));
|
||||
|
||||
@@ -197,4 +199,5 @@ void ata_write(uint8_t *buffer, uint32_t lba)
|
||||
ata_400ns_delay();
|
||||
}
|
||||
outb(0x1F7, 0xE7);//Cache flush
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -7,9 +7,90 @@
|
||||
#include "../include/pic.h"
|
||||
#include "../include/pit.h"
|
||||
#include "../include/paging.h"
|
||||
#include "../include/fat.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
disk_ops_t ops =
|
||||
{
|
||||
.read = ata_read,
|
||||
.write = ata_write,
|
||||
};
|
||||
|
||||
static fat_t g_fat;
|
||||
static const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||
|
||||
static int cat(const char* path)
|
||||
{
|
||||
file_t file;
|
||||
int err = fat_fopen(&file, path, "r");
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
uint8_t buf[512];
|
||||
for (;;)
|
||||
{
|
||||
int cnt = fat_fread(&file, buf, 512);
|
||||
if (cnt < 0)
|
||||
return cnt;
|
||||
|
||||
printf("%.*s\n", cnt, buf);
|
||||
if (cnt < 512)
|
||||
break;
|
||||
}
|
||||
|
||||
return fat_fclose(&file);
|
||||
}
|
||||
|
||||
static int ls(const char* path)
|
||||
{
|
||||
dir_t dir;
|
||||
dir_info_t info;
|
||||
|
||||
printf("\nListing items in %s:\n\n", path);
|
||||
|
||||
int err = fat_opendir(&dir, path);
|
||||
printf("opening %s\n", path);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
printf("reading dir...\n");
|
||||
|
||||
err = fat_readdir(&dir, &info);
|
||||
if (err == FAT_ERR_EOF)
|
||||
return FAT_ERR_NONE;
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
printf("%X %s %d %d:%d %s%c\n",
|
||||
info.size, months[info.modified.month], info.modified.day,
|
||||
info.modified.hour, info.modified.min,
|
||||
info.namelen, info.name, info.attr & FAT_ATTR_DIR ? '/' : ' ');
|
||||
|
||||
err = fat_nextdir(&dir);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
void file_fuckery()
|
||||
{
|
||||
int err;
|
||||
err = fat_mount(&ops, 0, &g_fat, "/");
|
||||
|
||||
if(err)
|
||||
printf("KATYAKATYAKATYAKATYAKATYA: %X\n", err);
|
||||
|
||||
printf("%X\n", FAT_ERR_NOFAT);
|
||||
|
||||
err = ls(".");
|
||||
//err = fat_fclose(&file);
|
||||
if(err)
|
||||
printf("ERROR! %X\n", err);
|
||||
}
|
||||
|
||||
void apply_pic_masks()
|
||||
{
|
||||
//0x21 is master pic, 0xa1 is slave pic
|
||||
@@ -37,6 +118,7 @@ void kmain()
|
||||
disk_info info;
|
||||
get_disk_info(&info);
|
||||
printf("CYL HEAD SECT: %X %X %X\n", info.cylinders, info.heads, info.sectors);
|
||||
file_fuckery();
|
||||
while(1)
|
||||
{
|
||||
/* if(inportb(0x64) & 0x1)
|
||||
|
||||
Reference in New Issue
Block a user