1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 07:38:10 +00:00

Launching an arbitrary ELF executable from disk works! :^)

This is so cool! It's a bit messy now with two Task constructors,
but eventually they should fold into a single constructor somehow.
This commit is contained in:
Andreas Kling 2018-10-22 15:42:39 +02:00
parent befeabd8fe
commit b824f15619
10 changed files with 141 additions and 16 deletions

View file

@ -161,20 +161,27 @@ bool MemoryManager::unmapRegionsForTask(Task& task)
return true;
}
bool MemoryManager::mapRegion(Task& task, Task::Region& region)
{
auto& zone = *region.zone;
for (size_t i = 0; i < zone.m_pages.size(); ++i) {
auto laddr = region.linearAddress.offset(i * PAGE_SIZE);
auto pte = ensurePTE(laddr);
pte.setPhysicalPageBase(zone.m_pages[i].get());
pte.setPresent(true);
pte.setWritable(true);
pte.setUserAllowed(!task.isRing0());
//kprintf("MM: >> Mapped L%x => P%x <<\n", laddr, zone.m_pages[i].get());
}
return true;
}
bool MemoryManager::mapRegionsForTask(Task& task)
{
for (auto& region : task.m_regions) {
auto& zone = *region->zone;
for (size_t i = 0; i < zone.m_pages.size(); ++i) {
auto laddr = region->linearAddress.offset(i * PAGE_SIZE);
auto pte = ensurePTE(laddr);
pte.setPhysicalPageBase(zone.m_pages[i].get());
pte.setPresent(true);
pte.setWritable(true);
pte.setUserAllowed(!task.isRing0());
//kprintf("MM: >> Mapped L%x => P%x <<\n", laddr, zone.m_pages[i].get());
}
if (!mapRegion(task, *region))
return false;
}
return true;
}