diff --git a/src/common/syscalls.h b/src/common/syscalls.h index 970e0c2..7ad7933 100644 --- a/src/common/syscalls.h +++ b/src/common/syscalls.h @@ -24,4 +24,6 @@ syscall_hdlr_0(uint32_t, getRemainingPages, "19"); syscall_hdlr_0(uint32_t, getInitPages, "20"); syscall_hdlr_0(uint32_t, getCurrentTerminalWidth, "21"); -syscall_hdlr_0(uint32_t, getCurrentTerminalHeight, "22"); \ No newline at end of file +syscall_hdlr_0(uint32_t, getCurrentTerminalHeight, "22"); + +syscall_hdlr_1(uint32_t, getProcessState, "23", uint32_t, PID); \ No newline at end of file diff --git a/src/kernel/datatypes/dynarray.h b/src/kernel/datatypes/dynarray.h new file mode 100644 index 0000000..a0cf43b --- /dev/null +++ b/src/kernel/datatypes/dynarray.h @@ -0,0 +1,63 @@ +#ifndef DYNARRAY_H +#define DYNARRAY_H + +#include "../global.h" +#include "maybe.h" +#include "../spinlock.h" + +namespace xnoe { + template + class dynarray { + private: + uint32_t size = 128; + T* buffer; + uint32_t index = 0; + uint32_t start_index = 0; + Spinlock lock; + + public: + dynarray(uint32_t start_index=0) { + this->buffer = new T[size]; + this->index = this->start_index = start_index; + } + + void push(T t) { + if (index == size) { + lock.lock(); + uint32_t old_size = size; + size *= 2; + T* buffer_tmp = new T[size]; + memcpy((uint8_t*)buffer, (uint8_t*)buffer_tmp, sizeof(T)*old_size); + delete buffer; + buffer = buffer_tmp; + lock.unlock(); + } + + buffer[index++] = t; + } + + uint32_t length() { + return index; + } + + xnoe::maybe pop() { + if (index == start_index) + return xnoe::maybe(); + return xnoe::maybe(buffer[--index]); + } + + xnoe::maybe get(uint32_t i) { + if (i>size) + return xnoe::maybe(); + return xnoe::maybe(buffer[i]); + } + + void set(uint32_t i, T t) { + if (i>size) + return; + buffer[i] = t; + } + }; +} + +#endif \ No newline at end of file diff --git a/src/kernel/datatypes/hashtable.h b/src/kernel/datatypes/hashtable.h index c546866..5ab3659 100644 --- a/src/kernel/datatypes/hashtable.h +++ b/src/kernel/datatypes/hashtable.h @@ -39,19 +39,19 @@ namespace xnoe { list->append(xnoe::tuple(k, v)); } - xnoe::Maybe get(key k) { + xnoe::maybe get(key k) { xnoe::linkedlist>* list = &table[xnoe::hash(k) % 4096]; xnoe::linkedlistelem>* current = list->start; if (current) { while (current) { if (xnoe::get<0>(current->elem) == k) - return xnoe::Maybe(xnoe::get<1>(current->elem)); + return xnoe::maybe(xnoe::get<1>(current->elem)); current = current->next; } } - return xnoe::Maybe(); + return xnoe::maybe(); } void remove(key k) { diff --git a/src/kernel/datatypes/linkedlist.h b/src/kernel/datatypes/linkedlist.h index 1f6c7ea..d785f3e 100644 --- a/src/kernel/datatypes/linkedlist.h +++ b/src/kernel/datatypes/linkedlist.h @@ -24,6 +24,7 @@ namespace xnoe { xnoe::linkedlistelem* start=0; xnoe::linkedlistelem* end=0; Spinlock lock = Spinlock(); + uint32_t length = 0; bool has(T t) { xnoe::linkedlistelem* current = this->start; @@ -61,6 +62,7 @@ namespace xnoe { this->start = llelem; this->end = llelem; } + length++; lock.unlock(); } @@ -80,6 +82,7 @@ namespace xnoe { this->start = llelem; this->end = llelem; } + length++; lock.unlock(); } @@ -90,6 +93,7 @@ namespace xnoe { current->next->prev = ll->end; current->next = ll->start; + length += ll.length; lock.unlock(); } @@ -120,6 +124,7 @@ namespace xnoe { if (current = end) end = current->prev; + length--; lock.unlock(); return; } @@ -147,6 +152,7 @@ namespace xnoe { delete current; + length--; lock.unlock(); return; } diff --git a/src/kernel/datatypes/maybe.h b/src/kernel/datatypes/maybe.h index 5ec2a2d..f19334e 100644 --- a/src/kernel/datatypes/maybe.h +++ b/src/kernel/datatypes/maybe.h @@ -3,17 +3,17 @@ namespace xnoe { template - class Maybe { + class maybe { private: T t; bool ok; public: - Maybe() { + maybe() { this->ok = false; } - Maybe(T t) { + maybe(T t) { this->ok = true; this->t = t; } diff --git a/src/kernel/global.cpp b/src/kernel/global.cpp index 032acde..29a4dd5 100644 --- a/src/kernel/global.cpp +++ b/src/kernel/global.cpp @@ -6,7 +6,6 @@ namespace Global { Process* currentProc = 0; tss_struct* tss = 0; bool currentProcValid = false; - xnoe::hashtable* FH; // Map of File Handlers -> Read Writer uint32_t milliseconds_elapsed = 0; uint32_t resp = 0; } diff --git a/src/kernel/global.h b/src/kernel/global.h index 8c30a33..0cf4d83 100644 --- a/src/kernel/global.h +++ b/src/kernel/global.h @@ -8,10 +8,6 @@ class Allocator; class Process; struct tss_struct; class ReadWriter; -namespace xnoe { - template - class hashtable; -} namespace Global { extern Allocator* allocator; @@ -19,7 +15,6 @@ namespace Global { extern Process* currentProc; extern tss_struct* tss; extern bool currentProcValid; - extern xnoe::hashtable* FH; extern uint32_t milliseconds_elapsed; extern uint32_t resp; } diff --git a/src/kernel/idt.cpp b/src/kernel/idt.cpp index 902f94c..33843f7 100644 --- a/src/kernel/idt.cpp +++ b/src/kernel/idt.cpp @@ -98,7 +98,10 @@ void context_switch(frame_struct* frame) { // - Determines if it has 2 or more elements // - If it has two, swap the first and last, update prev and next of each to be null or the other item // - If it has more than two, add the start to the end then set start to the second element + uint32_t count = 0; do { + if (count++ == processes->length) + return; if (Global::currentProc) { if (processes->start->next != 0) { if (processes->end->prev == processes->start) { @@ -215,39 +218,44 @@ void syscall(frame_struct* frame) { Process* currentProc = Global::currentProc; switch (frame->eax) { - case 0: + case 0: // getDentsSize rval = Global::kernel->rootfs->getDentsSize(createPathFromString(frame->ebx)); break; - case 1: + case 1: // getDents Global::kernel->rootfs->getDents(createPathFromString(frame->ebx), frame->ecx); break; - case 2: + case 2: // exists rval = Global::kernel->rootfs->exists(createPathFromString(frame->ebx)); break; - case 3: + case 3: // type rval = Global::kernel->rootfs->type(createPathFromString(frame->ebx)); break; - case 4: + case 4: // malloc rval = currentProc->allocate(frame->ebx); break; - case 5: + case 5: // free currentProc->deallocate(frame->ebx); break; - case 6: + case 6: // getMillisecondsElapsed rval = Global::milliseconds_elapsed; break; - case 7: { + case 7: { // exec asm("cli"); - Process* p = Global::kernel->createProcess(frame->ebx); - rval = p->PID; + xnoe::maybe file = Global::currentProc->getFH(frame->ebx); + if (file.is_ok()) { + Process* p = Global::kernel->createProcess(file.get()); + rval = p->PID; + } else { + rval = 0; + } asm("sti"); break; } - case 8: + case 8: // getPID rval = currentProc->PID; break; - case 9: + case 9: // die Global::kernel->PD->select(); // We can now safely delete the current process @@ -257,47 +265,31 @@ void syscall(frame_struct* frame) { context_switch(frame); break; - case 10: { - if (frame->ecx == 1) { - ReadWriter* stdin = currentProc->stdin; - if (!stdin) - break; - - rval = stdin->read(frame->ebx, frame->edx); - } else { - xnoe::Maybe fh = Global::FH->get(frame->ecx); - if (!fh.is_ok()) { - rval = 0; - break; - } - - ReadWriter* rw = fh.get(); - rval = rw->read(frame->ebx, frame->edx); + case 10: { // read + xnoe::maybe fh = Global::currentProc->getFH(frame->ecx); + if (!fh.is_ok()) { + rval = 0; + break; } + + ReadWriter* rw = fh.get(); + rval = rw->read(frame->ebx, frame->edx); break; } - case 11: { - if (frame->ecx == 0) { - ReadWriter* stdout = currentProc->stdout; - if (!stdout) - break; - - rval = stdout->write(frame->ebx, frame->edx); - } else { - xnoe::Maybe fh = Global::FH->get(frame->ecx); - if (!fh.is_ok()) { - rval = 0; - break; - } - - ReadWriter* rw = fh.get(); - rval = rw->write(frame->ebx, frame->edx); + case 11: { // write + xnoe::maybe fh = Global::currentProc->getFH(frame->ecx); + if (!fh.is_ok()) { + rval = 0; + break; } + + ReadWriter* rw = fh.get(); + rval = rw->write(frame->ebx, frame->edx); break; } - case 12: + case 12: // bindToKeyboard if (currentProc->stdin) break; @@ -305,51 +297,51 @@ void syscall(frame_struct* frame) { Global::kernel->KBListeners.append(currentProc); break; - case 13: { - xnoe::Maybe pm = Global::kernel->pid_map->get(frame->ebx); + case 13: { // bindStdout + xnoe::maybe pm = Global::kernel->pid_map->get(frame->ebx); if (!pm.is_ok()) break; Process* p = pm.get(); if (!p->stdout) { ReadWriter* buffer = new CircularRWBuffer(currentProc->PID, frame->ebx); p->stdout = buffer; - rval = Global::kernel->mapFH(buffer); + rval = Global::currentProc->mapFH(buffer); } break; } - case 14: { - xnoe::Maybe pm = Global::kernel->pid_map->get(frame->ebx); + case 14: { // bindStdin + xnoe::maybe pm = Global::kernel->pid_map->get(frame->ebx); if (!pm.is_ok()) break; Process* p = pm.get(); if (!p->stdin) { ReadWriter* buffer = new CircularRWBuffer(frame->ebx, currentProc->PID); p->stdin = buffer; - rval = Global::kernel->mapFH(buffer); + rval = Global::currentProc->mapFH(buffer); } break; } - case 15: { + case 15: { // fopen ReadWriter* file = Global::kernel->rootfs->open(createPathFromString(frame->ebx)); if (file) - rval = Global::kernel->mapFH(file); + rval = Global::currentProc->mapFH(file); break; } - case 16: { - xnoe::Maybe f = Global::FH->get(frame->ebx); + case 16: { // fclose + xnoe::maybe f = Global::currentProc->getFH(frame->ebx); if (f.is_ok()) { delete f.get(); - Global::kernel->unmapFH(frame->ebx); + Global::currentProc->unmapFH(frame->ebx); } break; } - case 17: { + case 17: { // kill asm("cli"); - xnoe::Maybe p = Global::kernel->pid_map->get(frame->ebx); + xnoe::maybe p = Global::kernel->pid_map->get(frame->ebx); if (p.is_ok()) { Process* proc = p.get(); Global::kernel->destroyProcess(proc); @@ -358,26 +350,35 @@ void syscall(frame_struct* frame) { break; } - case 18: { + case 18: { // sleep Global::currentProc->state = Suspended; - Timer::register_event(frame->ebx, &awaken, (void*)Global::currentProc, true); + Timer::register_event(frame->ebx, &awaken, (void*)Global::currentProc); context_switch(frame); break; } - case 19: + case 19: // getRemainingPages rval = Global::kernel->phys->remainingPages; break; - case 20: + case 20: // getInitPages rval = Global::kernel->phys->initPages; break; - case 21: + case 21: // getTerminalWidth rval = Global::kernel->terminal->width; break; - case 22: + case 22: // getTerminalHeight rval = Global::kernel->terminal->height; break; + + case 23: { // getProcessState + xnoe::maybe p = Global::kernel->pid_map->get(frame->ebx); + if (p.is_ok()) { + Process* proc = p.get(); + rval = proc->state; + } + break; + } default: break; @@ -411,7 +412,7 @@ void v86_monitor(v8086_frame_struct* frame) { *(--sp) = flags; frame->eflags &= ~(0x00040300); *(--sp) = (uint16_t)frame->cs; - *(--sp) = (uint16_t)(frame->eip+2); + *(--sp) = (uint16_t)(frame->eip); uint16_t* vector = (uint16_t*)&vector_data; frame->cs = vector[1]; frame->eip = (uint32_t)vector[0]; diff --git a/src/kernel/kernel.cpp b/src/kernel/kernel.cpp index 55472b9..ff3a788 100644 --- a/src/kernel/kernel.cpp +++ b/src/kernel/kernel.cpp @@ -16,12 +16,12 @@ Kernel::Kernel(PageDirectory* page_directory, PageMap* phys, PageMap* virt, uint void Kernel::init_kernel() { this->pid_map = new xnoe::hashtable(); - Global::FH = new xnoe::hashtable(); this->globalISRStack = (new uint8_t[0x8000]) + 0x8000; } -Process* Kernel::createProcess(uint32_t fh) { - Process* p = new Process(currentPID, this->PD, 0xc0000000, fh); +Process* Kernel::createProcess(ReadWriter* file) { + char* name = "test"; + Process* p = new Process(currentPID, this->PD, 0xc0000000, file, 1, &name); this->pid_map->set(currentPID, p); currentPID++; @@ -30,8 +30,8 @@ Process* Kernel::createProcess(uint32_t fh) { return p; } -Process* Kernel::createProcess(uint32_t fh, ReadWriter* stdout) { - Process* p = this->createProcess(fh); +Process* Kernel::createProcess(ReadWriter* file, ReadWriter* stdout) { + Process* p = this->createProcess(file); p->stdout = stdout; return p; } @@ -44,15 +44,6 @@ void Kernel::destroyProcess(Process* p) { delete p; } -int Kernel::mapFH(ReadWriter* fh) { - Global::FH->set(this->lastFH++, fh); - return this->lastFH - 1; -} - -void Kernel::unmapFH(uint32_t fh) { - Global::FH->remove((void*)fh); -} - void Kernel::v86(uint16_t ax, uint16_t bx, uint16_t cx, uint16_t es, uint16_t di, uint8_t intn) { // Create the payload to perform an interrupt. uint8_t payload[21] = { diff --git a/src/kernel/kernel.h b/src/kernel/kernel.h index 9154254..16f8997 100644 --- a/src/kernel/kernel.h +++ b/src/kernel/kernel.h @@ -28,13 +28,10 @@ public: void init_kernel(); - Process* createProcess(uint32_t fh); - Process* createProcess(uint32_t fh, ReadWriter* stdout); + Process* createProcess(ReadWriter* file); + Process* createProcess(ReadWriter* file, ReadWriter* stdout); void destroyProcess(Process* p); - int mapFH(ReadWriter* fh); - void unmapFH(uint32_t fh); - void v86(uint16_t ax, uint16_t bx, uint16_t cx, uint16_t es, uint16_t di, uint8_t intn); }; diff --git a/src/kernel/kmain.cpp b/src/kernel/kmain.cpp index b4a349a..316550f 100644 --- a/src/kernel/kmain.cpp +++ b/src/kernel/kmain.cpp @@ -56,32 +56,17 @@ int main(KernelInformationStruct kstruct) { ReadWriter* atareadwriter = new ATAReadWriter(0, 0); - uint8_t* buffer = new uint8_t[512]; - for (int i=0;i<512;i++) - buffer[i]=0; - uint32_t size = atareadwriter->size(); - atareadwriter->seek(268*512); - atareadwriter->read(512, buffer); - kernel.rootfs = new RootFSTree(); kernel.rootfs->mount(createPathFromString("/dev"), new DevFS()); kernel.rootfs->mount(createPathFromString("/"), new FAT16FS(kernel.rootfs->open(createPathFromString("/dev/ata")))); ReadWriter* worldbin = kernel.rootfs->open(createPathFromString("/world.bin")); - uint32_t fh = kernel.mapFH(worldbin); - Process* p1 = kernel.createProcess(fh, term); + Process* p1 = kernel.createProcess(worldbin, term); Global::tss->esp0 = (new uint8_t[8192]) + 8192; - //kernel.v86(0x4f00,0,0,0x0,0x8000,0x10); - init_keyboard(); - if (worldbin) { - worldbin->seek(0); - worldbin->read(512, buffer); - worldbin->seek(0); - enable_idt(); - } + enable_idt(); while (1) asm ("hlt"); } \ No newline at end of file diff --git a/src/kernel/process.cpp b/src/kernel/process.cpp index 3dbf086..08eefc0 100644 --- a/src/kernel/process.cpp +++ b/src/kernel/process.cpp @@ -4,16 +4,16 @@ extern void(*catchall_return)(); AllocTracker::AllocTracker(void* base, uint32_t size, uint32_t count) : page_base(base), page_size(size), alloc_count(count) {} -xnoe::Maybe*> Process::get_alloc_tracker(uint32_t address) { +xnoe::maybe*> Process::get_alloc_tracker(uint32_t address) { xnoe::linkedlistelem* current = this->allocations.start; while (current) { if (current->elem.page_base <= address && (current->elem.page_base + 4096 * current->elem.page_size) > address) { - return xnoe::Maybe*>(current); + return xnoe::maybe*>(current); } current = current->next; } - return xnoe::Maybe*>(); + return xnoe::maybe*>(); } Process::Process(uint32_t PID, void* stack, PageDirectory* page_directory, PageMap* phys, PageMap* virt, uint32_t virt_alloc_base) @@ -33,9 +33,10 @@ Process::Process(uint32_t PID) this->stack = this->allocate(0x8000); this->kernelStackPtr = (new uint8_t[0x4000]) + 0x4000; this->state = Running; + this->file_handlers = new xnoe::dynarray(8); } -Process::Process(uint32_t PID, PageDirectory* inherit, uint32_t inheritBase, uint32_t fh) +Process::Process(uint32_t PID, PageDirectory* inherit, uint32_t inheritBase, ReadWriter* filereader, uint32_t argc, char** argv) : Allocator(new PageDirectory, new PageMap, (uint32_t)0, 3) { this->stdout = 0; this->stdin = 0; @@ -47,50 +48,63 @@ Process::Process(uint32_t PID, PageDirectory* inherit, uint32_t inheritBase, uin this->last_page_pointer = 0; this->state = Running; + this->file_handlers = new xnoe::dynarray(8); + for (int index = inheritBase >> 22; index < 1024; index++) this->PD->page_directory[index] = inherit->page_directory[index]; - xnoe::Maybe file = Global::FH->get(fh); - if (file.is_ok()) { - ReadWriter* filereader = file.get(); - uint32_t filesize = filereader->size(); - uint8_t* program_data = this->allocate(filesize + 12) + 12; + uint32_t filesize = filereader->size(); + uint8_t* program_data = this->allocate(filesize + 12) + 12; - this->stack = this->allocate(0x8000); - this->kernelStackPtr = (new uint8_t[0x4000]) + 0x4000; - this->kernelStackPtrDefault = this->kernelStackPtr; + uint8_t* argenvarea = this->allocate(0x2000); - uint32_t pCR3; - asm ("mov %%cr3, %0" : "=a" (pCR3) :); - this->PD->select(); + this->stack = this->allocate(0x8000); + this->kernelStackPtr = (new uint8_t[0x4000]) + 0x4000; + this->kernelStackPtrDefault = this->kernelStackPtr; - // We also need to initialise ESP and the stack - uint32_t* stack32 = ((uint32_t)this->kernelStackPtr); - *(--stack32) = 0x23; // SS - *(--stack32) = ((uint32_t)this->stack + 0x8000); // ESP - *(--stack32) = 0x200; // EFLAGS - *(--stack32) = 27; // CS - *(--stack32) = (uint32_t)program_data; // EIP - *(--stack32) = ((uint32_t)this->stack + 0x8000); // EBP + uint32_t pCR3; + asm ("mov %%cr3, %0" : "=a" (pCR3) :); + this->PD->select(); - uint32_t rEBP = stack32; - - *(--stack32) = 0; // EAX - *(--stack32) = 0; // ECX - *(--stack32) = 0; // EDX - *(--stack32) = 0; // EBX - *(--stack32) = 0; // ESP - *(--stack32) = rEBP; // EBP - *(--stack32) = 0; // ESI - *(--stack32) = 0; // EDI - - this->kernelStackPtr = stack32; - - filereader->seek(0); - filereader->read(filesize, program_data); - - asm ("mov %0, %%cr3" : : "r" (pCR3)); + uint32_t* stack = this->stack + 0x8000; + uint32_t argenv = argenvarea + 0x2000; + for (int i=argc; i>0; i--) { + char* s = argv[i-1]; + uint32_t c = 0; + while (*(c++, s++)); + memcpy((uint8_t*)argv[i-1], (uint8_t*)(argenv -= c), c); + *(--stack) = argenv; } + *(--stack) = ((uint32_t)stack); + + *(--stack) = argc; + + // We also need to initialise ESP and the stack + uint32_t* stack32 = ((uint32_t)this->kernelStackPtr); + *(--stack32) = 0x23; // SS + *(--stack32) = ((uint32_t)stack); // ESP + *(--stack32) = 0x200; // EFLAGS + *(--stack32) = 27; // CS + *(--stack32) = (uint32_t)program_data; // EIP + *(--stack32) = ((uint32_t)stack); // EBP + + uint32_t rEBP = stack32; + + *(--stack32) = 0; // EAX + *(--stack32) = 0; // ECX + *(--stack32) = 0; // EDX + *(--stack32) = 0; // EBX + *(--stack32) = 0; // ESP + *(--stack32) = rEBP; // EBP + *(--stack32) = 0; // ESI + *(--stack32) = 0; // EDI + + this->kernelStackPtr = stack32; + + filereader->seek(0); + filereader->read(filesize, program_data); + + asm ("mov %0, %%cr3" : : "r" (pCR3)); } Process::~Process() { @@ -105,6 +119,14 @@ Process::~Process() { this->deallocate(active->elem.page_base); } asm ("mov %0, %%cr3" : : "r" (pCR3)); + + for (int i=0; ilength();i++) { + xnoe::maybe r; + if ((r=file_handlers->get(i)).is_ok()) + if (r.get()) + delete r.get(); + } + delete kernelStackPtr; } @@ -153,7 +175,7 @@ void* Process::allocate(uint32_t size) { } void Process::deallocate(uint32_t virt_addr) { - xnoe::Maybe*> alloc_tracker = this->get_alloc_tracker(virt_addr); + xnoe::maybe*> alloc_tracker = this->get_alloc_tracker(virt_addr); if (alloc_tracker.is_ok()) { AllocTracker* ac = &alloc_tracker.get()->elem; ac->alloc_count--; @@ -172,10 +194,41 @@ void Process::deallocate(uint32_t virt_addr) { } uint32_t Process::count_allocations(uint32_t address) { - xnoe::Maybe*> alloc_tracker = this->get_alloc_tracker(address); + xnoe::maybe*> alloc_tracker = this->get_alloc_tracker(address); if (alloc_tracker.is_ok()) return alloc_tracker.get()->elem.alloc_count; else return 0; +} + +uint32_t Process::mapFH(ReadWriter* rw) { + file_handlers->push(rw); + return file_handlers->length()-1; +} + +void Process::unmapFH(uint32_t file_handler) { + file_handlers->set(file_handler, 0); +} + +xnoe::maybe Process::getFH(uint32_t file_handler) { + if (file_handler == 1) + if (stdin) + return xnoe::maybe(stdin); + else + return xnoe::maybe(); + if (file_handler == 0) + if (stdout) + return xnoe::maybe(stdout); + else + return xnoe::maybe(); + + xnoe::maybe rw = file_handlers->get(file_handler); + if (!rw.is_ok()) + return rw; + + if (!rw.get()) + return xnoe::maybe(); + + return rw; } \ No newline at end of file diff --git a/src/kernel/process.h b/src/kernel/process.h index 118f153..aaf03b8 100644 --- a/src/kernel/process.h +++ b/src/kernel/process.h @@ -7,9 +7,10 @@ #include "datatypes/hashtable.h" #include "datatypes/maybe.h" #include "global.h" -#include "ata.h" - +#include "processstate.h" #include "stdio/readwriter.h" +#include "datatypes/dynarray.h" +#include "filesystem/fstree.h" struct AllocTracker { void* page_base; @@ -19,11 +20,6 @@ struct AllocTracker { AllocTracker(void* base, uint32_t size, uint32_t count); }; -enum ProcessState { - Running, - Suspended -}; - class Process : public Allocator { private: uint32_t last_page_pointer; @@ -34,7 +30,11 @@ private: // List of pages this process has allocated xnoe::linkedlist allocations; - xnoe::Maybe*> get_alloc_tracker(uint32_t address); + xnoe::maybe*> get_alloc_tracker(uint32_t address); + + xnoe::dynarray* file_handlers; + + Path currentWorkingDirectory; public: uint32_t PID; @@ -52,7 +52,7 @@ public: Process(uint32_t PID, void* stack, PageDirectory* page_directory, PageMap* phys, PageMap* virt, uint32_t virt_alloc_base); Process(uint32_t PID); - Process(uint32_t PID, PageDirectory* inherit, uint32_t inheritBase, uint32_t fh); + Process(uint32_t PID, PageDirectory* inherit, uint32_t inheritBase, ReadWriter* filereader, uint32_t argc=0, char** argv=0); ~Process(); // Iterate through allocations and free those; delete stack @@ -60,6 +60,10 @@ public: void deallocate(uint32_t virt_addr) override; uint32_t count_allocations(uint32_t address); + + uint32_t mapFH(ReadWriter* rw); + void unmapFH(uint32_t file_handler); + xnoe::maybe getFH(uint32_t file_handler); }; #endif \ No newline at end of file diff --git a/src/kernel/processstate.h b/src/kernel/processstate.h new file mode 100644 index 0000000..68f6476 --- /dev/null +++ b/src/kernel/processstate.h @@ -0,0 +1,9 @@ +#ifndef PROCESSSTATE_H +#define PROCESSSTATE_H + +enum ProcessState { + Running=0, + Suspended=1 +}; + +#endif \ No newline at end of file diff --git a/src/programs/hello/hello.c b/src/programs/hello/hello.c index c2db5d2..588d1c9 100644 --- a/src/programs/hello/hello.c +++ b/src/programs/hello/hello.c @@ -25,7 +25,9 @@ void readline(int count, char* buffer) { print("\n"); } -int main() { +int main(int argc, char** argv) { + printf("Hi, I am %s, running with PID %d!\n", argv[0], getPID()); + print("Hello, World!\n"); char buffer[32]; while (1) { diff --git a/src/programs/timer/timer.c b/src/programs/timer/timer.c index 018c045..bb3037f 100644 --- a/src/programs/timer/timer.c +++ b/src/programs/timer/timer.c @@ -5,7 +5,10 @@ int main() { while (1) { printf("Time Elapsed: %dms\n", getMillisecondsElapsed()); printf("Init. Pages: %d\nRemaining Pages: %d\n", getInitPages(), getRemainingPages()); - exec(crashBin); + + printf("PID 2 State: %s\n", (!getProcessState(2))?"Running":"Suspended"); + + //exec(crashBin); sleep(1000); } } \ No newline at end of file