Assignment 4 p1 completed

This commit is contained in:
Teodor
2026-04-14 21:33:21 +00:00
parent cad047a927
commit 9d6c378ac7
8 changed files with 483 additions and 0 deletions

View File

@@ -0,0 +1,164 @@
# Assignment 4 Part 1: Memory Management
## Overview
In this part of the assignment, a basic memory management system was implemented for a simple OS kernel. The goal was to initialize kernel memory, enable paging, and implement dynamic memory allocation using `malloc()` and `free()`.
---
## Implemented Features
### Kernel Memory Initialization
- Used:
```c
extern uint32_t end;
```
to get the end address of the kernel from the linker.
- Implemented:
```c
init_kernel_memory(&end);
```
- Set up:
- `heap_begin`
- `heap_end`
- `pheap_begin` (page-aligned heap)
- `pheap_end`
---
### Paging
- Implemented:
```c
init_paging();
```
- Set up:
- Page directory at `0x400000`
- Page tables starting at `0x404000`
- Identity-mapped:
- `0x00000000 → 0x00000000`
- `0x400000 → 0x400000`
- Enabled paging by modifying `cr0` and `cr3`.
---
### Dynamic Memory Allocation
#### malloc()
- Implemented a simple heap allocator.
- Stores metadata using:
```c
typedef struct {
uint8_t status;
uint32_t size;
} alloc_t;
```
- Supports:
- Sequential allocation
- Reuse of freed blocks
- Zeroes allocated memory using `memset`.
---
#### free()
- Frees memory by marking the block as unused.
- Prevents errors by:
```c
if (!mem) return;
```
- Correctly updates `memory_used`.
---
#### Block Reuse
- When a block is freed, it can be reused by future `malloc()` calls.
- Verified by:
- Freeing a block
- Allocating a smaller block
- Observing same address reused
---
### Page-Aligned Allocation (pmalloc)
- Implemented `pmalloc()` and `pfree()`:
- Allocates memory in 4KB pages
- Uses a descriptor array (`pheap_desc`)
- Located in upper memory region near `0x400000`
---
### Memory Utility Functions
Implemented:
- `memcpy()`
- `memset()`
- `memset16()`
These replace standard library functions in kernel space.
---
### Debug Output
#### Memory Layout
- Implemented:
```c
print_memory_layout();
```
- Displays:
- Memory used
- Memory free
- Heap size
- Heap start/end
- Page heap start/end
#### Allocation Logs
- Outputs allocation details:
```
Allocated X bytes from 0x... to 0x...
Re-allocated X bytes from 0x... to 0x...
```
---
### Hex Output for Addresses
- Implemented:
```c
TerminalWriteHex(uint32_t num);
```
- Ensures correct formatting of memory addresses (base 16)
- Avoids confusion from decimal output
---
## Testing & Verification
### Allocation Test
```c
void* memory1 = malloc(48261);
void* memory2 = malloc(27261);
void* memory3 = malloc(12617);
```
### Free and Reuse Test
```c
free(memory2);
void* memory4 = malloc(1000);
```
### Result
- `memory4` reused the same address as `memory2`
- Confirms:
- `free()` works
- allocator reuses memory correctly
---
## Conclusion
- Successfully implemented a basic kernel memory manager
- Paging is enabled and functioning
- `malloc()` and `free()` work correctly
- Memory reuse is verified
- Debug output is clear and correctly formatted
---
## Next Step
Proceed to **Part 2: PIT and Sleep Functions**