Header rationalization for mm/ dir
This commit is contained in:
parent
3bce4c6208
commit
7c0fd93ad5
213
include/mm/mm.h
213
include/mm/mm.h
|
@ -1,213 +0,0 @@
|
||||||
//----------------------------------------------------------------------------//
|
|
||||||
// GNU GPL OS/K //
|
|
||||||
// //
|
|
||||||
// Desc: Memory manager functions //
|
|
||||||
// //
|
|
||||||
// //
|
|
||||||
// Copyright © 2018-2019 The OS/K Team //
|
|
||||||
// //
|
|
||||||
// This file is part of OS/K. //
|
|
||||||
// //
|
|
||||||
// OS/K is free software: you can redistribute it and/or modify //
|
|
||||||
// it under the terms of the GNU General Public License as published by //
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or //
|
|
||||||
// any later version. //
|
|
||||||
// //
|
|
||||||
// OS/K is distributed in the hope that it will be useful, //
|
|
||||||
// but WITHOUT ANY WARRANTY//without even the implied warranty of //
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
|
||||||
// GNU General Public License for more details. //
|
|
||||||
// //
|
|
||||||
// You should have received a copy of the GNU General Public License //
|
|
||||||
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
|
||||||
//----------------------------------------------------------------------------//
|
|
||||||
|
|
||||||
#ifndef _KERNEL_H
|
|
||||||
#include <kernel.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _MM_MM_H
|
|
||||||
#define _MM_MM_H
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
|
||||||
|
|
||||||
#define MINIMUM_RAM_SIZE 16 // Mio, the minimum RAM size.
|
|
||||||
#define IOMAP_SIZE (8 * 1024)
|
|
||||||
|
|
||||||
#define AVAILABLE_ZONE 1 // Fully usable RAM zone
|
|
||||||
#define RESERVED_ZONE 2 // Used by the firmware
|
|
||||||
#define ACPI_ZONE 3 // Used by ACPI but can be freed
|
|
||||||
#define NVS_ZONE 4 // Dunno
|
|
||||||
#define BADRAM_ZONE 5 // Invalid zone because material problem...
|
|
||||||
#define MAX_ENTRIES 2048 // Max number of memory map entries
|
|
||||||
#define KPAGESIZE (4 * KB)
|
|
||||||
#define UPAGESIZE (4 * KB)
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
|
||||||
|
|
||||||
// The entry structure of the map
|
|
||||||
struct MapEntry_t {
|
|
||||||
void *addr;
|
|
||||||
size_t length; // in bytes
|
|
||||||
uint type; // reserved or not
|
|
||||||
} __attribute__((__packed__));
|
|
||||||
|
|
||||||
// the map structure
|
|
||||||
struct MemoryMap_t {
|
|
||||||
size_t length;
|
|
||||||
size_t freeRamSize;
|
|
||||||
size_t nonfreeRamSize;
|
|
||||||
MapEntry_t entry[MAX_ENTRIES];
|
|
||||||
} __attribute__((__packed__));
|
|
||||||
|
|
||||||
// The gdt entry
|
|
||||||
struct GdtEntry_t
|
|
||||||
{
|
|
||||||
ushort lowLimit; // lower 16 bits
|
|
||||||
ushort lowBase; // lower 16 bits
|
|
||||||
uchar middleBase; // next 8 bits
|
|
||||||
uchar access; // determine what ring this segment can be used in
|
|
||||||
uchar flags;
|
|
||||||
uchar highBase; // last 8 bits
|
|
||||||
} __attribute__((__packed__));
|
|
||||||
|
|
||||||
struct TssDescriptor_t
|
|
||||||
{
|
|
||||||
ushort lowLimit;
|
|
||||||
ushort lowBase;
|
|
||||||
uchar middleBase;
|
|
||||||
uchar access;
|
|
||||||
uchar flags;
|
|
||||||
uchar highBase;
|
|
||||||
uint veryHighBase;
|
|
||||||
uint reserved;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
struct Tss_t
|
|
||||||
{
|
|
||||||
uint reserved1;
|
|
||||||
|
|
||||||
// Stack pointers (RSP) for privilege levels 0-2
|
|
||||||
ulong rsp0;
|
|
||||||
ulong rsp1;
|
|
||||||
ulong rsp2;
|
|
||||||
ulong reserved2;
|
|
||||||
|
|
||||||
// Interrupt stack table pointers
|
|
||||||
ulong ist1;
|
|
||||||
ulong ist2;
|
|
||||||
ulong ist3;
|
|
||||||
ulong ist4;
|
|
||||||
ulong ist5;
|
|
||||||
ulong ist6;
|
|
||||||
ulong ist7;
|
|
||||||
ulong reserved3;
|
|
||||||
ushort reserved4;
|
|
||||||
|
|
||||||
// Offset to the I/O permission bit map from the 64-bit TSS base
|
|
||||||
ushort iomap_base;
|
|
||||||
uchar iomap[IOMAP_SIZE];
|
|
||||||
|
|
||||||
} __attribute__ ((packed)) __attribute__((aligned(8)));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// The gdt pointer
|
|
||||||
struct GdtPtr_t
|
|
||||||
{
|
|
||||||
ushort limit; // upper 16 bits
|
|
||||||
ulong base; // address of the first entry
|
|
||||||
} __attribute__((__packed__));
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
|
||||||
|
|
||||||
//
|
|
||||||
// Initializes the memory map structure
|
|
||||||
//
|
|
||||||
void MmInitMemoryMap(void);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Initializes the memory map structure
|
|
||||||
//
|
|
||||||
void MmPrintMemoryMap(void);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Returns the size of the first available memory zone
|
|
||||||
// from the start address pointer
|
|
||||||
//
|
|
||||||
size_t MmGetAvailZoneSize(void *start);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Returns the first available memory zone from the start address pointer
|
|
||||||
//
|
|
||||||
void *MmGetFirstAvailZone(void *start);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Initializes the descriptor table
|
|
||||||
//
|
|
||||||
void MmInitGdt(void);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Loads the descriptor table
|
|
||||||
//
|
|
||||||
extern void MmLoadGdt(GdtPtr_t *gdtPtr, ushort tssOffset);
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Stores the descriptor table
|
|
||||||
//
|
|
||||||
extern void MmStoreGdt(void);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Paging misc
|
|
||||||
//
|
|
||||||
void MmInitPaging(void);
|
|
||||||
|
|
||||||
void MmActivatePageHandler(void);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Returns the address of the stack guard pages
|
|
||||||
//
|
|
||||||
void *MmGetStackGuards(char rank);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Translate a virtual address into physical address and the opposite
|
|
||||||
//
|
|
||||||
void *MmTransVirtToPhyAddr(void*);
|
|
||||||
void *MmTransPhyToVirtAddr(void* virtualAddr);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Set flags to a page
|
|
||||||
//
|
|
||||||
void MmSetPage(void* virtualAddr, ulong flags);
|
|
||||||
void MmUnSetPage(void* virtualAddr, ulong flags);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Map a page
|
|
||||||
//
|
|
||||||
void MmMapPage(void* virtualAddr, void* physicalAddr, ulong flags);
|
|
||||||
void MmUnmapPage(void* virtualAddr);
|
|
||||||
|
|
||||||
// Allocations
|
|
||||||
void *MmGetPhyPageBlock(size_t size, bool usermode);
|
|
||||||
|
|
||||||
// Page table entry
|
|
||||||
typedef ulong pte_t;
|
|
||||||
|
|
||||||
// Page directory offset
|
|
||||||
typedef pte_t* pde_t;
|
|
||||||
|
|
||||||
// Page directory pointer offset
|
|
||||||
typedef pde_t* pdpe_t;
|
|
||||||
|
|
||||||
// Page directory L4 pointer offset
|
|
||||||
typedef pdpe_t* pml4_t;
|
|
||||||
|
|
||||||
// paging.asm
|
|
||||||
void MmLoadPML4(void *);
|
|
||||||
void MmEnableWriteProtect(void);
|
|
||||||
void MmDisableWriteProtect(void);
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -22,7 +22,9 @@
|
||||||
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
#include <mm/mm.h>
|
#include <mm/gdt.h>
|
||||||
|
#include <mm/map.h>
|
||||||
|
#include <mm/paging.h>
|
||||||
#include <mm/heap.h>
|
#include <mm/heap.h>
|
||||||
#include <ke/idt.h>
|
#include <ke/idt.h>
|
||||||
#include <ke/time.h>
|
#include <ke/time.h>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
// GNU GPL OS/K //
|
// GNU GPL OS/K //
|
||||||
// //
|
// //
|
||||||
// Desc: Mapping and checking memory related functions //
|
// Desc: GDT related functions //
|
||||||
// //
|
// //
|
||||||
// //
|
// //
|
||||||
// Copyright © 2018-2019 The OS/K Team //
|
// Copyright © 2018-2019 The OS/K Team //
|
||||||
|
@ -22,7 +22,8 @@
|
||||||
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
#include <mm/mm.h>
|
#include <mm/gdt.h>
|
||||||
|
#include <mm/paging.h>
|
||||||
#include <init/boot.h>
|
#include <init/boot.h>
|
||||||
|
|
||||||
GdtPtr_t gdtPtr;
|
GdtPtr_t gdtPtr;
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
#include <mm/mm.h>
|
#include <mm/map.h>
|
||||||
#include <mm/heap.h>
|
#include <mm/heap.h>
|
||||||
#include <ex/lock.h>
|
#include <ex/lock.h>
|
||||||
#include <init/boot.h>
|
#include <init/boot.h>
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
#include <mm/mm.h>
|
#include <mm/map.h>
|
||||||
#include <init/boot.h>
|
#include <init/boot.h>
|
||||||
#include <init/mboot.h>
|
#include <init/mboot.h>
|
||||||
#include <io/vga.h>
|
#include <io/vga.h>
|
||||||
|
|
|
@ -1,8 +1,33 @@
|
||||||
|
//----------------------------------------------------------------------------//
|
||||||
|
// GNU GPL OS/K //
|
||||||
|
// //
|
||||||
|
// Desc: Paging memory related functions //
|
||||||
|
// //
|
||||||
|
// //
|
||||||
|
// Copyright © 2018-2019 The OS/K Team //
|
||||||
|
// //
|
||||||
|
// This file is part of OS/K. //
|
||||||
|
// //
|
||||||
|
// OS/K is free software: you can redistribute it and/or modify //
|
||||||
|
// it under the terms of the GNU General Public License as published by //
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or //
|
||||||
|
// any later version. //
|
||||||
|
// //
|
||||||
|
// OS/K is distributed in the hope that it will be useful, //
|
||||||
|
// but WITHOUT ANY WARRANTY//without even the implied warranty of //
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
||||||
|
// GNU General Public License for more details. //
|
||||||
|
// //
|
||||||
|
// You should have received a copy of the GNU General Public License //
|
||||||
|
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
#include <kernel.h>
|
#include <kernel.h>
|
||||||
#include <init/boot.h>
|
#include <init/boot.h>
|
||||||
#include <ex/malloc.h>
|
#include <ex/malloc.h>
|
||||||
#include <mm/heap.h>
|
#include <mm/heap.h>
|
||||||
#include <mm/mm.h>
|
#include <mm/paging.h>
|
||||||
|
#include <mm/map.h>
|
||||||
#include <ke/idt.h>
|
#include <ke/idt.h>
|
||||||
#include <lib/buf.h>
|
#include <lib/buf.h>
|
||||||
#include <io/vga.h>
|
#include <io/vga.h>
|
||||||
|
@ -292,52 +317,6 @@ void MmUnmapPage(void* virtualAddr)
|
||||||
KeFlushTlbSingle(*page);
|
KeFlushTlbSingle(*page);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Find a free block of pages
|
|
||||||
//
|
|
||||||
/* void *MmGetPhyPageBlock(size_t size, bool usermode) { */
|
|
||||||
/* void *startPhyPage = 0; */
|
|
||||||
/* void *endPhyPage = 0; */
|
|
||||||
/* ulong offset = 0; */
|
|
||||||
/* size_t curSize = 0; */
|
|
||||||
|
|
||||||
/* // Maximum PHYSICAL address in memory */
|
|
||||||
/* ulong phRamSize = memoryMap.freeRamSize + memoryMap.nonfreeRamSize; */
|
|
||||||
|
|
||||||
/* ulong curVirtAddr = 0; */
|
|
||||||
|
|
||||||
/* if (!usermode) { */
|
|
||||||
/* startPhyPage = MmTransVirtToPhyAddr((void*)KPAGESIZE); */
|
|
||||||
/* endPhyPage = (void*)MmPhysLastKernAddress; */
|
|
||||||
/* offset = 0; */
|
|
||||||
/* } else { */
|
|
||||||
/* startPhyPage = MmTransVirtToPhyAddr((void*)USERSPACE); */
|
|
||||||
/* endPhyPage = (void*)(phRamSize & ~(KPAGESIZE - 1)); */
|
|
||||||
/* offset = (ulong)USERSPACE - MmPhysLastKernAddress - KPAGESIZE; */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
/* DebugLog("Start phy at %p\n", startPhyPage); */
|
|
||||||
/* DebugLog("End phy at %p\n", endPhyPage); */
|
|
||||||
|
|
||||||
/* for (ulong curPhyAddr = (ulong)startPhyPage; */
|
|
||||||
/* curPhyAddr <= (ulong)endPhyPage; */
|
|
||||||
/* curPhyAddr += KPAGESIZE) { */
|
|
||||||
/* curVirtAddr = (ulong)MmTransPhyToVirtAddr((void*)curPhyAddr); */
|
|
||||||
|
|
||||||
|
|
||||||
/* if (curVirtAddr == 0) { */
|
|
||||||
/* DebugLog("CurrentAddr %p\n", curPhyAddr); */
|
|
||||||
/* DebugLog("\t Free !\n"); */
|
|
||||||
/* curSize += KPAGESIZE; */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
/* if (curSize >= size) */
|
|
||||||
/* break; */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
/* return NULL; */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -23,7 +23,8 @@
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
#include <vers.h>
|
#include <vers.h>
|
||||||
#include <mm/mm.h>
|
#include <mm/paging.h>
|
||||||
|
#include <mm/map.h>
|
||||||
#include <io/ata.h>
|
#include <io/ata.h>
|
||||||
#include <io/vga.h>
|
#include <io/vga.h>
|
||||||
#include <io/spkr.h>
|
#include <io/spkr.h>
|
||||||
|
|
|
@ -23,7 +23,8 @@
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
#include <vers.h>
|
#include <vers.h>
|
||||||
#include <mm/mm.h>
|
#include <mm/paging.h>
|
||||||
|
#include <mm/map.h>
|
||||||
#include <io/ata.h>
|
#include <io/ata.h>
|
||||||
#include <io/vga.h>
|
#include <io/vga.h>
|
||||||
#include <io/spkr.h>
|
#include <io/spkr.h>
|
||||||
|
@ -255,7 +256,7 @@ error_t CmdPageBlock(int argc, char **argv, char *cmdline)
|
||||||
size_t size = (size_t)atoi(argv[1]);
|
size_t size = (size_t)atoi(argv[1]);
|
||||||
bool usermode = (bool)atoi(argv[2]);
|
bool usermode = (bool)atoi(argv[2]);
|
||||||
|
|
||||||
MmGetPhyPageBlock(size, usermode);
|
//MmGetPhyPageBlock(size, usermode);
|
||||||
|
|
||||||
return EOK;
|
return EOK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue