aboutsummaryrefslogtreecommitdiff
path: root/kernel/fbos.ld.S
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <mikisabate@gmail.com>2024-08-24 00:05:47 +0200
committerMiquel Sabaté Solà <mikisabate@gmail.com>2024-08-24 09:13:49 +0200
commit4038ec5662a5b1ebe652e9170069e3f2f79c7e71 (patch)
treec04772eba8e9b0584ccc80bea9a72dfd9f173d86 /kernel/fbos.ld.S
downloadfbos-4038ec5662a5b1ebe652e9170069e3f2f79c7e71.tar.gz
fbos-4038ec5662a5b1ebe652e9170069e3f2f79c7e71.zip
Bootstrap the project
For now the base layout has been defined and we have a binary that is properly reached through openSBI. Signed-off-by: Miquel Sabaté Solà <mikisabate@gmail.com>
Diffstat (limited to 'kernel/fbos.ld.S')
-rw-r--r--kernel/fbos.ld.S52
1 files changed, 52 insertions, 0 deletions
diff --git a/kernel/fbos.ld.S b/kernel/fbos.ld.S
new file mode 100644
index 0000000..f288161
--- /dev/null
+++ b/kernel/fbos.ld.S
@@ -0,0 +1,52 @@
+#include <fbos/mm.h>
+
+SECTIONS {
+ // Ensure that the image starts at the very exact address SBI expects it to.
+ . = LINK_ADDR;
+
+ // You would usually want to separate the head section into its own thing
+ // instead of clumping it into the main `.text` one. Well, I'm no expert on
+ // linker configuration, so patches are welcome :)
+ .text : {
+ // The very first thing has to be the `_start` function, which is where
+ // SBI will jump into. Afterwards comes the rest of `.text.head`.
+ _start = .;
+ *(.text.head)
+
+ // 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
+ // Kernel and it felt clean.
+ . = 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
+ // that large. That is, we put first the very core of the kernel, and
+ // the rest can go wherever.
+ __kernel_text_start = .;
+ *(.text.kernel)
+ __kernel_text_end = .;
+
+ // And the rest.
+ *(.text)
+ }
+
+ // In total we would reserve two full blown pages for the kernel code, which
+ // is definitely too much, but whatever, memory is cheap.
+ . = ALIGN(PAGE_SIZE);
+
+ .data : {
+ *(.data)
+ }
+
+ . = ALIGN(8);
+
+ .rodata : {
+ *(.rodata)
+ }
+
+ . = ALIGN(8);
+
+ .bss : {
+ *(.bss)
+ }
+}