fork() stub and QoL improvements

This commit is contained in:
Alex
2023-05-03 06:37:39 +03:00
parent 6e6d22403c
commit 61aea6aa8d
25 changed files with 426 additions and 185 deletions

View File

@ -91,7 +91,7 @@ namespace Execute
struct MmImage
{
void *Phyiscal;
void *Physical;
void *Virtual;
};

View File

@ -73,6 +73,8 @@ namespace InterProcessCommunication
void *Process;
public:
std::vector<IPCHandle *> GetHandles() { return Handles; }
void Fork(IPC *Parent);
IPCHandle *Create(IPCType Type, char UniqueToken[16]);
IPCErrorCode Destroy(IPCID ID);
IPCErrorCode Allocate(IPCID ID, long Size);

View File

@ -56,6 +56,7 @@ extern uintptr_t _kernel_text_end, _kernel_data_end, _kernel_rodata_end;
#define PAGE_SIZE 0x1000 // 4KB
#define PAGE_SIZE_4K PAGE_SIZE // 4KB
#define PAGE_SIZE_2M 0x200000 // 2MB
#define PAGE_SIZE_4M 0x400000 // 4MB
#define PAGE_SIZE_1G 0x40000000 // 1GB
#define STACK_SIZE 0x4000 // 16kb
@ -228,7 +229,7 @@ namespace Memory
struct __packed PageTableEntryPtr
{
PageTableEntry Entries[511];
PageTableEntry Entries[512];
};
union __packed PageDirectoryEntry
@ -304,7 +305,7 @@ namespace Memory
struct __packed PageDirectoryEntryPtr
{
PageDirectoryEntry Entries[511];
PageDirectoryEntry Entries[512];
};
union __packed PageDirectoryPointerTableEntry
@ -380,7 +381,7 @@ namespace Memory
struct __packed PageDirectoryPointerTableEntryPtr
{
PageDirectoryPointerTableEntry Entries[511];
PageDirectoryPointerTableEntry Entries[512];
};
union __packed PageMapLevel4
@ -433,31 +434,22 @@ namespace Memory
}
};
struct PageTable4
class PageTable
{
PageMapLevel4 Entries[511];
public:
PageMapLevel4 Entries[512];
/**
* @brief Update CR3 with this PageTable4
* @brief Update CR3 with this PageTable
*/
void Update()
{
#if defined(a86)
asmv("mov %0, %%cr3" ::"r"(this));
#elif defined(aa64)
asmv("msr ttbr0_el1, %0" ::"r"(this));
#endif
}
} __aligned(0x1000);
void Update();
struct __packed PageMapLevel5
{
/* FIXME: NOT IMPLEMENTED! */
};
struct PageTable5
{
PageMapLevel5 Entries[511];
/**
* @brief Fork this PageTable
*
* @return A new PageTable with the same content
*/
PageTable Fork();
} __aligned(0x1000);
class Physical
@ -605,7 +597,7 @@ namespace Memory
{
private:
NewLock(MemoryLock);
PageTable4 *Table = nullptr;
PageTable *Table = nullptr;
public:
enum MapType
@ -796,7 +788,7 @@ namespace Memory
*
* @param Table Page table. If null, it will use the current page table.
*/
Virtual(PageTable4 *Table = nullptr);
Virtual(PageTable *Table = nullptr);
/**
* @brief Destroy the Virtual object
@ -808,30 +800,70 @@ namespace Memory
class StackGuard
{
private:
struct AllocatedPages
{
void *PhysicalAddress;
void *VirtualAddress;
};
void *StackBottom = nullptr;
void *StackTop = nullptr;
void *StackPhyiscalBottom = nullptr;
void *StackPhyiscalTop = nullptr;
void *StackPhysicalBottom = nullptr;
void *StackPhysicalTop = nullptr;
uint64_t Size = 0;
bool UserMode = false;
PageTable4 *Table = nullptr;
bool Expanded = false;
PageTable *Table = nullptr;
std::vector<AllocatedPages> AllocatedPagesList;
public:
std::vector<AllocatedPages> GetAllocatedPages() { return AllocatedPagesList; }
/** @brief Fork stack guard */
void Fork(StackGuard *Parent);
/** @brief For general info */
uint64_t GetSize() { return Size; }
/** @brief For general info */
bool GetUserMode() { return UserMode; }
/** @brief For general info */
bool IsExpanded() { return Expanded; }
/** @brief For general info */
void *GetStackBottom() { return StackBottom; }
/** @brief For RSP */
void *GetStackTop() { return StackTop; }
/** @brief For general info */
void *GetStackPhysicalBottom() { return StackPhyiscalBottom; }
/** @brief For general info */
void *GetStackPhysicalTop() { return StackPhyiscalTop; }
/** @brief For general info (avoid if possible)
* @note This can be used only if the stack was NOT expanded.
*/
void *GetStackPhysicalBottom()
{
if (Expanded)
return nullptr;
return StackPhysicalBottom;
}
/** @brief For general info (avoid if possible)
* @note This can be used only if the stack was NOT expanded.
*/
void *GetStackPhysicalTop()
{
if (Expanded)
return nullptr;
return StackPhysicalTop;
}
/** @brief Called by exception handler */
bool Expand(uintptr_t FaultAddress);
/**
* @brief Construct a new Stack Guard object
* @param User Stack for user mode?
*/
StackGuard(bool User, PageTable4 *Table);
StackGuard(bool User, PageTable *Table);
/**
* @brief Destroy the Stack Guard object
*/
@ -857,12 +889,12 @@ namespace Memory
void DetachAddress(void *Address);
MemMgr(PageTable4 *PageTable = nullptr, VirtualFileSystem::Node *Directory = nullptr);
MemMgr(PageTable *Table = nullptr, VirtualFileSystem::Node *Directory = nullptr);
~MemMgr();
private:
Bitmap PageBitmap;
PageTable4 *PageTable;
PageTable *Table;
VirtualFileSystem::Node *Directory;
std::vector<AllocatedPages> AllocatedPagesList;
@ -880,7 +912,7 @@ void operator delete(void *Pointer, long unsigned int Size);
void operator delete[](void *Pointer, long unsigned int Size);
extern Memory::Physical KernelAllocator;
extern Memory::PageTable4 *KernelPageTable;
extern Memory::PageTable *KernelPageTable;
#endif // __cplusplus

View File

@ -31,13 +31,13 @@ namespace SymbolResolver
SymbolTable SymTable[0x10000];
uintptr_t TotalEntries = 0;
void *Image;
public:
void *GetImage() { return this->Image; }
Symbols(uintptr_t ImageAddress);
~Symbols();
const char *GetSymbolFromAddress(uintptr_t Address);
void AddSymbol(uintptr_t Address, const char *Name);
};
}
extern SymbolResolver::Symbols *SymTbl;

View File

@ -101,7 +101,7 @@ namespace Tasking
uint64_t SleepUntil = 0;
uint64_t KernelTime = 0, UserTime = 0, SpawnTime = 0, LastUpdateTime = 0;
uint64_t Year, Month, Day, Hour, Minute, Second;
bool Affinity[256]; // MAX_CPU
bool Affinity[256]; // MAX_CPU
TaskPriority Priority;
TaskArchitecture Architecture;
TaskCompatibility Compatibility;
@ -188,7 +188,7 @@ namespace Tasking
std::vector<TCB *> Threads;
std::vector<PCB *> Children;
InterProcessCommunication::IPC *IPC;
Memory::PageTable4 *PageTable;
Memory::PageTable *PageTable;
SymbolResolver::Symbols *ELFSymbolTable;
VirtualFileSystem::Node *ProcessDirectory;
VirtualFileSystem::Node *memDirectory;
@ -341,7 +341,8 @@ namespace Tasking
const std::vector<AuxiliaryVector> &auxv = std::vector<AuxiliaryVector>(),
IPOffset Offset = 0,
TaskArchitecture Architecture = TaskArchitecture::x64,
TaskCompatibility Compatibility = TaskCompatibility::Native);
TaskCompatibility Compatibility = TaskCompatibility::Native,
bool ThreadNotReady = false);
Task(const IP EntryPoint);
~Task();