Make MemoryMapEntry have private fields with public getters
This commit is contained in:
parent
ec1354fc8d
commit
d9fc50f1ea
@ -29,8 +29,8 @@ static usize get_physical_address_space_size()
|
|||||||
MemoryMapIterator iter;
|
MemoryMapIterator iter;
|
||||||
const MemoryMapEntry entry = iter.highest();
|
const MemoryMapEntry entry = iter.highest();
|
||||||
|
|
||||||
return entry.ptr + entry.size; // This is the address at the end of the last (highest) entry, thus the whole
|
return entry.address() + entry.size(); // This is the address at the end of the last (highest) entry, thus the whole
|
||||||
// address space that was passed to us.
|
// address space that was passed to us.
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MemoryManager
|
namespace MemoryManager
|
||||||
@ -55,7 +55,7 @@ namespace MemoryManager
|
|||||||
|
|
||||||
const auto largest_free = iter.largest_free();
|
const auto largest_free = iter.largest_free();
|
||||||
|
|
||||||
expect(largest_free.free, "We were given a largest free memory region that isn't even free!");
|
expect(largest_free.is_free(), "We were given a largest free memory region that isn't even free!");
|
||||||
|
|
||||||
// The entire physical address space. May contain inexistent memory holes, thus differs from total_mem which
|
// The entire physical address space. May contain inexistent memory holes, thus differs from total_mem which
|
||||||
// only counts existent memory. Our bitmap needs to have space for all of the physical address space, since
|
// only counts existent memory. Our bitmap needs to have space for all of the physical address space, since
|
||||||
@ -63,13 +63,13 @@ namespace MemoryManager
|
|||||||
const usize physical_address_space_size = get_physical_address_space_size();
|
const usize physical_address_space_size = get_physical_address_space_size();
|
||||||
|
|
||||||
// We store our frame bitmap at the beginning of the largest free memory block.
|
// We store our frame bitmap at the beginning of the largest free memory block.
|
||||||
char* const frame_bitmap_addr = (char*)largest_free.ptr;
|
char* const frame_bitmap_addr = (char*)largest_free.ptr();
|
||||||
|
|
||||||
const usize frame_bitmap_size = get_blocks_from_size(physical_address_space_size / ARCH_PAGE_SIZE, 8UL);
|
const usize frame_bitmap_size = get_blocks_from_size(physical_address_space_size / ARCH_PAGE_SIZE, 8UL);
|
||||||
|
|
||||||
// This should never happen, unless memory is very fragmented. Usually there is always a very big block of
|
// This should never happen, unless memory is very fragmented. Usually there is always a very big block of
|
||||||
// usable memory and then some tiny blocks around it.
|
// usable memory and then some tiny blocks around it.
|
||||||
expect(frame_bitmap_size < largest_free.size, "No single memory region is enough to hold the frame bitmap");
|
expect(frame_bitmap_size < largest_free.size(), "No single memory region is enough to hold the frame bitmap");
|
||||||
|
|
||||||
g_frame_bitmap.initialize(frame_bitmap_addr, frame_bitmap_size);
|
g_frame_bitmap.initialize(frame_bitmap_addr, frame_bitmap_size);
|
||||||
|
|
||||||
@ -78,18 +78,18 @@ namespace MemoryManager
|
|||||||
iter.rewind();
|
iter.rewind();
|
||||||
while (iter.next().try_set_value(entry))
|
while (iter.next().try_set_value(entry))
|
||||||
{
|
{
|
||||||
const u64 index = entry.ptr / ARCH_PAGE_SIZE;
|
const u64 index = entry.address() / ARCH_PAGE_SIZE;
|
||||||
const u64 pages = entry.size / ARCH_PAGE_SIZE;
|
const u64 pages = entry.size() / ARCH_PAGE_SIZE;
|
||||||
if (!entry.free) { reserved_mem += entry.size; }
|
if (!entry.is_free()) { reserved_mem += entry.size(); }
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
free_mem += entry.size;
|
free_mem += entry.size();
|
||||||
g_frame_bitmap.clear_region(index, pages, false);
|
g_frame_bitmap.clear_region(index, pages, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure that the physical frames used by the bitmap aren't handed out to anyone else.
|
// Make sure that the physical frames used by the bitmap aren't handed out to anyone else.
|
||||||
lock_frames(largest_free.ptr, get_blocks_from_size(frame_bitmap_size, ARCH_PAGE_SIZE));
|
lock_frames(largest_free.address(), get_blocks_from_size(frame_bitmap_size, ARCH_PAGE_SIZE));
|
||||||
}
|
}
|
||||||
|
|
||||||
void init()
|
void init()
|
||||||
|
@ -2,19 +2,29 @@
|
|||||||
|
|
||||||
extern const BOOTBOOT bootboot;
|
extern const BOOTBOOT bootboot;
|
||||||
|
|
||||||
static MemoryMapEntry memory_map_entry_from_mmapent(const MMapEnt* ent)
|
MemoryMapEntry::MemoryMapEntry(u64 address, u64 size, bool is_free)
|
||||||
|
: m_address(address), m_size(size), m_is_free(is_free)
|
||||||
{
|
{
|
||||||
MemoryMapEntry result;
|
|
||||||
result.ptr = MMapEnt_Ptr(ent);
|
|
||||||
result.size = MMapEnt_Size(ent);
|
|
||||||
result.free = MMapEnt_IsFree(ent);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MemoryMapIterator::MemoryMapIterator()
|
MemoryMapEntry& MemoryMapEntry::operator=(const MemoryMapEntry& other)
|
||||||
|
{
|
||||||
|
if (&other == this) return *this;
|
||||||
|
|
||||||
|
m_address = other.address();
|
||||||
|
m_size = other.size();
|
||||||
|
m_is_free = other.is_free();
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MemoryMapEntry memory_map_entry_from_mmapent(const MMapEnt* ent)
|
||||||
|
{
|
||||||
|
return {MMapEnt_Ptr(ent), MMapEnt_Size(ent), MMapEnt_IsFree(ent)};
|
||||||
|
}
|
||||||
|
|
||||||
|
MemoryMapIterator::MemoryMapIterator() : m_mmap_entries((bootboot.size - 128) / 16), m_base_ent(&bootboot.mmap)
|
||||||
{
|
{
|
||||||
m_mmap_entries = (bootboot.size - 128) / 16;
|
|
||||||
m_base_ent = &bootboot.mmap;
|
|
||||||
rewind();
|
rewind();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,9 +54,9 @@ MemoryMapEntry MemoryMapIterator::largest_free()
|
|||||||
MemoryMapEntry entry;
|
MemoryMapEntry entry;
|
||||||
while (next().try_set_value(entry))
|
while (next().try_set_value(entry))
|
||||||
{
|
{
|
||||||
if (entry.free && entry.size > largest_size)
|
if (entry.is_free() && entry.size() > largest_size)
|
||||||
{
|
{
|
||||||
largest_size = entry.size;
|
largest_size = entry.size();
|
||||||
largest_index = m_cur_ent - 1;
|
largest_index = m_cur_ent - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -56,7 +66,7 @@ MemoryMapEntry MemoryMapIterator::largest_free()
|
|||||||
|
|
||||||
MemoryMapEntry MemoryMapIterator::highest()
|
MemoryMapEntry MemoryMapIterator::highest()
|
||||||
{
|
{
|
||||||
usize highest_ptr = 0;
|
usize highest_address = 0;
|
||||||
usize highest_index = 0;
|
usize highest_index = 0;
|
||||||
|
|
||||||
rewind();
|
rewind();
|
||||||
@ -64,9 +74,9 @@ MemoryMapEntry MemoryMapIterator::highest()
|
|||||||
MemoryMapEntry entry;
|
MemoryMapEntry entry;
|
||||||
while (next().try_set_value(entry))
|
while (next().try_set_value(entry))
|
||||||
{
|
{
|
||||||
if (entry.ptr > highest_ptr)
|
if (entry.address() > highest_address)
|
||||||
{
|
{
|
||||||
highest_ptr = entry.ptr;
|
highest_address = entry.address();
|
||||||
highest_index = m_cur_ent - 1;
|
highest_index = m_cur_ent - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,36 @@
|
|||||||
|
|
||||||
struct MemoryMapEntry
|
struct MemoryMapEntry
|
||||||
{
|
{
|
||||||
u64 ptr;
|
MemoryMapEntry() = default;
|
||||||
u64 size;
|
MemoryMapEntry(const MemoryMapEntry& other) = default;
|
||||||
bool free;
|
MemoryMapEntry(u64 address, u64 size, bool is_free);
|
||||||
|
|
||||||
|
u64 address() const
|
||||||
|
{
|
||||||
|
return m_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* ptr() const
|
||||||
|
{
|
||||||
|
return (void*)m_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 size() const
|
||||||
|
{
|
||||||
|
return m_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_free() const
|
||||||
|
{
|
||||||
|
return m_is_free;
|
||||||
|
}
|
||||||
|
|
||||||
|
MemoryMapEntry& operator=(const MemoryMapEntry& other);
|
||||||
|
|
||||||
|
private:
|
||||||
|
u64 m_address;
|
||||||
|
u64 m_size;
|
||||||
|
bool m_is_free;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MemoryMapIterator
|
class MemoryMapIterator
|
||||||
@ -31,7 +58,7 @@ class MemoryMapIterator
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
usize m_mmap_entries;
|
const usize m_mmap_entries;
|
||||||
const MMapEnt* m_base_ent;
|
const MMapEnt* m_base_ent;
|
||||||
usize m_cur_ent;
|
usize m_cur_ent;
|
||||||
};
|
};
|
Loading…
Reference in New Issue
Block a user