diff options
| author | Miquel Sabaté Solà <mikisabate@gmail.com> | 2024-11-29 22:17:13 +0100 |
|---|---|---|
| committer | Miquel Sabaté Solà <mikisabate@gmail.com> | 2024-11-29 22:17:13 +0100 |
| commit | d51665904faa31c39106e4b2afa7541615072e72 (patch) | |
| tree | 01c355472bcca04f59980d961dca0bc46c9b429b /kernel/fbos.ld.S | |
| parent | 010888de490ab1fafc0200c37cd09d57a0ff1e9f (diff) | |
| download | fbos-d51665904faa31c39106e4b2afa7541615072e72.tar.gz fbos-d51665904faa31c39106e4b2afa7541615072e72.zip | |
Allow the kernel to run as a Linux image
In order to run on real hardware, it's actually easier to re-use
workflows from existing bootloaders than loading things in memory
manually. In order to achieve this two things had to be settled:
1. The image has to have a Linux header as defined in the RISC-V port.
This header will be taken into consideration by bootloaders in order to
know where to jump, the image offset, the endianness of the image, etc.
2. The image cannot just be an ELF executable. Rather, we must translate
it into binary form via `objcopy`.
With all of this at hand, I was able to make the kernel run on a
Starfive VisionFive 2 board, and I have recorded an example so it's
available as documentation.
Signed-off-by: Miquel Sabaté Solà <mikisabate@gmail.com>
Diffstat (limited to 'kernel/fbos.ld.S')
| -rw-r--r-- | kernel/fbos.ld.S | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/fbos.ld.S b/kernel/fbos.ld.S index f74d90f..160a5cb 100644 --- a/kernel/fbos.ld.S +++ b/kernel/fbos.ld.S @@ -1,8 +1,11 @@ #include <fbos/mm.h> +OUTPUT_ARCH(riscv) +ENTRY(_start) + SECTIONS { // Ensure that the image starts at the very exact address SBI expects it to. - . = LINK_ADDR; + . = LOAD_OFFSET; _start = .; . = ALIGN(PAGE_SIZE); @@ -10,8 +13,9 @@ SECTIONS { // instead of clumping it into the main `.text` one. Well, I'm no expert on // linker configuration, so patches are welcome :) .text : { + // head.S + KEEP(*(.head.text)) _text = .; - *(.head.text) // Aligning it to a full page is maybe a bit too much considering how // small `.text.head` really is. I just saw this same thing on the Linux @@ -19,7 +23,7 @@ SECTIONS { . = ALIGN(PAGE_SIZE); // From now on the rest of the `.text` could just be a continuation, but - // I further split it into `.text.kernel` so the jump from head isn't + // I further split it into `.kernel.text` so the jump from head isn't // that large. That is, we put first the very core of the kernel, and // the rest can go wherever. __kernel_text_start = .; |
