Files
osc2025/kernel/main.c
2025-04-15 23:56:40 +08:00

174 lines
3.5 KiB
C

#include <logger.h>
#include <timer.h>
#include <kmalloc.h>
#include <uart.h>
#include <dtb.h>
#include <initrd.h>
#include <mman.h>
#include <shell.h>
#include <vector.h>
#include <utils.h>
#include <exception.h>
#include <interrupt.h>
void init(void *dtb, file_node_t **initrd_root)
{
init_exception();
// UART
uart_init();
// Device tree
DEBUG_DTB(dtb);
dtb_start = dtb;
vector_t *dtb_struct_cbs = make_vector(0);
VEC_PUSH(dtb_struct_cbs, &initrd_dtb_cb);
VEC_PUSH(dtb_struct_cbs, &mman_dtb_memory_cb);
fdt_traverse(dtb_struct_cbs);
DEBUG_DTB("device tree parse done");
// Initramfs
DEBUG_INITRD(initrd_start);
*initrd_root = initrd_init();
// Memory (Buddy system)
mman_init();
init_interrupt();
}
static inline
void _print_time(uint64_t)
{
uint64_t cntpct_el0, cntfrq_el0;
R_SYSREG(cntpct_el0, cntpct_el0);
R_SYSREG(cntfrq_el0, cntfrq_el0);
DEBUG_EXCEP(cntpct_el0 / cntfrq_el0);
task_t task = {
.firing_tick = cntpct_el0 + 2 * cntfrq_el0,
.interval = 2 * cntfrq_el0,
.repeat = 1,
.func = _print_time,
.param = 0x0,
};
add_timer_task(task);
}
static inline
void _test() {
INFOR("start test");
void *p1, *p2, *p3, *p4, *p5, *p6, *p7;
void *c1, *c2, *c3, *c4, *c5, *c6, *c7, *c8;
p1 = kmalloc(4095);
INFOR(p1);
kfree(p1); // 4095
p1 = kmalloc(4095);
c1 = kmalloc(1000);
INFOR(c1);
c2 = kmalloc(1023);
INFOR(c2);
c3 = kmalloc(999);
INFOR(c3);
c4 = kmalloc(1010);
INFOR(c4);
kfree(c3); // 999
c5 = kmalloc(989);
INFOR(c5);
c3 = kmalloc(88);
INFOR(c3);
c6 = kmalloc(1001);
INFOR(c6);
kfree(c3); // 88
c7 = kmalloc(2045);
c8 = kmalloc(1);
p2 = kmalloc(4096);
kfree(c8); // 1
p3 = kmalloc(16000);
kfree(p1); // 4095
kfree(c3); // 88
kfree(c7); // 2045
p4 = kmalloc(4097);
p5 = kmalloc(4096 + 1);
p6 = kmalloc(4096);
kfree(p2); // 4096
kfree(p5); // MAX_BLOCK_SIZE + 1
kfree(p4); // 4097
p7 = kmalloc(7197);
kfree(p6); // MAX_BLOCK_SIZE
kfree(p3); // 16000
kfree(p7); // 7197
kfree(c1); // 1000
kfree(c6); // 1001
kfree(c2); // 1023
kfree(c5); // 989
kfree(c4); // 1010
}
void main(void *dtb)
{
file_node_t *initrd_root = 0x0;
init(dtb, &initrd_root);
// LOG("system booting in");
// _print_time(0x0);
uint64_t el;
R_SYSREG(el, CurrentEL);
INFOR(el);
void *page1 = allocate_page(1);
INFOR(page1);
void *page2 = allocate_page(2);
INFOR(page2);
void *page4 = allocate_page(4);
INFOR(page4);
void *page16 = allocate_page(16);
INFOR(page16);
free_page(page1);
free_page(page2);
free_page(page4);
free_page(page16);
void *page32 = allocate_page(32);
INFOR(page32);
page1 = allocate_page(1);
INFOR(page1);
free_page(page1);
void *kmalloc8 = kmalloc(8);
INFOR(kmalloc8);
kfree(kmalloc8);
kmalloc8 = kmalloc(8);
INFOR(kmalloc8);
kfree(kmalloc8);
void *kmalloc7k = kmalloc(7 * (1 << 10));
INFOR(kmalloc7k);
void *kmalloc8k = kmalloc(1 << 13);
INFOR(kmalloc8k);
kfree(kmalloc7k);
kfree(kmalloc8k);
page1 = allocate_page(1);
INFOR(page1);
int shell_cont = 1;
while (shell_cont) {
shell_cont = shell(initrd_root);
}
}