This commit is contained in:
2025-03-16 05:52:09 +08:00
parent 41d4a30610
commit be5045fde1
28 changed files with 738 additions and 76 deletions

View File

@@ -12,8 +12,9 @@ wait:
b wait
run:
// move dtb to x20
mov x20, x0
adr x0, _start
adrp x0, __stack_end
mov sp, x0
adr x0, __text_start
@@ -25,6 +26,7 @@ run:
adr x1, __bss_end
bl memzero
// move dtb back to x0
mov x0, x20
bl main
b wait
@@ -36,7 +38,8 @@ relocate:
adr x2, __text_end
sub x2, x2, x1
bl memcpy
mov x19, x0
mov x19, x0 // save return pointer
// move rodata section
ldr x0, =__new_ro_start
@@ -52,5 +55,6 @@ relocate:
sub x2, x2, x1
bl memcpy
mov x0, x20
br x19
b wait

View File

@@ -1,16 +1,16 @@
ENTRY(_start)
MEMORY
{
NEWTEXT (rx) : ORIGIN = 0x10000, LENGTH = 128K
NEWRO (r) : ORIGIN = 0x30000, LENGTH = 128K
NEWDATA (rw) : ORIGIN = 0x50000, LENGTH = 64K
NEWBSS (rw) : ORIGIN = 0x60000, LENGTH = 64K
NEWTEXT (rx) : ORIGIN = 0x10000, LENGTH = 64K
NEWRO (r) : ORIGIN = 0x20000, LENGTH = 16K
NEWDATA (rw) : ORIGIN = 0x24000, LENGTH = 16K
NEWBSS (rw) : ORIGIN = 0x28000, LENGTH = 16K
TEXT (rx) : ORIGIN = 0x80000, LENGTH = 128K
RO (r) : ORIGIN = 0xa0000, LENGTH = 128K
DATA (rw) : ORIGIN = 0xc0000, LENGTH = 64K
BSS (rw) : ORIGIN = 0xd0000, LENGTH = 64K
RAM (rw) : ORIGIN = 0xf0000, LENGTH = 8M
TEXT (rx) : ORIGIN = 0x80000, LENGTH = 64K
RO (r) : ORIGIN = 0x90000, LENGTH = 16K
DATA (rw) : ORIGIN = 0x94000, LENGTH = 16K
BSS (rw) : ORIGIN = 0x98000, LENGTH = 16K
RAM (rw) : ORIGIN = 0x9c000, LENGTH = 4M
}
SECTIONS
@@ -36,6 +36,7 @@ SECTIONS
*(.bss)
__bss_end = .;
} >BSS
__stack_end = ORIGIN(RAM) + LENGTH(RAM);
__new_text_start = ORIGIN(NEWTEXT);
@@ -44,7 +45,6 @@ SECTIONS
__new_bss_start = ORIGIN(NEWBSS);
}
__kernel = 0x80000;
__heap_start = ORIGIN(RAM);
__heap_end = ORIGIN(RAM) + LENGTH(RAM) - 2M;
__bss_size = (__bss_end - __bss_start)>>3;

View File

@@ -2,20 +2,44 @@
#include <shell.h>
#include <uart.h>
extern byte_t __kernel[];
byte_t *kernel = __kernel;
// extern uint64_t __kernel;
uint64_t __kernel = 0x80000;
void main()
typedef void (*main_func_t)(void *);
void main(void *dtb)
{
uart_init();
uart_getc();
uart_puts("waiting for kernel to be sent ..." ENDL);
union {
int size;
uint8_t buf[4];
} kernel_header;
kernel_header.size = 0;
for (int i = 0; i < (int)sizeof(kernel_header); ++i)
kernel_header.buf[i] = uart_getb();
uart_puts("received kernel size: ");
uart_int(kernel_header.size);
uart_puts(ENDL);
uart_puts("loaded addr: ");
uart_hex((unsigned int)(unsigned long)main);
uart_puts(ENDL);
int shell_cont = 1;
while (shell_cont) {
shell_cont = shell();
}
uart_puts("dtb addr: ");
uart_hex((unsigned int)(unsigned long)dtb);
uart_puts(ENDL);
uint8_t *kernel = (void *)__kernel;
uart_puts("kernel addr: ");
uart_hex((unsigned int)(unsigned long)kernel);
uart_puts("$" ENDL);
for (int i = 0; i < kernel_header.size; ++i)
kernel[i] = uart_getb();
((main_func_t)kernel)(dtb);
}