mirror of
https://github.com/johndoe6345789/MetalOS.git
synced 2026-04-24 13:45:02 +00:00
Add support for 64GB of RAM
- Update BITMAP_SIZE from 32768 to 2097152 bytes (2MB bitmap) - Update totalPages calculation to support 64GB (16M pages) - Update documentation to reflect 64GB memory support - Memory manager now supports any amount up to 64GB Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
This commit is contained in:
@@ -35,7 +35,7 @@
|
|||||||
- Bitmap-based physical page allocator
|
- Bitmap-based physical page allocator
|
||||||
- Bump allocator for kernel heap (1MB)
|
- Bump allocator for kernel heap (1MB)
|
||||||
- Memory utilities (memset, memcpy, memcmp)
|
- Memory utilities (memset, memcpy, memcmp)
|
||||||
- Support for up to 128MB RAM
|
- Support for up to 64GB RAM
|
||||||
|
|
||||||
#### PCI Bus Support
|
#### PCI Bus Support
|
||||||
- Files: `kernel/src/pci.c`, `kernel/include/kernel/pci.h`
|
- Files: `kernel/src/pci.c`, `kernel/include/kernel/pci.h`
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ if (gpu) {
|
|||||||
- **No Console Module**: As requested, no console.c/h files are created
|
- **No Console Module**: As requested, no console.c/h files are created
|
||||||
- **Minimal Design**: Only essential features for QT6 Hello World
|
- **Minimal Design**: Only essential features for QT6 Hello World
|
||||||
- **Bump Allocator**: Current heap doesn't support freeing (upgrade later if needed)
|
- **Bump Allocator**: Current heap doesn't support freeing (upgrade later if needed)
|
||||||
- **Physical Memory**: Simple bitmap allocator (32768 pages max in current impl)
|
- **Physical Memory**: Simple bitmap allocator (supports up to 64GB with 2MB bitmap)
|
||||||
- **PCI Scan**: Scans all 256 buses, 32 devices per bus
|
- **PCI Scan**: Scans all 256 buses, 32 devices per bus
|
||||||
- **Timer**: Uses PIT in rate generator mode
|
- **Timer**: Uses PIT in rate generator mode
|
||||||
|
|
||||||
|
|||||||
@@ -18,8 +18,8 @@
|
|||||||
* - 0 = page is free and available for allocation
|
* - 0 = page is free and available for allocation
|
||||||
* - 1 = page is in use
|
* - 1 = page is in use
|
||||||
*
|
*
|
||||||
* The bitmap supports up to 128MB of physical memory (32768 bytes * 8 bits/byte
|
* The bitmap supports up to 64GB of physical memory (2097152 bytes * 8 bits/byte
|
||||||
* * 4KB per page = 128MB). Memory is assumed to start at physical address 0x01000000
|
* * 4KB per page = 64GB). Memory is assumed to start at physical address 0x01000000
|
||||||
* (16MB) to avoid conflicts with legacy hardware and the kernel itself.
|
* (16MB) to avoid conflicts with legacy hardware and the kernel itself.
|
||||||
*
|
*
|
||||||
* This is a very simple allocator suitable for a minimal kernel. It does not:
|
* This is a very simple allocator suitable for a minimal kernel. It does not:
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
*/
|
*/
|
||||||
class PhysicalMemoryManager {
|
class PhysicalMemoryManager {
|
||||||
private:
|
private:
|
||||||
uint8_t pageBitmap[32768]; ///< Bitmap tracking page allocation (128MB / 4KB pages)
|
uint8_t pageBitmap[2097152]; ///< Bitmap tracking page allocation (64GB / 4KB pages = 16M pages = 2MB bitmap)
|
||||||
uint64_t totalPages; ///< Total number of pages managed
|
uint64_t totalPages; ///< Total number of pages managed
|
||||||
uint64_t usedPages; ///< Number of pages currently allocated
|
uint64_t usedPages; ///< Number of pages currently allocated
|
||||||
|
|
||||||
@@ -39,8 +39,8 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize the physical memory manager with boot information
|
* @brief Initialize the physical memory manager with boot information
|
||||||
* @param bootInfo Boot information from bootloader (currently unused, assumes 128MB)
|
* @param bootInfo Boot information from bootloader (currently unused, assumes up to 64GB)
|
||||||
* @note Currently hardcoded to manage 128MB starting at 16MB physical address
|
* @note Currently hardcoded to manage up to 64GB starting at 16MB physical address
|
||||||
*/
|
*/
|
||||||
void init(BootInfo* bootInfo);
|
void init(BootInfo* bootInfo);
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
#include "kernel/memory.h"
|
#include "kernel/memory.h"
|
||||||
|
|
||||||
// Physical memory bitmap constants
|
// Physical memory bitmap constants
|
||||||
#define BITMAP_SIZE 32768 // Supports up to 128MB with 4KB pages
|
#define BITMAP_SIZE 2097152 // Supports up to 64GB with 4KB pages (64GB / 4KB = 16M pages, 16M bits = 2MB bitmap)
|
||||||
|
|
||||||
/* PhysicalMemoryManager class implementation */
|
/* PhysicalMemoryManager class implementation */
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ PhysicalMemoryManager::PhysicalMemoryManager()
|
|||||||
* @brief Initialize the physical memory manager
|
* @brief Initialize the physical memory manager
|
||||||
*
|
*
|
||||||
* Currently uses a simplified approach:
|
* Currently uses a simplified approach:
|
||||||
* - Assumes 128MB of usable RAM starting at physical address 16MB (0x01000000)
|
* - Assumes up to 64GB of usable RAM starting at physical address 16MB (0x01000000)
|
||||||
* - Clears the entire page bitmap to mark all pages as free
|
* - Clears the entire page bitmap to mark all pages as free
|
||||||
* - TODO: Parse the UEFI memory map from bootInfo to properly detect available memory
|
* - TODO: Parse the UEFI memory map from bootInfo to properly detect available memory
|
||||||
*
|
*
|
||||||
@@ -41,8 +41,9 @@ PhysicalMemoryManager::PhysicalMemoryManager()
|
|||||||
void PhysicalMemoryManager::init(BootInfo* bootInfo) {
|
void PhysicalMemoryManager::init(BootInfo* bootInfo) {
|
||||||
(void)bootInfo; // TODO: Parse UEFI memory map
|
(void)bootInfo; // TODO: Parse UEFI memory map
|
||||||
|
|
||||||
// For now, assume 128MB of usable memory starting at 16MB
|
// For now, assume 64GB of usable memory starting at 16MB
|
||||||
totalPages = (128 * 1024 * 1024) / PAGE_SIZE;
|
// This supports any amount up to 64GB
|
||||||
|
totalPages = (64ULL * 1024 * 1024 * 1024) / PAGE_SIZE;
|
||||||
|
|
||||||
// Clear bitmap
|
// Clear bitmap
|
||||||
for (uint64_t i = 0; i < BITMAP_SIZE; i++) {
|
for (uint64_t i = 0; i < BITMAP_SIZE; i++) {
|
||||||
|
|||||||
Reference in New Issue
Block a user