Moved more code to kernel
This commit is contained in:
parent
21719edafc
commit
f8c9766476
12 changed files with 162 additions and 124 deletions
|
@ -12,12 +12,16 @@ struct malloc_t {
|
||||||
class PMM {
|
class PMM {
|
||||||
private:
|
private:
|
||||||
malloc_t *head;
|
malloc_t *head;
|
||||||
public:
|
|
||||||
PMM2 pmm2;
|
PMM2 pmm2;
|
||||||
|
public:
|
||||||
PMM();
|
PMM();
|
||||||
auto init(struct multiboot_info*) -> void;
|
auto init(struct multiboot_info*) -> void;
|
||||||
auto alloc(uint32_t length) -> void *;
|
auto alloc(uint32_t length) -> void *;
|
||||||
auto free(void* ptr) -> bool;
|
auto free(void* ptr) -> bool;
|
||||||
|
auto markUsed(const void * addr, uint32_t length) -> bool;
|
||||||
|
auto operator >> (void * &addr) -> PMM &; //alloc
|
||||||
|
auto operator << (const void * addr) -> PMM &; //free
|
||||||
|
auto operator()(int pages) -> void*; //alloc_multipage
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -28,7 +28,7 @@ Multitasking::Multitasking(): curr_task(nullptr), first_task(nullptr)
|
||||||
auto Multitasking::initTask(void(* entry)()) -> struct cpu_state*
|
auto Multitasking::initTask(void(* entry)()) -> struct cpu_state*
|
||||||
{
|
{
|
||||||
void* tmp1, *tmp2;
|
void* tmp1, *tmp2;
|
||||||
mm.pmm.pmm2 >> tmp1 >> tmp2;
|
mm >> tmp1 >> tmp2;
|
||||||
uint8_t *stack=(uint8_t*)tmp1, *user_stack=(uint8_t*)tmp2;
|
uint8_t *stack=(uint8_t*)tmp1, *user_stack=(uint8_t*)tmp2;
|
||||||
struct cpu_state new_state = {
|
struct cpu_state new_state = {
|
||||||
0, //EAX
|
0, //EAX
|
||||||
|
@ -67,25 +67,8 @@ auto Multitasking::schedule(struct cpu_state* cpu) -> struct cpu_state*
|
||||||
next=first_task;
|
next=first_task;
|
||||||
}
|
}
|
||||||
curr_task=next;
|
curr_task=next;
|
||||||
return next->unpause();
|
struct cpu_state* cpu_state=next->unpause();
|
||||||
}
|
|
||||||
Task::Task(struct cpu_state* cpu): cpu_state(cpu), next(nullptr) {};
|
|
||||||
//This is run every time this task is chosen by the scheduler
|
|
||||||
auto Task::unpause() -> struct cpu_state* {
|
|
||||||
MTGosHAL::tasks.tss[1] = (uint32_t) (cpu_state + 1);
|
MTGosHAL::tasks.tss[1] = (uint32_t) (cpu_state + 1);
|
||||||
return cpu_state;
|
return cpu_state;
|
||||||
}
|
}
|
||||||
//This is run every time the timer ticks and a task is running
|
|
||||||
auto Task::pause(struct cpu_state* cpu) -> Task * {
|
|
||||||
cpu_state=cpu;
|
|
||||||
return next;
|
|
||||||
}
|
|
||||||
auto Task::addTask(Task* task) -> void {
|
|
||||||
if(next)
|
|
||||||
return next->addTask(task);
|
|
||||||
next=task;
|
|
||||||
}
|
|
||||||
auto Task::hasNext() -> bool {
|
|
||||||
return next!=nullptr;
|
|
||||||
}
|
|
||||||
} // namespace MTGosHAL
|
} // namespace MTGosHAL
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace MTGosHAL {
|
||||||
GDT gdt;
|
GDT gdt;
|
||||||
Multitasking tasks;
|
Multitasking tasks;
|
||||||
BlockDevice disk;
|
BlockDevice disk;
|
||||||
VMM3 mm;
|
PMM mm;
|
||||||
void main(int eax, struct multiboot_info* ebx) {
|
void main(int eax, struct multiboot_info* ebx) {
|
||||||
out.init(ebx);
|
out.init(ebx);
|
||||||
err.init(ebx);
|
err.init(ebx);
|
||||||
|
|
|
@ -3,107 +3,23 @@
|
||||||
#include <vmm3.hpp>
|
#include <vmm3.hpp>
|
||||||
extern "C" const int kernel_start;
|
extern "C" const int kernel_start;
|
||||||
extern "C" const int kernel_end; //those are voids actually
|
extern "C" const int kernel_end; //those are voids actually
|
||||||
void *operator new(size_t size) {
|
|
||||||
return MTGosHAL::mm.alloc(size);
|
|
||||||
}
|
|
||||||
void *operator new[](size_t size) {
|
|
||||||
return MTGosHAL::mm.alloc(size);
|
|
||||||
}
|
|
||||||
void operator delete(void* p) {
|
|
||||||
MTGosHAL::mm.free(p);
|
|
||||||
}
|
|
||||||
void operator delete[](void* p) {
|
|
||||||
MTGosHAL::mm.free(p);
|
|
||||||
}
|
|
||||||
void operator delete(void* p, size_t size) {
|
|
||||||
MTGosHAL::mm.free(p);
|
|
||||||
}
|
|
||||||
void operator delete[](void* p, size_t size) {
|
|
||||||
MTGosHAL::mm.free(p);
|
|
||||||
}
|
|
||||||
namespace MTGosHAL {
|
namespace MTGosHAL {
|
||||||
PMM::PMM(): head(nullptr), pmm2() {}
|
PMM::PMM(): head(nullptr), pmm2() {}
|
||||||
auto PMM::init(struct multiboot_info* mb_info) -> void {
|
auto PMM::init(struct multiboot_info* mb_info) -> void {
|
||||||
pmm2.init(mb_info);
|
pmm2.init(mb_info);
|
||||||
}
|
}
|
||||||
auto PMM::alloc(uint32_t length) -> void * {
|
auto PMM::markUsed(const void * addr, uint32_t length) -> bool {
|
||||||
if(!head) {
|
return pmm2.markUsed(addr, length);
|
||||||
//Alloc space for head
|
|
||||||
if(length+sizeof(malloc_t)<=4096) { //Small optimization. The routine for allocating more than one continuous page is terribly slow.
|
|
||||||
void *tmp;
|
|
||||||
pmm2 >> tmp;
|
|
||||||
head=(malloc_t*)tmp;
|
|
||||||
} else
|
|
||||||
head=(malloc_t*)pmm2(((length+sizeof(malloc_t))>>12)+1);
|
|
||||||
if(!head) //The alloc() didn't work! We're out of RAM!
|
|
||||||
return nullptr;
|
|
||||||
head->len=length;
|
|
||||||
head->next=head->last=nullptr;
|
|
||||||
malloc_t* tmp=head;
|
|
||||||
tmp++;
|
|
||||||
return (void*)tmp;
|
|
||||||
}
|
|
||||||
malloc_t* curr=head;
|
|
||||||
malloc_t* last=nullptr;
|
|
||||||
do {
|
|
||||||
uint32_t loc=(uint32_t)curr+sizeof(malloc_t)+curr->len;
|
|
||||||
if((loc+length+sizeof(malloc_t))<((loc&(~0xFFF))+4096) &&
|
|
||||||
((!curr->next) || (loc+length+sizeof(malloc_t))<((uint32_t)(curr->next)))) {
|
|
||||||
malloc_t *allocd=(malloc_t *)loc;
|
|
||||||
allocd->len=length;
|
|
||||||
allocd->last=curr;
|
|
||||||
allocd->next=curr->next; //Set double linked list
|
|
||||||
curr->next=allocd;
|
|
||||||
if(allocd->next)
|
|
||||||
allocd->next->last=allocd;
|
|
||||||
malloc_t *tmp=allocd;
|
|
||||||
tmp++;
|
|
||||||
return (void*)tmp;
|
|
||||||
}
|
|
||||||
last=curr;
|
|
||||||
curr=curr->next;
|
|
||||||
} while(curr);
|
|
||||||
malloc_t *allocd=nullptr;
|
|
||||||
if(length+sizeof(malloc_t)<=4096) { //Small optimization. The routine for allocating more than one continuous page is terribly slow.
|
|
||||||
void *tmp;
|
|
||||||
pmm2 >> tmp;
|
|
||||||
allocd=(malloc_t*)tmp;
|
|
||||||
} else
|
|
||||||
allocd=(malloc_t*)pmm2(((length+sizeof(malloc_t))>>12)+1);
|
|
||||||
if(!allocd) //The alloc() didn't work! We're out of RAM!
|
|
||||||
return nullptr;
|
|
||||||
last->next=allocd;
|
|
||||||
allocd->len=length;
|
|
||||||
allocd->last=last;
|
|
||||||
allocd->next=nullptr;
|
|
||||||
malloc_t *tmp=allocd;
|
|
||||||
tmp++;
|
|
||||||
return (void*)tmp;
|
|
||||||
}
|
|
||||||
auto PMM::free(void* ptr) -> bool {
|
|
||||||
if(!ptr)
|
|
||||||
return false;
|
|
||||||
malloc_t* curr=head;
|
|
||||||
malloc_t* chk=(malloc_t*)ptr;
|
|
||||||
chk--;
|
|
||||||
do {
|
|
||||||
if(curr==chk) {
|
|
||||||
uint32_t start=((uint32_t)chk)&(~0xFFF);
|
|
||||||
uint32_t end=start+0x1000;
|
|
||||||
if((((uint32_t)(curr->last)<start)||((uint32_t)(curr->last)>=end))&&(((uint32_t)(curr->next)>=end)||((uint32_t)(curr->next)<start))) {
|
|
||||||
pmm2 << (void*)start;
|
|
||||||
}
|
|
||||||
if(curr->last)
|
|
||||||
curr->last->next=curr->next;
|
|
||||||
else {
|
|
||||||
head=curr->next;
|
|
||||||
}
|
|
||||||
if(curr->next)
|
|
||||||
curr->next->last=curr->last;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
curr=curr->next;
|
|
||||||
} while(curr);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
auto PMM::operator >> (void * &addr) -> PMM & {
|
||||||
|
pmm2>>addr;
|
||||||
|
return *this;
|
||||||
|
} //alloc
|
||||||
|
auto PMM::operator << (const void * addr) -> PMM & {
|
||||||
|
pmm2<<addr;
|
||||||
|
return *this;
|
||||||
|
} //free
|
||||||
|
auto PMM::operator()(int pages) -> void*{
|
||||||
|
return pmm2(pages);
|
||||||
|
} //alloc_multipage
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ VMM3::VMM3(): pmm() {
|
||||||
auto VMM3::init(struct multiboot_info* mb_info) -> void {
|
auto VMM3::init(struct multiboot_info* mb_info) -> void {
|
||||||
pmm.init(mb_info);
|
pmm.init(mb_info);
|
||||||
void* tmp;
|
void* tmp;
|
||||||
pmm.pmm2 >> tmp;
|
pmm >> tmp;
|
||||||
pd=(uint32_t**)tmp;
|
pd=(uint32_t**)tmp;
|
||||||
uint32_t ent=0x87;
|
uint32_t ent=0x87;
|
||||||
for(int i=0;i<1024;i++) {
|
for(int i=0;i<1024;i++) {
|
||||||
|
|
24
kernel/kernel/Multitasking.cpp
Normal file
24
kernel/kernel/Multitasking.cpp
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#include <base.hpp>
|
||||||
|
#include <textDISP.hpp>
|
||||||
|
#include <Multitasking.hpp>
|
||||||
|
namespace MTGosHAL {
|
||||||
|
Task::Task(struct cpu_state* cpu): cpu_state(cpu), next(nullptr) {};
|
||||||
|
//This is run every time this task is chosen by the scheduler
|
||||||
|
auto Task::unpause() -> struct cpu_state* {
|
||||||
|
|
||||||
|
return cpu_state;
|
||||||
|
}
|
||||||
|
//This is run every time the timer ticks and a task is running
|
||||||
|
auto Task::pause(struct cpu_state* cpu) -> Task * {
|
||||||
|
cpu_state=cpu;
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
auto Task::addTask(Task* task) -> void {
|
||||||
|
if(next)
|
||||||
|
return next->addTask(task);
|
||||||
|
next=task;
|
||||||
|
}
|
||||||
|
auto Task::hasNext() -> bool {
|
||||||
|
return next!=nullptr;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,2 +0,0 @@
|
||||||
struct cpu_state {
|
|
||||||
}; //Empty struct
|
|
|
@ -8,6 +8,7 @@ typedef unsigned short uint16_t;
|
||||||
typedef unsigned int uint32_t;
|
typedef unsigned int uint32_t;
|
||||||
typedef unsigned long long int uint64_t;
|
typedef unsigned long long int uint64_t;
|
||||||
typedef unsigned int uintptr_t;
|
typedef unsigned int uintptr_t;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
typedef signed char int8_t;
|
typedef signed char int8_t;
|
||||||
typedef signed short int16_t;
|
typedef signed short int16_t;
|
||||||
|
@ -19,3 +20,4 @@ typedef unsigned int uint32_t;
|
||||||
typedef unsigned long int uint64_t;
|
typedef unsigned long int uint64_t;
|
||||||
typedef unsigned long int uintptr_t;
|
typedef unsigned long int uintptr_t;
|
||||||
#endif
|
#endif
|
||||||
|
typedef unsigned long int size_t;
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace MTGosHAL {
|
||||||
class Multitasking;
|
class Multitasking;
|
||||||
class BlockDevice;
|
class BlockDevice;
|
||||||
class Task;
|
class Task;
|
||||||
class VMM3;
|
class PMM;
|
||||||
enum class BG_color: uint32_t;
|
enum class BG_color: uint32_t;
|
||||||
enum class FG_color: uint32_t;
|
enum class FG_color: uint32_t;
|
||||||
extern Serial debug;
|
extern Serial debug;
|
||||||
|
@ -23,6 +23,6 @@ namespace MTGosHAL {
|
||||||
extern IDT idt;
|
extern IDT idt;
|
||||||
extern Multitasking tasks;
|
extern Multitasking tasks;
|
||||||
extern BlockDevice disk;
|
extern BlockDevice disk;
|
||||||
extern VMM3 mm;
|
extern PMM mm;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
4
kernel/kernel/include/cpu_state.h
Normal file
4
kernel/kernel/include/cpu_state.h
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
namespace MTGosHAL {
|
||||||
|
struct cpu_state {
|
||||||
|
}; //Empty struct
|
||||||
|
}
|
|
@ -12,9 +12,12 @@ private:
|
||||||
malloc_t *head;
|
malloc_t *head;
|
||||||
public:
|
public:
|
||||||
PMM();
|
PMM();
|
||||||
auto init(void *) -> void;
|
|
||||||
auto alloc(uint32_t length) -> void *;
|
auto alloc(uint32_t length) -> void *;
|
||||||
auto free(void* ptr) -> bool;
|
auto free(void* ptr) -> bool;
|
||||||
|
auto markUsed(const void * addr, uint32_t length) -> bool;
|
||||||
|
auto operator >> (void * &addr) -> PMM &; //alloc
|
||||||
|
auto operator << (const void * addr) -> PMM &; //free
|
||||||
|
auto operator()(int pages) -> void*; //alloc_multipage
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
104
kernel/kernel/mm/pmm.cpp
Normal file
104
kernel/kernel/mm/pmm.cpp
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
#include <base.hpp>
|
||||||
|
#include <pmm.hpp>
|
||||||
|
#include <stdint.h>
|
||||||
|
void *operator new(size_t size) {
|
||||||
|
return MTGosHAL::mm.alloc(size);
|
||||||
|
}
|
||||||
|
void *operator new[](size_t size) {
|
||||||
|
return MTGosHAL::mm.alloc(size);
|
||||||
|
}
|
||||||
|
void operator delete(void* p) {
|
||||||
|
MTGosHAL::mm.free(p);
|
||||||
|
}
|
||||||
|
void operator delete[](void* p) {
|
||||||
|
MTGosHAL::mm.free(p);
|
||||||
|
}
|
||||||
|
void operator delete(void* p, size_t size) {
|
||||||
|
MTGosHAL::mm.free(p);
|
||||||
|
}
|
||||||
|
void operator delete[](void* p, size_t size) {
|
||||||
|
MTGosHAL::mm.free(p);
|
||||||
|
}
|
||||||
|
namespace MTGosHAL {
|
||||||
|
|
||||||
|
auto PMM::alloc(uint32_t length) -> void * {
|
||||||
|
if(!head) {
|
||||||
|
//Alloc space for head
|
||||||
|
if(length+sizeof(malloc_t)<=4096) { //Small optimization. The routine for allocating more than one continuous page is terribly slow.
|
||||||
|
void *tmp;
|
||||||
|
*this >> tmp;
|
||||||
|
head=(malloc_t*)tmp;
|
||||||
|
} else
|
||||||
|
head=(malloc_t*)(*this)(((length+sizeof(malloc_t))>>12)+1);
|
||||||
|
if(!head) //The alloc() didn't work! We're out of RAM!
|
||||||
|
return nullptr;
|
||||||
|
head->len=length;
|
||||||
|
head->next=head->last=nullptr;
|
||||||
|
malloc_t* tmp=head;
|
||||||
|
tmp++;
|
||||||
|
return (void*)tmp;
|
||||||
|
}
|
||||||
|
malloc_t* curr=head;
|
||||||
|
malloc_t* last=nullptr;
|
||||||
|
do {
|
||||||
|
uint32_t loc=(uint32_t)curr+sizeof(malloc_t)+curr->len;
|
||||||
|
if((loc+length+sizeof(malloc_t))<((loc&(~0xFFF))+4096) &&
|
||||||
|
((!curr->next) || (loc+length+sizeof(malloc_t))<((uint32_t)(curr->next)))) {
|
||||||
|
malloc_t *allocd=(malloc_t *)loc;
|
||||||
|
allocd->len=length;
|
||||||
|
allocd->last=curr;
|
||||||
|
allocd->next=curr->next; //Set double linked list
|
||||||
|
curr->next=allocd;
|
||||||
|
if(allocd->next)
|
||||||
|
allocd->next->last=allocd;
|
||||||
|
malloc_t *tmp=allocd;
|
||||||
|
tmp++;
|
||||||
|
return (void*)tmp;
|
||||||
|
}
|
||||||
|
last=curr;
|
||||||
|
curr=curr->next;
|
||||||
|
} while(curr);
|
||||||
|
malloc_t *allocd=nullptr;
|
||||||
|
if(length+sizeof(malloc_t)<=4096) { //Small optimization. The routine for allocating more than one continuous page is terribly slow.
|
||||||
|
void *tmp;
|
||||||
|
*this >> tmp;
|
||||||
|
allocd=(malloc_t*)tmp;
|
||||||
|
} else
|
||||||
|
allocd=(malloc_t*)(*this)(((length+sizeof(malloc_t))>>12)+1);
|
||||||
|
if(!allocd) //The alloc() didn't work! We're out of RAM!
|
||||||
|
return nullptr;
|
||||||
|
last->next=allocd;
|
||||||
|
allocd->len=length;
|
||||||
|
allocd->last=last;
|
||||||
|
allocd->next=nullptr;
|
||||||
|
malloc_t *tmp=allocd;
|
||||||
|
tmp++;
|
||||||
|
return (void*)tmp;
|
||||||
|
}
|
||||||
|
auto PMM::free(void* ptr) -> bool {
|
||||||
|
if(!ptr)
|
||||||
|
return false;
|
||||||
|
malloc_t* curr=head;
|
||||||
|
malloc_t* chk=(malloc_t*)ptr;
|
||||||
|
chk--;
|
||||||
|
do {
|
||||||
|
if(curr==chk) {
|
||||||
|
uint32_t start=((uint32_t)chk)&(~0xFFF);
|
||||||
|
uint32_t end=start+0x1000;
|
||||||
|
if((((uint32_t)(curr->last)<start)||((uint32_t)(curr->last)>=end))&&(((uint32_t)(curr->next)>=end)||((uint32_t)(curr->next)<start))) {
|
||||||
|
*this << (void*)start;
|
||||||
|
}
|
||||||
|
if(curr->last)
|
||||||
|
curr->last->next=curr->next;
|
||||||
|
else {
|
||||||
|
head=curr->next;
|
||||||
|
}
|
||||||
|
if(curr->next)
|
||||||
|
curr->next->last=curr->last;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
curr=curr->next;
|
||||||
|
} while(curr);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue