Merge into main the new state of the operating system/kernel #1
5
Makefile
5
Makefile
@ -5,7 +5,7 @@ CC = ${HOME}/opt/cross/bin/i686-elf-gcc
|
|||||||
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
||||||
CFLAGS = -ffreestanding -Og -ggdb -Wall -Wextra
|
CFLAGS = -ffreestanding -Og -ggdb -Wall -Wextra
|
||||||
|
|
||||||
OFILES =$(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/memory.o $(BUILD_DIR)/paging.o $(BUILD_DIR)/VFS.o $(BUILD_DIR)/pit.o $(BUILD_DIR)/time.o $(BUILD_DIR)/keyboard.o $(BUILD_DIR)/io.o $(BUILD_DIR)/processor.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/sv-terminal.o $(BUILD_DIR)/string.o $(BUILD_DIR)/prekernel.o $(BUILD_DIR)/KHeap.o $(BUILD_DIR)/pci.o $(BUILD_DIR)/pcidevice.o $(BUILD_DIR)/atapiDevice.o $(BUILD_DIR)/ataDevice.o $(BUILD_DIR)/rsdp.o $(BUILD_DIR)/acpi.o
|
OFILES =$(BUILD_DIR)/boot.o $(BUILD_DIR)/Path.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/memory.o $(BUILD_DIR)/paging.o $(BUILD_DIR)/VFS.o $(BUILD_DIR)/pit.o $(BUILD_DIR)/time.o $(BUILD_DIR)/keyboard.o $(BUILD_DIR)/io.o $(BUILD_DIR)/processor.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/sv-terminal.o $(BUILD_DIR)/string.o $(BUILD_DIR)/prekernel.o $(BUILD_DIR)/KHeap.o $(BUILD_DIR)/pci.o $(BUILD_DIR)/pcidevice.o $(BUILD_DIR)/atapiDevice.o $(BUILD_DIR)/ataDevice.o $(BUILD_DIR)/rsdp.o $(BUILD_DIR)/acpi.o
|
||||||
|
|
||||||
SRC_DIR = source
|
SRC_DIR = source
|
||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
@ -133,10 +133,11 @@ $(BUILD_DIR)/KHeap.o:
|
|||||||
$(BUILD_DIR)/prekernel.o:
|
$(BUILD_DIR)/prekernel.o:
|
||||||
$(CPP) -c $(SRC_DIR)/kernel/prekernel/prekernel.cpp -o $(BUILD_DIR)/prekernel.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/prekernel/prekernel.cpp -o $(BUILD_DIR)/prekernel.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
|
|
||||||
$(BUILD_DIR)/processor.o:
|
$(BUILD_DIR)/processor.o:
|
||||||
$(CPP) -c $(SRC_DIR)/kernel/i386/processor.cpp -o $(BUILD_DIR)/processor.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/i386/processor.cpp -o $(BUILD_DIR)/processor.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
|
$(BUILD_DIR)/Path.o:
|
||||||
|
$(CPP) -c $(SRC_DIR)/kernel/vfs/Path.cpp -o $(BUILD_DIR)/Path.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
# Assembly -> Object files
|
# Assembly -> Object files
|
||||||
$(BUILD_DIR)/boot.o:
|
$(BUILD_DIR)/boot.o:
|
||||||
|
@ -48,6 +48,10 @@ extern "C" void kernel ()
|
|||||||
|
|
||||||
FileSystem::initialize();
|
FileSystem::initialize();
|
||||||
|
|
||||||
|
// Testing my path resolution functions
|
||||||
|
Path test = Path("/boot/myos.bin");
|
||||||
|
FileSystem::ResolvePath(test);
|
||||||
|
|
||||||
|
|
||||||
#ifdef USERMODE_RELEASE
|
#ifdef USERMODE_RELEASE
|
||||||
// Lets jump into user mode
|
// Lets jump into user mode
|
||||||
|
83
source/kernel/vfs/Path.cpp
Normal file
83
source/kernel/vfs/Path.cpp
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
//
|
||||||
|
// Created by nigel on 19/02/23.
|
||||||
|
//
|
||||||
|
#include "Path.h"
|
||||||
|
#include "../memory/KernelHeap.h"
|
||||||
|
String::String(char* characters)
|
||||||
|
: chars(characters)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
char* String::str(){
|
||||||
|
return chars;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int String::length ()
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while ( chars[i] != '\0'){
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a null character if size exceeds limits
|
||||||
|
char String::operator[] (size_t idx)
|
||||||
|
{
|
||||||
|
if( idx > this->length())
|
||||||
|
return '\0';
|
||||||
|
|
||||||
|
return chars[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
const char String::operator[](size_t idx) const {
|
||||||
|
return (const char) chars[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
StringView::StringView(String &string, unsigned int start, unsigned int end)
|
||||||
|
: String(string), begin(start), end(end)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
char* StringView::str(){
|
||||||
|
char* str = (char*) malloc((this->length() * sizeof(char))+1);
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
for ( int i = begin; i < end ; i++){
|
||||||
|
str[index] = chars[i];
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
chars[index+1] ='\0';
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Path::Path(char *path)
|
||||||
|
: path(String(path))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Path::Path(String &path)
|
||||||
|
: path(path)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
StringView Path::getbasename()
|
||||||
|
{
|
||||||
|
unsigned int path_length = path.length();
|
||||||
|
int i = path_length;
|
||||||
|
while (path[i] != '/')
|
||||||
|
i--;
|
||||||
|
|
||||||
|
return StringView(path,i +1, path_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
char* Path::str() {
|
||||||
|
return path.str();
|
||||||
|
}
|
46
source/kernel/vfs/Path.h
Normal file
46
source/kernel/vfs/Path.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
//
|
||||||
|
// Created by nigel on 19/02/23.
|
||||||
|
//
|
||||||
|
#pragma once
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
class String {
|
||||||
|
public:
|
||||||
|
String(char* characters);
|
||||||
|
String(String&) = default;
|
||||||
|
unsigned int length();
|
||||||
|
|
||||||
|
char* str ();
|
||||||
|
char operator[](size_t index) ;
|
||||||
|
const char operator[](size_t idx) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
char* chars;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class StringView : String {
|
||||||
|
public:
|
||||||
|
StringView(String& string, unsigned int start, unsigned int end );
|
||||||
|
char* str ();
|
||||||
|
private:
|
||||||
|
unsigned int begin;
|
||||||
|
unsigned int end;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Path{
|
||||||
|
public:
|
||||||
|
Path(String& path);
|
||||||
|
Path(char* path);
|
||||||
|
|
||||||
|
StringView getbasename();
|
||||||
|
|
||||||
|
char* str();
|
||||||
|
|
||||||
|
private:
|
||||||
|
String path;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
#include "../drivers/ata/ataDevice.h"
|
#include "../drivers/ata/ataDevice.h"
|
||||||
#include "../partitiontable/mbr/MasterBootRecord.h"
|
#include "../partitiontable/mbr/MasterBootRecord.h"
|
||||||
#include "../memory/KernelHeap.h"
|
#include "../memory/KernelHeap.h"
|
||||||
#include "../../lib/include/string.h"
|
#include "Path.h"
|
||||||
#include "../filesystem/FAT/DirectoryEntry.h"
|
#include "../filesystem/FAT/DirectoryEntry.h"
|
||||||
|
|
||||||
MOUNT_INFO mountInfo;
|
MOUNT_INFO mountInfo;
|
||||||
@ -361,3 +361,58 @@ void FileSystem::initialize()
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* FindNextEntryName (char* path )
|
||||||
|
{
|
||||||
|
int length = strlen(path);
|
||||||
|
|
||||||
|
char* name = path;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
if( name[0] == '/')
|
||||||
|
i++;
|
||||||
|
|
||||||
|
while ( name[i] != '/' && i <= length)
|
||||||
|
i++;
|
||||||
|
|
||||||
|
char* s = (char*) malloc(i + 1 * sizeof(char));
|
||||||
|
for ( int a = 0; a < i; a++)
|
||||||
|
s[a] = path[a];
|
||||||
|
|
||||||
|
s[i + 1] = '\0';
|
||||||
|
|
||||||
|
return s;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void FileSystem::ResolvePath(Path &path)
|
||||||
|
{
|
||||||
|
char* string_path = path.str();
|
||||||
|
void* cpy = string_path;
|
||||||
|
|
||||||
|
bool isAbsolutePath = string_path[0] == '/';
|
||||||
|
if(isAbsolutePath)
|
||||||
|
{
|
||||||
|
// strip the first slash
|
||||||
|
string_path++;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* entry_name = FindNextEntryName(string_path);
|
||||||
|
printf("Look for entry with name: %s\n", entry_name);
|
||||||
|
int skip = strlen(entry_name);
|
||||||
|
free(entry_name);
|
||||||
|
|
||||||
|
|
||||||
|
entry_name = FindNextEntryName(string_path + skip);
|
||||||
|
printf("Look for entry with name: %s\n", entry_name);
|
||||||
|
skip = strlen(entry_name);
|
||||||
|
free(entry_name);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
free(cpy);
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "Path.h"
|
||||||
|
|
||||||
#define FS_FILE 0
|
#define FS_FILE 0
|
||||||
#define FS_DIRECTORY 1
|
#define FS_DIRECTORY 1
|
||||||
#define FS_INVALID 2
|
#define FS_INVALID 2
|
||||||
@ -73,4 +75,6 @@ extern PFILESYSTEM _filesystems[DEVICE_MAX];
|
|||||||
public:
|
public:
|
||||||
static void initialize();
|
static void initialize();
|
||||||
|
|
||||||
|
static void ResolvePath(Path& path);
|
||||||
|
|
||||||
};
|
};
|
@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
// NOTE: These should not be inline
|
// NOTE: These should not be inline
|
||||||
inline void* memset (void* ptr, int value, size_t num){
|
inline void* memset (void* ptr, int value, size_t num)
|
||||||
|
{
|
||||||
for( int i = 0; i < num; i++ )
|
for( int i = 0; i < num; i++ )
|
||||||
{
|
{
|
||||||
unsigned char* data = (unsigned char*)ptr+ i;
|
unsigned char* data = (unsigned char*)ptr+ i;
|
||||||
|
Loading…
Reference in New Issue
Block a user