Skip to content

Commit f4b0811

Browse files
committed
VM (new pixeltower): 原始内存分配器
1 parent 4061d30 commit f4b0811

5 files changed

Lines changed: 148 additions & 1 deletion

File tree

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#ifndef OM_MEM_PREALLOC_HPP
2+
#define OM_MEM_PREALLOC_HPP
3+
4+
#include "openminecraft/log/om_log_common.hpp"
5+
#include <cstdint>
6+
namespace openminecraft::mem
7+
{
8+
class OMHeap
9+
{
10+
public:
11+
OMHeap(uint64_t minSize, uint64_t maxSize);
12+
~OMHeap();
13+
14+
void init();
15+
void expand(void *target);
16+
void shrink(void *target);
17+
18+
void *block;
19+
20+
private:
21+
log::OMLogger logger;
22+
uint64_t minSize;
23+
uint64_t maxSize;
24+
25+
void activate(void *p, uint64_t length);
26+
void deactivate(void *p, uint64_t length);
27+
void *heapTop;
28+
};
29+
} // namespace openminecraft::mem
30+
31+
#endif

plat/unix/om_mem_plat.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,59 @@
1+
#include "openminecraft/log/om_log_common.hpp"
2+
#include "openminecraft/mem/om_mem_prealloc.hpp"
13
#include "openminecraft/mem/om_mem_record.hpp"
4+
#include <cerrno>
5+
#include <cstring>
6+
#include <new>
27
#if defined(OM_PLATFORM_IOS) || defined(OM_PLATFORM_MACOS)
38
#include <malloc/malloc.h>
49
#else
510
#include <malloc.h>
611
#endif
712

13+
#include <sys/mman.h>
14+
15+
namespace openminecraft::mem
16+
{
17+
OMHeap::OMHeap(uint64_t minSize, uint64_t maxSize) : logger("OMHeap", this), maxSize(maxSize), minSize(minSize)
18+
{
19+
block = mmap(nullptr, maxSize, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
20+
if (block == nullptr)
21+
{
22+
logger.error("[unix-like] unable to map memory ({})", strerror(errno));
23+
throw std::bad_alloc();
24+
}
25+
}
26+
27+
OMHeap::~OMHeap()
28+
{
29+
munmap(block, maxSize);
30+
}
31+
32+
void OMHeap::activate(void *p, uint64_t length)
33+
{
34+
if (mprotect(p, length, PROT_READ | PROT_WRITE) == -1)
35+
{
36+
logger.error("[unix-like] mprotect fail ({})", strerror(errno));
37+
throw std::bad_alloc();
38+
}
39+
}
40+
41+
void OMHeap::deactivate(void *p, uint64_t length)
42+
{
43+
if (madvise(p, length, MADV_DONTNEED) == -1)
44+
{
45+
logger.error("[unix-like] madvise fail ({})", strerror(errno));
46+
throw std::bad_alloc();
47+
}
48+
49+
if (mprotect(p, length, PROT_NONE) == -1)
50+
{
51+
logger.error("[unix-like] mprotect fail ({})", strerror(errno));
52+
throw std::bad_alloc();
53+
}
54+
}
55+
} // namespace openminecraft::mem
56+
857
namespace openminecraft::mem::castorice
958
{
1059
size_t heapSize(void *p)

plat/windows/om_mem_plat.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
1+
#include "openminecraft/mem/om_mem_prealloc.hpp"
12
#include "openminecraft/mem/om_mem_record.hpp"
23
#include <malloc.h>
34

5+
namespace openminecraft::mem
6+
{
7+
OMHeap::OMHeap(uint64_t minSize, uint64_t maxSize) : logger("OMHeap", this), maxSize(maxSize), minSize(minSize)
8+
{
9+
}
10+
11+
OMHeap::~OMHeap()
12+
{
13+
}
14+
15+
void OMHeap::activate(void *p, uint64_t length)
16+
{
17+
}
18+
19+
void OMHeap::deactivate(void *p, uint64_t length)
20+
{
21+
}
22+
} // namespace openminecraft::mem
23+
424
namespace openminecraft::mem::castorice
525
{
626
size_t heapSize(void *p)

src/boot/entrypoint.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "openminecraft/log/om_log_common.hpp"
2929
#include "openminecraft/log/om_log_threadname.hpp"
3030
#include "openminecraft/mem/om_mem_allocator.hpp"
31+
#include "openminecraft/mem/om_mem_prealloc.hpp"
3132
#include "openminecraft/mem/om_mem_record.hpp"
3233
#include "openminecraft/renderer/om_renderer_layer.hpp"
3334
#include "openminecraft/renderer/vk/om_renderer_layer_vk.hpp"
@@ -116,8 +117,9 @@ int boot(std::vector<std::string> args)
116117

117118
SDL_Quit();
118119

119-
std::shared_ptr<OMClassFileParser> parser;
120120
bool recovermode = false;
121+
mem::OMHeap heap(0ul, 8ull * 1024 * 1024 * 1024);
122+
heap.init();
121123

122124
if (setjmp(recoverBuffer) == 0)
123125
{
@@ -148,6 +150,17 @@ int boot(std::vector<std::string> args)
148150
commandBuffer.clear();
149151
mem::castorice::printres();
150152
break;
153+
case "memtest"_hash: {
154+
heap.expand(static_cast<uint8_t *>(heap.block) + 255);
155+
auto i = static_cast<int *>(heap.block);
156+
i[0] = 33550336;
157+
logger->debug("heap write : {}", i[0]);
158+
heap.shrink(heap.block);
159+
160+
commandBuffer.clear();
161+
162+
break;
163+
}
151164
case "crash"_hash: {
152165
logger->info("{}", *((int *)nullptr));
153166
}

src/mem/om_mem_prealloc.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include "openminecraft/mem/om_mem_prealloc.hpp"
2+
3+
namespace openminecraft::mem
4+
{
5+
void OMHeap::init()
6+
{
7+
heapTop = block;
8+
if (minSize == 0)
9+
{
10+
return;
11+
}
12+
expand(static_cast<uint8_t *>(block) + minSize);
13+
}
14+
void OMHeap::expand(void *target)
15+
{
16+
if (target < block || target <= heapTop)
17+
{
18+
logger.error("target is not valid!");
19+
}
20+
21+
activate(heapTop, (size_t)target - (size_t)heapTop);
22+
heapTop = target;
23+
}
24+
void OMHeap::shrink(void *target)
25+
{
26+
if (target < block || target >= heapTop)
27+
{
28+
logger.error("target is not valid!");
29+
}
30+
31+
deactivate(target, (size_t)heapTop - (size_t)target);
32+
heapTop = target;
33+
}
34+
} // namespace openminecraft::mem

0 commit comments

Comments
 (0)