diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2023-01-29 02:11:05 +0100 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2023-01-29 02:11:05 +0100 |
| commit | 37c9560515dffebab1e0dc6b79d6ac66eff6a161 (patch) | |
| tree | ca2c4df7e41bfdea9363313c547f0894c50d8a98 | |
| parent | f5297ff820a532c04a4f01398b3c571070a3f0b4 (diff) | |
pmm.c
| -rw-r--r-- | kernel/Makefile | 1 | ||||
| -rw-r--r-- | kernel/include/pmm.h | 7 | ||||
| -rw-r--r-- | kernel/src/apic/madt.c | 10 | ||||
| -rw-r--r-- | kernel/src/main.c | 13 | ||||
| -rw-r--r-- | kernel/src/mem/pmm.c | 49 |
5 files changed, 65 insertions, 15 deletions
diff --git a/kernel/Makefile b/kernel/Makefile index 93cfa24..266eea8 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -31,6 +31,7 @@ OBJS = \ src/mem/heap.o \ src/mem/paging_asm.o \ src/mem/paging.o \ + src/mem/pmm.o \ src/misc/graphics.o \ src/misc/stdbuff.o \ src/scheduler/atomic.o \ diff --git a/kernel/include/pmm.h b/kernel/include/pmm.h new file mode 100644 index 0000000..5fe62a8 --- /dev/null +++ b/kernel/include/pmm.h @@ -0,0 +1,7 @@ +#ifndef PMM_H +#define PMM_H + +void init_pmm(void); +void memory_usage(void); + +#endif diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c index fff0db5..654182a 100644 --- a/kernel/src/apic/madt.c +++ b/kernel/src/apic/madt.c @@ -99,7 +99,7 @@ void parse_madt() cpu_apic_ids[numcores] = cpu->apic_id; numcores++; - printf("found cpu: acpi_id: 0x%x, apic_id: 0x%x, flags: 0x%x\n", cpu->acpi_id, cpu->apic_id, cpu->flags); + // printf("found cpu: acpi_id: 0x%x, apic_id: 0x%x, flags: 0x%x\n", cpu->acpi_id, cpu->apic_id, cpu->flags); kfree(cpu); } else if (type == 1) { // I/O APIC @@ -108,14 +108,14 @@ void parse_madt() ioapic_addr = io->io_apic_addr; - printf("found io: apic_id: 0x%x, addr: 0x%x, int_base: 0x%x\n", io->apic_id, io->io_apic_addr, io->int_base); + // printf("found io: apic_id: 0x%x, addr: 0x%x, int_base: 0x%x\n", io->apic_id, io->io_apic_addr, io->int_base); kfree(io); } else if (type == 2) { // IO/APIC Interrupt Source Override struct MADT_io_apic_int* io_apic_int = (struct MADT_io_apic_int*)kalloc(sizeof(struct MADT_io_apic_int)); memcpy(io_apic_int, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_io_apic_int)); - printf("found io_apic_int: bus: 0x%x, irq_source: 0x%x, global_sys_int: 0x%x, flags: 0x%x\n", io_apic_int->bus_source, io_apic_int->irq_source, io_apic_int->global_sys_int, io_apic_int->flags); + // printf("found io_apic_int: bus: 0x%x, irq_source: 0x%x, global_sys_int: 0x%x, flags: 0x%x\n", io_apic_int->bus_source, io_apic_int->irq_source, io_apic_int->global_sys_int, io_apic_int->flags); kfree(io_apic_int); } else if (type == 3) { // IO/APIC Non-maskable interrupt source @@ -125,14 +125,14 @@ void parse_madt() struct MADT_lapic_nmi* lapic_nmi = (struct MADT_lapic_nmi*)kalloc(sizeof(struct MADT_lapic_nmi)); memcpy(lapic_nmi, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_lapic_nmi)); - printf("found lapic_nmi: acpi_cpu_id: 0x%x, flags: 0x%x, lint: 0x%x\n", lapic_nmi->acpi_cpu_id, lapic_nmi->flags, lapic_nmi->lint); + // printf("found lapic_nmi: acpi_cpu_id: 0x%x, flags: 0x%x, lint: 0x%x\n", lapic_nmi->acpi_cpu_id, lapic_nmi->flags, lapic_nmi->lint); kfree(lapic_nmi); } else if (type == 5) { // Local APIC Address Override struct MADT_lapic_addr* lapic_addr_ovr = (struct MADT_lapic_addr*)kalloc(sizeof(struct MADT_lapic_addr)); memcpy(lapic_addr_ovr, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_lapic_addr)); - printf("found lapic: addr: 0x%x\n", lapic_addr_ovr->phys_addr); + // printf("found lapic: addr: 0x%x\n", lapic_addr_ovr->phys_addr); kfree(lapic_addr_ovr); } else if (type == 9) { // Processor Local x2APIC diff --git a/kernel/src/main.c b/kernel/src/main.c index 766d69c..5061515 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -20,6 +20,7 @@ #include <containter_of.h> #include <madt.h> #include <atomic.h> +#include <pmm.h> int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic); int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) @@ -32,24 +33,16 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) read_mb2(multiboot_bootinfo, multiboot_magic); clear_screen(main_fb); // framebuffer is enabled from this point - //mmap_t* pos; - //list_for_each_entry(pos, (&mmap.list), list) { - // mb2_tag_mmap_entry entry = pos->mmap_entry; - // printf("base_addr: 0x%x, length: 0x%x, reserved: %d, type: %d\n", entry.base_addr, entry.length, entry.reserved, entry.type); - //} - + init_pmm(); + memory_usage(); init_keyboard(); init_timer(TICKS_PER_SECOND); init_idt(); disc_init(); ext2_init(); - //ls(path_to_inode("/")); - //print_inode(path_to_inode("/")); init_tss(); - list_sys_tables(); parse_madt(); - jump_userspace(); for(;;) { diff --git a/kernel/src/mem/pmm.c b/kernel/src/mem/pmm.c new file mode 100644 index 0000000..63bfb07 --- /dev/null +++ b/kernel/src/mem/pmm.c @@ -0,0 +1,49 @@ +#include <paging.h> +#include <heap.h> +#include <libk/list.h> +#include <libk/stdio.h> +#include <libk/serial_stdio.h> +#include <libk/string.h> +#include <multiboot2.h> +#include <pmm.h> + +#define PMM_PAGE_SIZE 4096 * 512 +#define MEM_USED_BELOW 0x03000000 + +uint64_t free_mem_cnt; +uint64_t all_mem_cnt; +list_t pmm_list; + +void init_pmm() +{ + INIT_LIST(pmm_list); + + mmap_t* pos; + list_for_each_entry_prev(pos, (&mmap.list), list) { + mb2_tag_mmap_entry entry = pos->mmap_entry; + if (entry.type != 1) + continue; + uint64_t base = entry.base_addr & (PMM_PAGE_SIZE - 1) ? (entry.base_addr & (uint64_t)~(PMM_PAGE_SIZE - 1)) + PMM_PAGE_SIZE : entry.base_addr; + for (uint64_t i = base; i + PMM_PAGE_SIZE <= entry.base_addr + entry.length; i += PMM_PAGE_SIZE) { + if (i >= MEM_USED_BELOW) { + free_mem_cnt++; + map_addr(i, i, FLAG_PRESENT); + list_t* list = (list_t*)i; + add_to_list(list, &pmm_list, pmm_list.next); + } + } + } + all_mem_cnt = free_mem_cnt; + + // print addr of every free block of memory + //list_t* pok; + //list_for_each(pok, (&pmm_list)) { + // serial_printf("0x%x\n", pok); + //} +} + +void memory_usage() +{ + printf("memory used: %dMB\n", (48 * 1024 * 1024 + (all_mem_cnt - free_mem_cnt) * PAGE_SIZE) / 1024 / 1024); + printf("memory free: %dMB\n", free_mem_cnt * PAGE_SIZE / 1024 / 1024); +} |
