feat(modules): now it loads segments with correct rights, not RWX everywhere

This commit is contained in:
karina
2026-05-03 18:30:49 +04:00
parent bedb03fc37
commit fb55cb1b9a
6 changed files with 97 additions and 55 deletions
+24 -9
View File
@@ -10,7 +10,7 @@
void ModuleLoad(BootModule* module) {
OSProcess* userProc = HeapAllocate(sizeof(OSProcess));
MemorySet(userProc, 0, sizeof(OSProcess));
userProc->id = 1; // TODO: id gen
userProc->id = SchedulerGetNextProcessID();
userProc->state = OSTaskStateRunning;
StringCopy(userProc->name, module->name);
@@ -19,18 +19,33 @@ void ModuleLoad(BootModule* module) {
MemorySet(userL0Virt, 0, kVMPageSize);
userProc->l0Table = userL0Virt;
Address physBase = module->physicalBase;
Address virtBase = module->virtualBase;
Size modSize = module->size;
for (BIUInt32 s = 0; s < module->segmentCount; s++) {
BootModuleSegment* seg = &module->segments[s];
UInt64 codeFlags = kPTENormalMem | kPTEUser | kPTEAccessRW | kPTEPrivNX; // TODO: kill RWX
UInt64 segFlags = kPTENormalMem | kPTEUser;
for (Size i = 0; i < modSize; i += kVMPageSize) {
VMMMapPage((Address*)userL0Phys, physBase + i, virtBase + i, codeFlags);
if (seg->flags & PF_W) {
// writable: AP[2]=0 (RW), which is the default
} else {
segFlags |= kPTEAccessRO;
}
if (seg->flags & PF_X) {
// executable: default is already executable
} else {
segFlags |= kPTEPrivNX | kPTEUserNX;
}
for (Size i = 0; i < seg->size; i += kVMPageSize) {
VMMMapPage((Address*)userL0Phys,
seg->physicalBase + i,
seg->virtualBase + i,
segFlags);
}
CPUCleanAndInvalidateCode((void*)VMPhysToHHDM(seg->physicalBase), seg->size);
}
CPUCleanAndInvalidateCode((void*)VMPhysToHHDM(physBase), modSize);
Address stackPhys = (Address)PMMAllocatePage();
Address userStackVirt = 0x80000000;
UInt64 stackFlags = kPTENormalMem | kPTEUser | kPTEAccessRW | kPTEPrivNX | kPTEUserNX;
+4
View File
@@ -122,3 +122,7 @@ void SchedulerYield(UInt64 ticks) {
gOSSchedulerCurrentTask->state = OSTaskStateSleeping;
CPUException(kOSSchedulerExceptionNumber);
}
UInt64 SchedulerGetNextProcessID() {
return gOSSchedulerNextProcessID++;
}