aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2021-02-21 13:39:12 +0200
committerAqua-sama <aqua@iserlohn-fortress.net>2021-02-21 13:40:39 +0200
commit79c0f7dfb063b5d29dc4547d37efbcb86a89fdac (patch)
treeebbc32b22b31e675ebb5b992a20d569d3bfa8b9e /src
parentAdd IDT (diff)
downloadkernel.cpp-79c0f7dfb063b5d29dc4547d37efbcb86a89fdac.tar.xz
Call global constructors
Diffstat (limited to 'src')
-rw-r--r--src/boot.s3
-rw-r--r--src/kernel.cc18
2 files changed, 17 insertions, 4 deletions
diff --git a/src/boot.s b/src/boot.s
index bb446d8..2286152 100644
--- a/src/boot.s
+++ b/src/boot.s
@@ -41,6 +41,8 @@ stack_top:
bootloader will jump to this position once the kernel has been loaded.
*/
.section .text
+.extern kernel_constructors
+.extern kernel_main
.global _start
.type _start, @function
_start:
@@ -59,6 +61,7 @@ _start:
pushl %ebx # push the pointer to the multiboot structure
pushl %eax # push the multiboot magic value
+ call kernel_constructors
/*
Enter the high-level kernel. The ABI requires the stack is 16-byte
diff --git a/src/kernel.cc b/src/kernel.cc
index 7aaaa37..37773e1 100644
--- a/src/kernel.cc
+++ b/src/kernel.cc
@@ -15,16 +15,26 @@
#include "idt.h"
#include "serial.h"
+SerialPort serial0;
+CGA video0;
+
+typedef void (*constructor)();
+
extern "C" {
+
+constructor start_ctors;
+constructor end_ctors;
+void kernel_constructors() {
+ for (constructor* i = &start_ctors; i != &end_ctors; ++i) (*i)();
+}
+
void dump_multiboot(uint32_t mb_magic, uint32_t mb_addr);
void dump_gdt();
void kernel_main([[maybe_unused]] uint32_t mb_magic, [[maybe_unused]] uint32_t mb_addr) {
- SerialPort s0;
- if (s0.self_check()) Console::set(&s0);
+ if (serial0.self_check()) Console::set(&serial0);
- CGA terminal;
- Console::set(&terminal);
+ Console::set(&video0);
printk("Hello, kernel World!\n");