Skip to content

Commit 8295528

Browse files
committed
started to implement kernel heap
1 parent d77b07b commit 8295528

File tree

31 files changed

+368
-138
lines changed

31 files changed

+368
-138
lines changed

mckrnl/core/devices/font.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <memory/vmm.h>
1+
#include <memory/heap.h>
22
#include <devices/font.h>
33
#include <assert.h>
44
#include <string.h>
@@ -26,8 +26,8 @@ char* font_file_name(struct devfs_file* dfile) {
2626
}
2727

2828
devfs_file_t* get_font_file(int font_size, void* font_pointer) {
29-
font_file_t* file = vmm_alloc(TO_PAGES(sizeof(font_file_t)));
30-
29+
font_file_t* file = kmalloc(sizeof(font_file_t));
30+
3131
file->file.read = font_file_read;
3232
file->file.prepare = font_file_prepare;
3333
file->file.name = font_file_name;

mckrnl/core/devices/nic.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#include <devices/nic.h>
2-
#include <memory/vmm.h>
2+
#include <memory/heap.h>
33
#include <driver/disk_driver.h>
44
#include <stdio.h>
55
#include <assert.h>
@@ -57,7 +57,7 @@ char* nic_file_name(devfs_file_t* file) {
5757

5858

5959
devfs_file_t* create_nic_file(nic_driver_t* nic, int id) {
60-
nic_file_t* nic_file = vmm_alloc(TO_PAGES(sizeof(nic_file_t)));
60+
nic_file_t* nic_file = kmalloc(sizeof(nic_file_t));
6161
memset(nic_file, 0, sizeof(nic_file_t));
6262

6363
nic_file->nic = nic;

mckrnl/core/driver/char_input_driver.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <fs/vfs.h>
66
#include <stdio.h>
77
#include <utils/string.h>
8-
#include <memory/vmm.h>
8+
#include <memory/heap.h>
99
#include <assert.h>
1010
#include <config.h>
1111

@@ -51,7 +51,7 @@ void init_keymap(char* path) {
5151
if (!file) {
5252
abortf(false, "Failed to open keymap: %s", path);
5353
}
54-
loaded_keymap = vmm_alloc(TO_PAGES(file->size));
54+
loaded_keymap = kmalloc(file->size);
5555
vfs_read(file, loaded_keymap, file->size, 0);
5656
vfs_close(file);
5757

mckrnl/core/driver/disk/virtual_disk.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include <driver/disk/virtual_disk.h>
22

3-
#include <memory/vmm.h>
3+
#include <memory/heap.h>
44
#include <string.h>
55

66
bool virtual_disk_is_device_present(driver_t* driver) {
@@ -30,8 +30,8 @@ void virtual_disk_flush(disk_driver_t* driver) {
3030
}
3131

3232
disk_driver_t* get_virtual_disk_driver(disk_driver_t* disk, uint64_t lba_offset) {
33-
disk_driver_t* driver = (disk_driver_t*) vmm_alloc(1);
34-
memset(driver, 0, 0x1000);
33+
disk_driver_t* driver = (disk_driver_t*) kmalloc(sizeof(disk_driver_t));
34+
memset(driver, 0, sizeof(disk_driver_t));
3535

3636
driver->driver.is_device_present = virtual_disk_is_device_present;
3737
driver->driver.get_device_name = virtual_disk_get_device_name;
@@ -43,7 +43,7 @@ disk_driver_t* get_virtual_disk_driver(disk_driver_t* disk, uint64_t lba_offset)
4343

4444
driver->physical = false;
4545

46-
driver->driver.driver_specific_data = driver + sizeof(disk_driver_t);
46+
driver->driver.driver_specific_data = kmalloc(sizeof(virtual_disk_driver_data_t));
4747

4848
virtual_disk_driver_data_t* data = (virtual_disk_driver_data_t*) driver->driver.driver_specific_data;
4949

mckrnl/core/driver/nic_driver.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include <net/stack.h>
33
#include <stdint.h>
44
#include <stdio.h>
5-
#include <memory/vmm.h>
5+
#include <memory/heap.h>
66
#include <stddef.h>
77
#include <string.h>
88
#include <config.h>
@@ -13,7 +13,7 @@ nic_driver_t** nic_drivers = NULL;
1313
int num_nic_drivers = 0;
1414

1515
void register_nic_driver(nic_driver_t* driver) {
16-
nic_drivers = vmm_resize(sizeof(nic_driver_t*), num_nic_drivers, num_nic_drivers + 1, nic_drivers);
16+
nic_drivers = krealloc(nic_drivers, sizeof(nic_driver_t*) * (num_nic_drivers + 1));
1717
nic_drivers[num_nic_drivers] = driver;
1818
num_nic_drivers++;
1919
}
@@ -37,12 +37,12 @@ void send_async_send_packet(async_t* async) {
3737

3838
send_data->driver->send(send_data->driver, async, send_data->data, send_data->len);
3939
if (is_resolved(async)) {
40-
vmm_free(send_data, TO_PAGES(sizeof(send_data_t) + send_data->len));
40+
kfree(send_data);
4141
}
4242
}
4343

4444
void send_packet(nic_driver_t* driver, uint8_t* data, uint32_t len) {
45-
uint8_t* copy = vmm_alloc(TO_PAGES(sizeof(send_data_t) + len));
45+
uint8_t* copy = kmalloc(sizeof(send_data_t) + len);
4646

4747
send_data_t* send_data = (send_data_t*) copy;
4848
uint8_t* packet_data = copy + sizeof(send_data_t);

mckrnl/core/fs/devfs.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <fs/devfs.h>
22
#include <stdio.h>
33
#include <string.h>
4-
#include <memory/vmm.h>
4+
#include <memory/heap.h>
55

66
file_t* devfs_open(vfs_mount_t* mount, char* path, int flags) {
77
devfs_t* devfs = (devfs_t*) mount;
@@ -14,7 +14,7 @@ file_t* devfs_open(vfs_mount_t* mount, char* path, int flags) {
1414

1515
for (int i = 0; i < devfs->num_files; i++) {
1616
if (strcmp(devfs->files[i]->name(devfs->files[i]), path) == 0) {
17-
file_t* f = (file_t*) vmm_alloc(1);
17+
file_t* f = (file_t*) kmalloc(sizeof(file_t));
1818
f->mount = mount;
1919
f->size = -1;
2020
f->driver_specific_data = devfs->files[i];
@@ -30,7 +30,7 @@ file_t* devfs_open(vfs_mount_t* mount, char* path, int flags) {
3030
}
3131

3232
void devfs_close(vfs_mount_t* mount, file_t* file) {
33-
vmm_free(file, 1);
33+
kfree(file);
3434
}
3535

3636
void devfs_read(vfs_mount_t* mount, file_t* file, void* buf, size_t size, size_t offset) {
@@ -83,7 +83,7 @@ devfs_t global_devfs = {
8383

8484
void devfs_register_file(devfs_t* devfs, devfs_file_t* file) {
8585
debugf("Registering devfs file %s!", file->name(file));
86-
devfs->files = vmm_resize(sizeof(devfs_file_t*), devfs->num_files, devfs->num_files + 1, devfs->files);
86+
devfs->files = krealloc(devfs->files, sizeof(devfs_file_t*) * (devfs->num_files + 1));
8787
devfs->files[devfs->num_files] = file;
8888
devfs->num_files++;
8989
}

mckrnl/core/fs/gpt.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
#include <fs/gpt.h>
22

3-
#include <memory/vmm.h>
3+
#include <memory/heap.h>
44
#include <stdio.h>
55
#include <string.h>
66
#include <driver/disk/virtual_disk.h>
77

88
bool read_gpt(disk_driver_t* disk) {
9-
struct gpt_header* header = (struct gpt_header*) vmm_alloc(1);
9+
struct gpt_header* header = (struct gpt_header*) kmalloc(512);
1010
disk->read(disk, 1, 1, (void*) header);
1111

1212
if (memcmp(header->signature, "EFI PART", 8) != 0) {
13-
vmm_free(header, 1);
13+
kfree(header);
1414
return false;
1515
} else {
16-
struct gpt_partition_entry* entries = (struct gpt_partition_entry*) vmm_alloc(((header->partition_entries_size * header->partition_entries_count) / 4096) + 1);
17-
disk->read(disk, header->partition_entries_startting_lba, ((header->partition_entries_size * header->partition_entries_count) / 512 ) + 1, (void*) entries);
16+
int sectors = ((header->partition_entries_size * header->partition_entries_count) / 512) + 1;
17+
struct gpt_partition_entry* entries = (struct gpt_partition_entry*) kmalloc(sectors * 512);
18+
disk->read(disk, header->partition_entries_startting_lba, sectors, (void*) entries);
1819

1920
for (int i = 0; i < header->partition_entries_count; i++) {
2021
if (entries[i].type_guid.data1 == 0) {
@@ -27,8 +28,8 @@ bool read_gpt(disk_driver_t* disk) {
2728
}
2829

2930

30-
vmm_free(entries, ((header->partition_entries_size * header->partition_entries_count) / 4096) + 1);
31-
vmm_free(header, 1);
31+
kfree(entries);
32+
kfree(header);
3233
return true;
3334
}
3435
}

mckrnl/core/fs/initrd.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <fs/initrd.h>
22

33
#include <stdio.h>
4-
#include <memory/vmm.h>
4+
#include <memory/heap.h>
55
#include <utils/string.h>
66
#include <assert.h>
77

@@ -52,7 +52,7 @@ file_t* initrd_open(vfs_mount_t* mount, char* path, int flags) {
5252

5353
saf_node_file_t* file_node = (saf_node_file_t*) file;
5454

55-
file_t* f = (file_t*) vmm_alloc(1);
55+
file_t* f = (file_t*) kmalloc(sizeof(file_t));
5656
f->mount = mount;
5757
f->size = file_node->size;
5858
f->driver_specific_data = (void*) ((uint32_t) mount->driver_specific_data + (uint32_t) file_node->addr);
@@ -61,7 +61,7 @@ file_t* initrd_open(vfs_mount_t* mount, char* path, int flags) {
6161
}
6262

6363
void initrd_close(vfs_mount_t* mount, file_t* f) {
64-
vmm_free(f, 1);
64+
kfree(f);
6565
}
6666

6767
void initrd_read(vfs_mount_t* mount, file_t* f, void* buffer, size_t size, size_t offset) {
@@ -120,7 +120,7 @@ dir_t initrd_dir_at(vfs_mount_t* mount, int idx, char* path) {
120120
}
121121

122122
vfs_mount_t* initrd_mount(void* saf_image) {
123-
vfs_mount_t* mount = (vfs_mount_t*) vmm_alloc(1);
123+
vfs_mount_t* mount = (vfs_mount_t*) kmalloc(sizeof(vfs_mount_t));
124124
memset(mount, 0, sizeof(vfs_mount_t));
125125

126126
mount->driver_specific_data = saf_image;

mckrnl/core/include/memory/heap.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#pragma once
2+
3+
#include <stddef.h>
4+
#include <stdbool.h>
5+
6+
#define MB(x) ((x) * 1024 * 1024)
7+
8+
typedef struct heap_segment_header {
9+
size_t length;
10+
struct heap_segment_header* next;
11+
struct heap_segment_header* last;
12+
13+
bool free;
14+
15+
} heap_segment_header_t;
16+
17+
void* kmalloc(size_t size);
18+
void* krealloc(void* ptr, size_t size);
19+
void kfree(void* address);
20+
void* kcalloc(size_t count, size_t size);
21+
22+
void initialize_heap(size_t page_count);

mckrnl/core/init.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <scheduler/killer.h>
1515
#include <memory/pmm.h>
1616
#include <memory/vmm.h>
17+
#include <memory/heap.h>
1718

1819
#include <driver/output/serial.h>
1920
#include <driver/clock/cmos.h>
@@ -106,10 +107,10 @@ void load_init() {
106107
if (file == NULL) {
107108
abortf(false, "Could not open %s", init_exec);
108109
}
109-
void* buffer = vmm_alloc(file->size / 4096 + 1);
110+
void* buffer = kmalloc(file->size);
110111
vfs_read(file, buffer, file->size, 0);
111112
init_executable(1, buffer, argv, envp);
112-
vmm_free(buffer, file->size / 4096 + 1);
113+
kfree(buffer);
113114
vfs_close(file);
114115
} else {
115116
abortf(false, "Please use --init to set a init process");
@@ -166,6 +167,7 @@ void _main(multiboot_info_t* mb_info) {
166167

167168
pmm_init();
168169
vmm_init();
170+
initialize_heap(MB(4) / 0x1000);
169171

170172
set_gdt(new_gdt());
171173

0 commit comments

Comments
 (0)