This commit is contained in:
2021-09-14 18:35:52 +03:00
parent f052f2294e
commit d605c6a016
84 changed files with 3647 additions and 1192 deletions

View File

@ -22,4 +22,24 @@ void pt_entry_add_attrib (pt_entry* entry, unsigned mask) {
unsigned char pt_entry_is_writable (pt_entry entry) {
return (entry & _I86_PTE_WRITABLE);
}
}
/*#include <conio.h>
void pt_entry_print(pt_entry entry)
{
cprintf ("page <FRAME=%u", entry & _I86_PTE_FRAME);
if (entry & _I86_PTE_PRESENT) cprintf (" PRESENT");
if (entry & _I86_PTE_WRITABLE) cprintf (" WRITABLE");
if (entry & _I86_PTE_USER) cprintf (" USER");
if (entry & _I86_PTE_WRITETHROUGH) cprintf (" WRITETHROUGH");
if (entry & _I86_PTE_NOT_CACHEABLE) cprintf (" NOT-CACHEABLE");
if (entry & _I86_PTE_ACCESSED) cprintf (" ACCESSED");
if (entry & _I86_PTE_DIRTY) cprintf (" DIRTY");
if (entry & _I86_PTE_PAT) cprintf (" PAT");
if (entry & _I86_PTE_CPU_GLOBAL) cprintf (" CPU-GLOBAL");
if (entry & _I86_PTE_LV4_GLOBAL) cprintf (" LV4-GLOBAL");
cprintf(">");
}*/

View File

@ -24,4 +24,6 @@ extern unsigned pt_entry_get_frame (pt_entry entry);
extern unsigned char pt_entry_is_present (pt_entry entry);
extern unsigned char pt_entry_is_writable (pt_entry entry);
extern void pt_entry_print(pt_entry entry);
#endif

View File

@ -21,6 +21,7 @@ _read_cr3:
global _write_cr3
_write_cr3:
;xchg bx, bx ; bochs magic breakpoint
push ebp
mov ebp, esp
mov eax, [ebp+8]
@ -34,4 +35,4 @@ _vmmngr_flush_tbl_entry:
cli
invlpg [eax]
sti
retn
retn

View File

@ -1,6 +1,9 @@
/******************************************************
* Physical Memory Manager *
******************************************************/
/*********************************************************************
* (c) 2010 CTA Systems Inc. All rights reserved. Glory To God *
* *
* Physical Memory Manager *
* ======================= *
************************************************************ cta os */
// +==============================================+
// | HEADERS |
@ -129,7 +132,7 @@ void mstack_qsort(int beg, int end)
/*void print_stack()
{
int i;
for (i = 0; i < _mmngr_index; i++) printf (" %u", _mmngr_memory_stack[i].low);
for (i = 0; i < _mmngr_index; i++) \n\r (" %u", _mmngr_memory_stack[i].low);
}
extern char getch();*/
@ -285,15 +288,15 @@ void* pmmngr_alloc_blocks (unsigned blocks)
unsigned prev = _mmngr_memory_stack[i].low | (_mmngr_memory_stack[i].high<<16); --i;
// Search consecutive blocks
for (; i >=0; i--) {
for (i = 0; i < _mmngr_index; i++) {
temp = _mmngr_memory_stack[i].low | (_mmngr_memory_stack[i].high<<16);
if (temp == prev-1) l++;
if (temp == prev+1) l++;
else l = 1;
if (l == blocks) {
pmmngr_deinit_region (temp * PMMNGR_BLOCK_SIZE, blocks * PMMNGR_BLOCK_SIZE);
return (void*) (temp * PMMNGR_BLOCK_SIZE);
return (void*) ((temp-l+1) * PMMNGR_BLOCK_SIZE);
}
prev = temp;

View File

@ -5,16 +5,18 @@
#include "mmngr_ph.h"
// +==============================================+
// | DEFINITIONS |
// | DEFINITIONS & MACROS |
// +===================================== cta os =+
#define PAGE_SIZE 4096
#define PTABLE_ADDR_SPACE_SIZE 0x400000
#define DTABLE_ADDR_SPACE_SIZE 0xffffffff
#define PAGE_DIRECTORY_INDEX(x) (((x) >> 22) & 0x3ff)
#define PAGE_TABLE_INDEX(x) (((x) >> 12) & 0x3ff)
#define PAGE_GET_PHYSICAL_ADDRESS(x) (*x & ~0xfff)
pdirectory* _current_directory;
unsigned _current_page_directory_base_register;
extern unsigned char *memset (unsigned char *dest, unsigned char val, int count);
extern char getch();
// +==============================================+
// | PAGE FUNCTIONS |
@ -95,39 +97,88 @@ pdirectory* vmmngr_get_directory() {
return _current_directory;
}
void vmmngr_initialize()
unsigned char vmmngr_map_page (unsigned phys, unsigned virt)
{
// Allocate default page table
ptable* table = (ptable*) pmmngr_alloc_block();
if (!table) return;
pdirectory* dir = _current_directory; // get page directory
pd_entry* e = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt)]; // get page table
// Clear page table
if ((*e & _I86_PTE_PRESENT) != _I86_PTE_PRESENT) {
// Page table not present, allocate it
ptable* table = (ptable *)pmmngr_alloc_block();
if (!table) return 0;
// Clear it
vmmngr_ptable_clear(table);
// Create new entry
pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt)];
// Map in the table
pd_entry_add_attrib (entry, _I86_PDE_PRESENT);
pd_entry_add_attrib (entry, _I86_PDE_WRITABLE);
pd_entry_set_frame (entry, (unsigned) table);
}
// get table
ptable* table = (ptable*) PAGE_GET_PHYSICAL_ADDRESS(e);
// get page
pt_entry* page = &table->m_entries [PAGE_TABLE_INDEX (virt)];
pt_entry_set_frame (page, phys);
pt_entry_add_attrib (page, _I86_PTE_PRESENT);
return 1;
}
unsigned char vmmngr_initialize()
{
unsigned int i, virt, frame;
// Allocate default page & directory table(s)
ptable* table = (ptable*) pmmngr_alloc_block();
ptable* table2 = (ptable*) pmmngr_alloc_block();
pdirectory* dir = (pdirectory*) pmmngr_alloc_blocks(3);
if (!table || !table2 || !dir) return 0;
// Clear page & directory tables
vmmngr_ptable_clear(table);
vmmngr_ptable_clear(table2);
vmmngr_pdirectory_clear(dir);
// Identity map the first page table
int i, frame;
for (i = 0, frame = 0; i < 1024; i++, frame += 4096)
virt = 0; frame = 0;
for (i = 0; i < 1024; i++, virt+=4096, frame += 4096)
{
// Create a new page
pt_entry page = 0;
pt_entry_add_attrib (&page, _I86_PTE_PRESENT);
pt_entry_set_frame (&page, frame);
table->m_entries[vmmngr_ptable_virt_to_index(frame)] = page;
pt_entry* page = &table2->m_entries[PAGE_TABLE_INDEX(virt)];
*page = 0;
pt_entry_add_attrib (page, _I86_PTE_PRESENT);
pt_entry_set_frame (page, frame);
}
// Create default directory table
pdirectory* dir = (pdirectory*) pmmngr_alloc_blocks(3);
if (!dir) return;
// Clear directory table and set it as current
vmmngr_pdirectory_clear(dir);
// Get first entry in dir table and set it up to point to our table
pd_entry* entry = vmmngr_pdirectory_lookup_entry(dir, 0);
// Map 0x100000 to 0xC0000000
virt = 0xC0000000; frame = 0x100000;
for (i = 0; i < 1024; i++, virt+=4096, frame += 4096)
{
pt_entry* page = &table->m_entries[PAGE_TABLE_INDEX(virt)];
*page = 0;
pt_entry_add_attrib (page, _I86_PTE_PRESENT);
pt_entry_set_frame (page, frame);
}
// Get tables in dir table and point them to our tables
pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (0xC0000000)];
pd_entry_add_attrib (entry, _I86_PDE_PRESENT);
pd_entry_add_attrib (entry, _I86_PDE_WRITABLE);
pd_entry_set_frame (entry, (unsigned) table);
entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (0x00000000)];
pd_entry_add_attrib (entry, _I86_PDE_PRESENT);
pd_entry_add_attrib (entry, _I86_PDE_WRITABLE);
pd_entry_set_frame (entry, (unsigned) table2);
// Store current PDBR
_current_page_directory_base_register = (unsigned) &dir->m_entries;
@ -137,4 +188,6 @@ void vmmngr_initialize()
// Enable paging
pmmngr_paging_enable (1);
return 1;
}

View File

@ -20,6 +20,7 @@ typedef struct {
//extern pdirectory* _current_directory;
extern void vmmngr_flush_tbl_entry (unsigned addr);
extern void vmmngr_initialize();
extern unsigned char vmmngr_initialize();
extern unsigned char vmmngr_map_page(unsigned phys, unsigned virt);
#endif