summaryrefslogtreecommitdiff
path: root/Kernel/Memory/AddressSpace.h
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-08-06 13:57:39 +0200
committerAndreas Kling <kling@serenityos.org>2021-08-06 14:05:58 +0200
commitb7476d7a1b71ecee6488b6daa4cf41753b699646 (patch)
tree7564316ede5c16fd2041cbdf460e1707bfeac825 /Kernel/Memory/AddressSpace.h
parentcd5faf4e425443730695cb5d2e04906fe8bfb691 (diff)
downloadserenity-b7476d7a1b71ecee6488b6daa4cf41753b699646.zip
Kernel: Rename Memory::Space => Memory::AddressSpace
Diffstat (limited to 'Kernel/Memory/AddressSpace.h')
-rw-r--r--Kernel/Memory/AddressSpace.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/Kernel/Memory/AddressSpace.h b/Kernel/Memory/AddressSpace.h
new file mode 100644
index 0000000000..973a7f4fe3
--- /dev/null
+++ b/Kernel/Memory/AddressSpace.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2021, Leon Albrecht <leon2002.la@gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/RedBlackTree.h>
+#include <AK/Vector.h>
+#include <AK/WeakPtr.h>
+#include <Kernel/Memory/AllocationStrategy.h>
+#include <Kernel/Memory/PageDirectory.h>
+#include <Kernel/UnixTypes.h>
+
+namespace Kernel::Memory {
+
+class AddressSpace {
+public:
+ static OwnPtr<AddressSpace> try_create(Process&, AddressSpace const* parent);
+ ~AddressSpace();
+
+ PageDirectory& page_directory() { return *m_page_directory; }
+ const PageDirectory& page_directory() const { return *m_page_directory; }
+
+ Region* add_region(NonnullOwnPtr<Region>);
+
+ size_t region_count() const { return m_regions.size(); }
+
+ RedBlackTree<FlatPtr, NonnullOwnPtr<Region>>& regions() { return m_regions; }
+ const RedBlackTree<FlatPtr, NonnullOwnPtr<Region>>& regions() const { return m_regions; }
+
+ void dump_regions();
+
+ KResult unmap_mmap_range(VirtualAddress, size_t);
+
+ Optional<VirtualRange> allocate_range(VirtualAddress, size_t, size_t alignment = PAGE_SIZE);
+
+ KResultOr<Region*> allocate_region_with_vmobject(VirtualRange const&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, StringView name, int prot, bool shared);
+ KResultOr<Region*> allocate_region(VirtualRange const&, StringView name, int prot = PROT_READ | PROT_WRITE, AllocationStrategy strategy = AllocationStrategy::Reserve);
+ void deallocate_region(Region& region);
+ NonnullOwnPtr<Region> take_region(Region& region);
+
+ KResultOr<Region*> try_allocate_split_region(Region const& source_region, VirtualRange const&, size_t offset_in_vmobject);
+ KResultOr<Vector<Region*, 2>> try_split_region_around_range(Region const& source_region, VirtualRange const&);
+
+ Region* find_region_from_range(VirtualRange const&);
+ Region* find_region_containing(VirtualRange const&);
+
+ Vector<Region*> find_regions_intersecting(VirtualRange const&);
+
+ bool enforces_syscall_regions() const { return m_enforces_syscall_regions; }
+ void set_enforces_syscall_regions(bool b) { m_enforces_syscall_regions = b; }
+
+ void remove_all_regions(Badge<Process>);
+
+ RecursiveSpinLock& get_lock() const { return m_lock; }
+
+ size_t amount_clean_inode() const;
+ size_t amount_dirty_private() const;
+ size_t amount_virtual() const;
+ size_t amount_resident() const;
+ size_t amount_shared() const;
+ size_t amount_purgeable_volatile() const;
+ size_t amount_purgeable_nonvolatile() const;
+
+private:
+ AddressSpace(Process&, NonnullRefPtr<PageDirectory>);
+
+ Process* m_process { nullptr };
+ mutable RecursiveSpinLock m_lock;
+
+ RefPtr<PageDirectory> m_page_directory;
+
+ RedBlackTree<FlatPtr, NonnullOwnPtr<Region>> m_regions;
+
+ struct RegionLookupCache {
+ Optional<VirtualRange> range;
+ WeakPtr<Region> region;
+ };
+ RegionLookupCache m_region_lookup_cache;
+
+ bool m_enforces_syscall_regions { false };
+};
+
+}