v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
virtual-address-space.h
Go to the documentation of this file.
1// Copyright 2021 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_BASE_VIRTUAL_ADDRESS_SPACE_H_
6#define V8_BASE_VIRTUAL_ADDRESS_SPACE_H_
7
14
15namespace v8 {
16namespace base {
17
18using Address = uintptr_t;
19constexpr Address kNullAddress = 0;
20
22
23/*
24 * Common parent class to implement deletion of subspaces.
25 */
27 : public NON_EXPORTED_BASE(::v8::VirtualAddressSpace) {
28 public:
30
31 private:
33 // Called by a subspace during destruction. Responsible for freeing the
34 // address space reservation and any other data associated with the subspace
35 // in the parent space.
36 virtual void FreeSubspace(VirtualAddressSubspace* subspace) = 0;
37};
38
39/*
40 * Helper routine to determine whether one set of page permissions (the lhs) is
41 * a subset of another one (the rhs).
42 */
44
45/*
46 * The virtual address space of the current process. Conceptionally, there
47 * should only be one such "root" instance. However, in practice there is no
48 * issue with having multiple instances as the actual resources are managed by
49 * the OS kernel.
50 */
52 public:
54 ~VirtualAddressSpace() override = default;
55
56 void SetRandomSeed(int64_t seed) override;
57
58 Address RandomPageAddress() override;
59
60 Address AllocatePages(Address hint, size_t size, size_t alignment,
61 PagePermissions access) override;
62
63 void FreePages(Address address, size_t size) override;
64
65 bool SetPagePermissions(Address address, size_t size,
66 PagePermissions access) override;
67
68 bool AllocateGuardRegion(Address address, size_t size) override;
69
70 void FreeGuardRegion(Address address, size_t size) override;
71
72 Address AllocateSharedPages(Address hint, size_t size,
73 PagePermissions permissions,
75 uint64_t offset) override;
76
77 void FreeSharedPages(Address address, size_t size) override;
78
79 bool CanAllocateSubspaces() override;
80
81 std::unique_ptr<v8::VirtualAddressSpace> AllocateSubspace(
82 Address hint, size_t size, size_t alignment,
83 PagePermissions max_page_permissions) override;
84
85 bool RecommitPages(Address address, size_t size,
86 PagePermissions access) override;
87
88 bool DiscardSystemPages(Address address, size_t size) override;
89
90 bool DecommitPages(Address address, size_t size) override;
91
92 private:
93 void FreeSubspace(VirtualAddressSubspace* subspace) override;
94};
95
96/*
97 * A subspace of a parent virtual address space. This represents a reserved
98 * contiguous region of virtual address space in the current process.
99 */
101 public:
102 ~VirtualAddressSubspace() override;
103
104 void SetRandomSeed(int64_t seed) override;
105
106 Address RandomPageAddress() override;
107
108 Address AllocatePages(Address hint, size_t size, size_t alignment,
109 PagePermissions permissions) override;
110
111 void FreePages(Address address, size_t size) override;
112
113 bool SetPagePermissions(Address address, size_t size,
114 PagePermissions permissions) override;
115
116 bool AllocateGuardRegion(Address address, size_t size) override;
117
118 void FreeGuardRegion(Address address, size_t size) override;
119
120 Address AllocateSharedPages(Address hint, size_t size,
121 PagePermissions permissions,
123 uint64_t offset) override;
124
125 void FreeSharedPages(Address address, size_t size) override;
126
127 bool CanAllocateSubspaces() override { return true; }
128
129 std::unique_ptr<v8::VirtualAddressSpace> AllocateSubspace(
130 Address hint, size_t size, size_t alignment,
131 PagePermissions max_page_permissions) override;
132
133 bool RecommitPages(Address address, size_t size,
134 PagePermissions permissions) override;
135
136 bool DiscardSystemPages(Address address, size_t size) override;
137
138 bool DecommitPages(Address address, size_t size) override;
139
140 private:
141 // The VirtualAddressSpace class creates instances of this class when
142 // allocating sub spaces.
144
145 void FreeSubspace(VirtualAddressSubspace* subspace) override;
146
148 VirtualAddressSpaceBase* parent_space,
149 PagePermissions max_page_permissions);
150
151 // The address space reservation backing this subspace.
153
154 // Mutex guarding the non-threadsafe RegionAllocator and
155 // RandomNumberGenerator.
157
158 // RegionAllocator to manage the virtual address reservation and divide it
159 // into further regions as necessary.
161
162 // Random number generator for generating random addresses.
164
165 // Pointer to the parent space. Must be kept alive by the owner of this
166 // instance during its lifetime.
168};
169
170} // namespace base
171} // namespace v8
172#endif // V8_BASE_VIRTUAL_ADDRESS_SPACE_H_
#define V8_BASE_EXPORT
Definition base-export.h:26
virtual void FreeSubspace(VirtualAddressSubspace *subspace)=0
~VirtualAddressSpace() override=default
VirtualAddressSpaceBase * parent_space_
int32_t offset
uintptr_t Address
Definition memory.h:13
bool IsSubset(PagePermissions lhs, PagePermissions rhs)
constexpr Address kNullAddress
intptr_t PlatformSharedMemoryHandle
PagePermissions
#define NON_EXPORTED_BASE(code)