Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
kernel_reader.c
Go to the documentation of this file.
1#include "hal/cpu/paging.h"
2#include "init/init.h"
3#include "libk/debug/debug.h"
5#include "libk/serial.h"
6#include "libk/symbols.h"
7#include <vector.h>
9#include "memory/vm_manager.h"
10#include <str.h>
12
14
15INIT(KernelReader) {
16 vector_init(&ksymbols.items);
17
18 ksymbols.name = "kernel_symbols";
19
21 VMA_REGION_A, ctx->kernel_raw_size / BLOCK_SIZE);
23 (uintptr_t) ctx->kernel_raw_addr, ctx->kernel_raw_size,
24 0b111);
26 vma_register(get_kernel_vmm_page(), ctx->kernel_raw_addr, addr,
27 ctx->kernel_raw_size / BLOCK_SIZE);
28
29 Elf64_Ehdr* kernel_ehdr = (Elf64_Ehdr*) addr;
30 LOG_INFO("ELF", "kernel version : %d", kernel_ehdr->e_version);
31 LOG_INFO("ELF", "kernel entry : 0x%x", kernel_ehdr->e_entry);
32
33 elf_section_map sh_ma = {0};
35 if (!sh_ma.symtab) {
36 LOG_ERROR("ELF", "tidak ada .symtab");
37 return;
38 }
39
40 Elf64_Sym* symtab =
41 (Elf64_Sym*) ((uint64_t) addr + sh_ma.symtab->sh_offset);
42 char* strtab = (char*) ((uint64_t) addr + sh_ma.strtab->sh_offset);
43 uint64_t sym_count = sh_ma.symtab->sh_size / sizeof(Elf64_Sym);
44
45 for (uint64_t i = 0; i < sym_count; i++) {
46 const char* name = strtab + symtab[i].st_name;
47 if (!*name)
48 continue;
50 &ksymbols, (const char*) (strtab + symtab[i].st_name),
51 (uintptr_t) symtab[i].st_value, symtab[i].st_size);
52 }
53
54 KDEBUG(DEBUG_LEVEL_INFO, "Kernel Symbol Reader Module Initialized\n");
55}
56
@ DEBUG_LEVEL_INFO
Definition debug.h:8
#define KDEBUG(...)
Definition debug.h:16
kstring name
Definition dentry.h:5
volatile uint64_t addr
Definition e1000.hpp:0
void elf_section_map_all(uint8_t *data, elf_section_map *map)
Definition elf.c:160
#define INIT(fn)
Definition init.h:26
symbols ksymbols
symbols_ptr kernel_get_symbols()
void paging_reload(page_t p)
Definition paging.c:457
page_t paging_get_highest_page_map(void)
Definition paging.c:463
void vxMultipleMmap(page_t page_dir, uint64_t virt, uint64_t phys, uint64_t size, uint64_t flags)
Definition paging.c:340
#define BLOCK_SIZE
#define LOG_ERROR(mod, fmt,...)
Definition serial.h:25
#define LOG_INFO(mod, fmt,...)
Definition serial.h:20
uint32_t e_version
Definition elf.h:26
uint64_t e_entry
Definition elf.h:27
uint64_t sh_offset
Definition elf.h:55
uint64_t sh_size
Definition elf.h:56
uint32_t st_name
Definition elf.h:64
Elf64_Shdr * strtab
Definition elf.h:280
Elf64_Shdr * symtab
Definition elf.h:279
void symbols_register(symbols *sym, const char *name, uintptr_t value, size_t size)
Definition symbols.c:5
symbols * symbols_ptr
Definition symbols.h:18
unsigned long uintptr_t
Definition type.h:73
unsigned long uint64_t
Definition type.h:25
unsigned char uint8_t
Definition type.h:7
#define vector_init(v)
Definition vector.h:20
uintptr_t vma_lookup_free_vaddr(struct virtual_memory_page *page, mem_vma_region region, size_t size)
Definition vm_manager.c:156
void vma_register(struct virtual_memory_page *page, uintptr_t phys_address, uintptr_t virt_addr, size_t size)
Definition vm_manager.c:101
struct virtual_memory_page * get_kernel_vmm_page()
@ VMA_REGION_A
Definition vm_manager.h:13