mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 17:47:36 +00:00
Add a VMO pointer to VNode.
This way, if anyone tries to map an already mapped file, we share the VMO.
This commit is contained in:
parent
862f108cb5
commit
3b2dcd5929
8 changed files with 59 additions and 10 deletions
|
@ -220,8 +220,7 @@ Region* MemoryManager::region_from_laddr(Process& process, LinearAddress laddr)
|
|||
return region.ptr();
|
||||
}
|
||||
kprintf("%s(%u) Couldn't find region for L%x\n", process.name().characters(), process.pid(), laddr.get());
|
||||
process.dumpRegions();
|
||||
ASSERT_NOT_REACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool MemoryManager::copy_on_write(Process& process, Region& region, unsigned page_index_in_region)
|
||||
|
@ -292,7 +291,10 @@ PageFaultResponse MemoryManager::handle_page_fault(const PageFault& fault)
|
|||
dbgprintf("MM: handle_page_fault(%w) at L%x\n", fault.code(), fault.laddr().get());
|
||||
#endif
|
||||
auto* region = region_from_laddr(*current, fault.laddr());
|
||||
ASSERT(region);
|
||||
if (!region) {
|
||||
kprintf("NP(error) fault at invalid address L%x\n", fault.laddr().get());
|
||||
return PageFaultResponse::ShouldCrash;
|
||||
}
|
||||
auto page_index_in_region = region->page_index_from_address(fault.laddr());
|
||||
if (fault.is_not_present()) {
|
||||
if (region->vmo().vnode()) {
|
||||
|
@ -640,7 +642,12 @@ void PhysicalPage::return_to_freelist()
|
|||
|
||||
RetainPtr<VMObject> VMObject::create_file_backed(RetainPtr<VirtualFileSystem::Node>&& vnode, size_t size)
|
||||
{
|
||||
return adopt(*new VMObject(move(vnode), size));
|
||||
InterruptDisabler disabler;
|
||||
if (vnode->vmo())
|
||||
return static_cast<VMObject*>(vnode->vmo());
|
||||
auto vmo = adopt(*new VMObject(move(vnode), size));
|
||||
vmo->vnode()->set_vmo(vmo.ptr());
|
||||
return vmo;
|
||||
}
|
||||
|
||||
RetainPtr<VMObject> VMObject::create_anonymous(size_t size)
|
||||
|
@ -679,6 +686,11 @@ VMObject::VMObject(RetainPtr<VirtualFileSystem::Node>&& vnode, size_t size)
|
|||
|
||||
VMObject::~VMObject()
|
||||
{
|
||||
InterruptDisabler disabler;
|
||||
if (m_vnode) {
|
||||
ASSERT(m_vnode->vmo() == this);
|
||||
m_vnode->set_vmo(nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
int Region::commit(Process& process)
|
||||
|
|
|
@ -49,7 +49,7 @@ ByteBuffer procfs$pid_vm(Process& process)
|
|||
{
|
||||
ProcessInspectionScope scope(process);
|
||||
char* buffer;
|
||||
auto stringImpl = StringImpl::createUninitialized(80 + process.regionCount() * 80 + 4096, buffer);
|
||||
auto stringImpl = StringImpl::createUninitialized(80 + process.regionCount() * 160 + 4096, buffer);
|
||||
memset(buffer, 0, stringImpl->length());
|
||||
char* ptr = buffer;
|
||||
ptr += ksprintf(ptr, "BEGIN END SIZE NAME\n");
|
||||
|
@ -59,12 +59,17 @@ ByteBuffer procfs$pid_vm(Process& process)
|
|||
region->linearAddress.offset(region->size - 1).get(),
|
||||
region->size,
|
||||
region->name.characters());
|
||||
ptr += ksprintf(ptr, "VMO: %s \"%s\" @ %x(%u)\n",
|
||||
region->vmo().is_anonymous() ? "anonymous" : "file-backed",
|
||||
region->vmo().name().characters(),
|
||||
®ion->vmo(),
|
||||
region->vmo().retainCount());
|
||||
for (size_t i = 0; i < region->vmo().page_count(); ++i) {
|
||||
auto& physical_page = region->vmo().physical_pages()[i];
|
||||
ptr += ksprintf(ptr, "P%x%s(%u) ",
|
||||
physical_page ? physical_page->paddr().get() : 0,
|
||||
region->cow_map.get(i) ? "!" : "",
|
||||
physical_page->retain_count()
|
||||
physical_page ? physical_page->retain_count() : 0
|
||||
);
|
||||
}
|
||||
ptr += ksprintf(ptr, "\n");
|
||||
|
|
|
@ -296,7 +296,6 @@ void init()
|
|||
procfs->initialize();
|
||||
|
||||
Process::initialize();
|
||||
|
||||
Process::create_kernel_process(init_stage2, "init_stage2");
|
||||
|
||||
Scheduler::pick_next();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue