Skip to content

Commit db0e870

Browse files
committed
Add some reserved space in memory for a nonpaged pool.
Fix DEBUG_MEM #define for kmalloc/kfree. Send memory debugging output to COM1 (for the simple debugger). Note: This experimental branch is still broken for now.
1 parent e593344 commit db0e870

File tree

7 files changed

+60
-22
lines changed

7 files changed

+60
-22
lines changed

MyOS_1/Build_Number.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
// Define a build number. This number will be incremented by a simple console program called by a post-build event
44
// It's put here in its own file to keep the other program from messing up the source
55
#define \
6-
BUILD_NUMBER 6563
6+
BUILD_NUMBER 6605

MyOS_1/kmisc.c

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
#include "paging.h"
22
#include "printf.h"
3+
#include "Interrupts\System_Calls.h"
34
#include "kmisc.h"
45
#include "misc.h"
6+
#include "Console_Serial.h"
7+
#include "Tasks/Context.h"
58

69
// Functions used by the kernel & drivers
710

@@ -20,10 +23,10 @@ unsigned int knextFreeMemorySlot = 0;
2023

2124
#ifdef DEBUG_MEM
2225
#define noFileName "FILENAME NOT SET";
23-
char *dbgMemFilename = noFileName;
24-
int dbgMemLineNumber = 0;
25-
char *dbgFreeFilename = noFileName;
26-
int dbgFreeLineNumber = 0;
26+
char *dbgkMemFilename = noFileName;
27+
int dbgkMemLineNumber = 0;
28+
char *dbgkFreeFilename = noFileName;
29+
int dbgkFreeLineNumber = 0;
2730
#endif
2831

2932
inline void addAllocationToKFreeMemoryArray(int allocationIndex)
@@ -40,6 +43,16 @@ inline void addAllocationToKFreeMemoryArray(int allocationIndex)
4043
kfreeMemoryArray.inUse[knextFreeMemorySlot++] = true;
4144
}
4245

46+
#ifdef DEBUG_MEM
47+
void *dbg_kmalloc(size_t size, char *filename, int lineNumber)
48+
{
49+
dbgkMemFilename = filename;
50+
dbgkMemLineNumber = lineNumber;
51+
serial_printf("Allocating %d bytes from %s, line %d for %s\n", size, filename, lineNumber, tasks[currentTask].imageName);
52+
return kmalloc(size);
53+
}
54+
#endif
55+
4356
// Allocate some kernel memory. Mostly this is meant to be used by drivers.
4457
// This will be mapped into every tasks page space and will be allocated contiguously
4558
// TODO: Is it better to have this crazy scheme with the two functions, or just modify malloc to make sure
@@ -54,10 +67,10 @@ void* kmalloc(size_t size)
5467
}
5568

5669
#ifdef DEBUG_MEM
57-
kallocationArray.lineNumber[knextAllocationSlot] = dbgMemLineNumber;
58-
strncpy(kallocationArray.filename[knextAllocationSlot], dbgMemFilename, MAX_DEBUG_FILENAME_LENGTH);
59-
dbgMemFilename = noFileName;
60-
dbgMemLineNumber = 0;
70+
kallocationArray.lineNumber[knextAllocationSlot] = dbgkMemLineNumber;
71+
strncpy(kallocationArray.filename[knextAllocationSlot], dbgkMemFilename, MAX_DEBUG_FILENAME_LENGTH);
72+
dbgkMemFilename = noFileName;
73+
dbgkMemLineNumber = 0;
6174
#endif
6275

6376
// See if there's freed memory available to reallocate (first fit algorithm; memory will end up wasted)
@@ -145,6 +158,16 @@ void* kmalloc(size_t size)
145158
return (void *)availableAddress;
146159
}
147160

161+
#ifdef DEBUG_MEM
162+
void dbg_kfree(void *ptr, char *filename, int lineNumber)
163+
{
164+
dbgkFreeFilename = filename;
165+
dbgkFreeLineNumber = lineNumber;
166+
serial_printf("Freeing mem from %s, line %d for %s\n", filename, lineNumber, tasks[currentTask].imageName);
167+
kfree(ptr);
168+
}
169+
#endif
170+
148171
void kfree(void *ptr)
149172
{
150173
// Find this pointer in the allocation array
@@ -179,9 +202,9 @@ void kfree(void *ptr)
179202

180203
kprintf("free() called with invalid pointer: 0x%lX", ptr);
181204
#ifdef DEBUG_MEM
182-
printf(" from %s, line %d\n", dbgFreeFilename, dbgFreeLineNumber);
183-
dbgFreeFilename = noFileName;
184-
dbgFreeLineNumber = 0;
205+
printf(" from %s, line %d\n", dbgkFreeFilename, dbgkFreeLineNumber);
206+
dbgkFreeFilename = noFileName;
207+
dbgkFreeLineNumber = 0;
185208
//for (;;)
186209
// __halt();
187210
#else

MyOS_1/misc.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "Interrupts/Interrupts.h"
88
#include "Console_Serial.h"
99
#include <float.h>
10+
#include "Tasks/Context.h"
1011

1112
uint32_t pagedMemoryAvailable = 0;
1213
uint32_t memoryNextAvailableAddress = 0;
@@ -64,6 +65,7 @@ void dbg_free(void *ptr, char *filename, int lineNumber)
6465
{
6566
dbgFreeFilename = filename;
6667
dbgFreeLineNumber = lineNumber;
68+
serial_printf("Freeing mem from %s, line %d for %s\n", filename, lineNumber, tasks[currentTask].imageName);
6769
free(ptr);
6870
}
6971
#endif
@@ -136,6 +138,10 @@ void* realloc(void* ptr, size_t size)
136138

137139
void *ptrNew = malloc(size);
138140

141+
#ifdef MYOS_KERNEL
142+
serial_printf("realloc called\n");
143+
#endif
144+
139145
// Find ptr in allocation array
140146
int index;
141147
for (index = 0; index < MAX_ALLOCATIONS; ++index)
@@ -383,6 +389,7 @@ void *dbg_malloc(size_t size, char *filename, int lineNumber)
383389
{
384390
dbgMemFilename = filename;
385391
dbgMemLineNumber = lineNumber;
392+
serial_printf("Allocating %d bytes from %s, line %d for %s\n", size, filename, lineNumber, tasks[currentTask].imageName);
386393
return malloc(size);
387394
}
388395
#endif

MyOS_1/misc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ extern "C" {
1111
#include "kmisc.h"
1212
#endif
1313

14-
//#define DEBUG_MEM
14+
#define DEBUG_MEM
1515

1616
#ifdef DEBUG_MEM
1717
#define MAX_DEBUG_FILENAME_LENGTH 24

MyOS_1/paging.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ uint32_t *pageDir;
1717

1818
uint32_t pagingNextAvailableMemory; // physical address of the next available page
1919
uint32_t pagingNextAvailableKernelPage; // The index into the page directory where the next kernel page can go
20+
uint32_t pagingKernelNonPagedArea; // A page (4MiB) of non-paged, identity-mapped memory drivers can use (non-paged pool)
2021
uint32_t paging4MPagesAvailable; // number of 4M physical memory pages available to be mapped
2122

2223
uint32_t nextPageDirectory; // TEMPTEMP where the next created page directory will be stored

MyOS_1/paging.h

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ extern uint32_t *pageDir;
2828

2929
extern uint32_t pagingNextAvailableMemory;
3030
extern uint32_t pagingNextAvailableKernelPage;
31+
extern uint32_t pagingKernelNonPagedArea;
3132
extern uint32_t paging4MPagesAvailable;
3233
extern uint32_t nextPageDirectory; // TEMPTEMP
3334

@@ -74,9 +75,12 @@ inline void Paging_Enable(multiboot_info *multibootInfo)
7475
// Identity map the next four megs (this is used by the GUI shell)
7576
pageDirectory[3] = (PAGE_DIRECTORY_ENTRY)((uint32_t)0xC00000 | DIRECTORY_ENTRY_PRESENT | DIRECTORY_ENTRY_WRITABLE | DIRECTORY_ENTRY_4MB | DIRECTORY_ENTRY_USER_ACCESSIBLE);
7677

77-
// Identity map the next four megs
78+
// Identity map the next four megs (this is used for applications' page tables)
7879
pageDirectory[4] = (PAGE_DIRECTORY_ENTRY)((uint32_t)0x1000000 | DIRECTORY_ENTRY_PRESENT | DIRECTORY_ENTRY_WRITABLE | DIRECTORY_ENTRY_4MB | DIRECTORY_ENTRY_USER_ACCESSIBLE);
7980

81+
// Another 4 megs - this one is used by the non-paged pool (for drivers)
82+
pageDirectory[5] = (PAGE_DIRECTORY_ENTRY)((uint32_t)0x1400000 | DIRECTORY_ENTRY_PRESENT | DIRECTORY_ENTRY_WRITABLE | DIRECTORY_ENTRY_4MB | DIRECTORY_ENTRY_USER_ACCESSIBLE);
83+
8084
// Map the kernel (4 megs starting at 0x10 0000) to 0xC000 0000
8185
for (i = 0; i < 1024; ++i)
8286
{
@@ -125,20 +129,23 @@ inline void Paging_Enable(multiboot_info *multibootInfo)
125129
// save a pointer to pageDirectory
126130
pageDir = pageDirectory;
127131

128-
// determine available pages
129-
pagingNextAvailableMemory = FOUR_MEGABYTES * 5; // TEMP: Next available page will (likely) start at 20 Megs
130-
// We'll assume we have 64 megs available
131-
paging4MPagesAvailable = 16; // TODO: Calculate based on the memory map Grub gave us
132-
133132
// TEMPTEMP: put page directories between 16 - 20 megs
134133
nextPageDirectory = FOUR_MEGABYTES * 4;
135134

135+
// TEMPTEMP: put a non-paged pool of memory between 20 - 24 megs
136+
pagingKernelNonPagedArea = FOUR_MEGABYTES * 5;
137+
136138
// Walk through the mem map grub gave us
137139
// TODO: Assert that grub gave us a memory map
138140
// TODO: Don't assume we have memory at the beginning of RAM
139141
// TODO: Use all the entries we get from GRUB
140142
multiboot_mmap_entry *entry = (multiboot_mmap_entry *)multibootInfo->mmap_addr;
141-
143+
144+
// determine available pages
145+
pagingNextAvailableMemory = FOUR_MEGABYTES * 6; // TEMP: Next available page will (likely) start at 24 Megs
146+
// We'll assume we have 64 megs available
147+
//paging4MPagesAvailable = 16; // TODO: Calculate based on the memory map Grub gave us
148+
142149
// examine each mmap entry
143150
for (uint32_t offset = 0; offset <= multibootInfo->mmap_length && entry->size; offset += entry->size + 4)
144151
{
@@ -150,10 +157,10 @@ inline void Paging_Enable(multiboot_info *multibootInfo)
150157
// determine how many pages we really have available
151158
uint64_t addrEnd = entry->addr + entry->len;
152159
uint64_t bytesAvailable = addrEnd - pagingNextAvailableMemory;
153-
paging4MPagesAvailable = bytesAvailable / FOUR_MEGABYTES;
160+
paging4MPagesAvailable = (uint32_t)(bytesAvailable / (uint64_t)FOUR_MEGABYTES);
154161
return;
155162
}
156-
}
163+
}
157164

158165
// advance pointer to next entry
159166
entry = (multiboot_mmap_entry*)((uint32_t)entry + entry->size + 4);

Release/MyOS_1.dll

449 KB
Binary file not shown.

0 commit comments

Comments
 (0)