Add fs.c.
This commit is contained in:
parent
8cafc15116
commit
babf3897f4
3
Makefile
3
Makefile
@ -59,7 +59,8 @@ image.bin: mbr.bin fs.img
|
||||
cat $^ >$@
|
||||
|
||||
kernel.bin: kernel.o console.o drivers/vga.o drivers/keyboard.o \
|
||||
string.o drivers/ata.o cpu/vectors.o cpu/idt.o cpu/gdt.o drivers/uart.o
|
||||
string.o drivers/ata.o cpu/vectors.o cpu/idt.o cpu/gdt.o drivers/uart.o \
|
||||
fs/fs.o
|
||||
$(LD) $(LDFLAGS) -o $@ -Ttext 0x1000 $^
|
||||
|
||||
%.o: %.c
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
|
||||
void read_sectors_ATA_PIO(uint32_t target_address, uint32_t LBA, uint8_t sector_count);
|
||||
void write_sectors_ATA_PIO(uint32_t LBA, uint8_t sector_count, uint32_t* bytes);
|
||||
void read_sectors_ATA_PIO(void* target_address, uint32_t LBA, uint8_t sector_count);
|
||||
|
||||
39
fs/fs.c
Normal file
39
fs/fs.c
Normal file
@ -0,0 +1,39 @@
|
||||
#include "fs.h"
|
||||
#include "../string.h"
|
||||
#include "../drivers/ata.h"
|
||||
|
||||
enum {
|
||||
fs_start = 1, // sector where the FS starts
|
||||
};
|
||||
|
||||
int stat(const char* name, struct stat *buf) {
|
||||
struct dir dir;
|
||||
read_sectors_ATA_PIO(&dir, fs_start, 1);
|
||||
for (int i = 0; i < ents_in_dir; ++i) {
|
||||
struct dirent *e = &dir.entries[i];
|
||||
if (!strncmp(e->name, name, sizeof(e->name))) {
|
||||
buf->size = e->size_bytes;
|
||||
buf->reserved[0] = e->offset_sectors;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Find file by name and read it into buffer with size bufsize.
|
||||
* At most (bufsize & -512) bytes will be read.
|
||||
* Return number of bytes read or -1 on failure. */
|
||||
int read_file(const char* name, void* buf, uint32_t bufsize) {
|
||||
struct stat statbuf;
|
||||
if (stat(name, &statbuf) != 0) {
|
||||
return -1;
|
||||
}
|
||||
uint32_t sector = fs_start + statbuf.reserved[0];
|
||||
while (bufsize >= sector_size) {
|
||||
read_sectors_ATA_PIO(buf, sector, 1);
|
||||
sector++;
|
||||
bufsize -= sector_size;
|
||||
buf += sector_size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
3
fs/fs.h
3
fs/fs.h
@ -21,6 +21,7 @@ size is in bytes, name is 0-terminated.
|
||||
|
||||
enum {
|
||||
sector_size = 512,
|
||||
ents_in_dir = 15,
|
||||
};
|
||||
|
||||
struct dirent {
|
||||
@ -32,7 +33,7 @@ struct dirent {
|
||||
|
||||
struct dir {
|
||||
char reserved[32];
|
||||
struct dirent entries[15];
|
||||
struct dirent entries[ents_in_dir];
|
||||
};
|
||||
|
||||
struct stat {
|
||||
|
||||
10
kernel.c
10
kernel.c
@ -8,6 +8,7 @@ asm(".asciz \"kernel start\"");
|
||||
#include "drivers/ata.h"
|
||||
#include "drivers/misc.h"
|
||||
#include "drivers/uart.h"
|
||||
#include "fs/fs.h"
|
||||
|
||||
void _start() {
|
||||
load_gdt();
|
||||
@ -15,13 +16,16 @@ void _start() {
|
||||
uartinit();
|
||||
load_idt();
|
||||
sti();
|
||||
char buf[512];
|
||||
char buf[4096 + 512];
|
||||
|
||||
vga_clear_screen();
|
||||
printk("YABLOKO\n");
|
||||
|
||||
read_sectors_ATA_PIO((uint32_t)buf, 10, 1);
|
||||
printk(buf);
|
||||
if (read_file("kernel.bin", buf, sizeof(buf)) == 0) {
|
||||
printk(buf + 4096);
|
||||
} else {
|
||||
printk("failed to read file\n");
|
||||
}
|
||||
|
||||
while (1) {
|
||||
asm("hlt");
|
||||
|
||||
12
string.c
12
string.c
@ -14,3 +14,15 @@ void kmemmove(char* dst, char* src, size_t size) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int strncmp(const char* s1, const char* s2, size_t size) {
|
||||
while (size && *s1 && *s2 && *s1 == *s2) {
|
||||
size--;
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
if (!size) {
|
||||
return 0;
|
||||
}
|
||||
return (unsigned char)(*s1) - (unsigned char)(*s2);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user