From 79c0f7dfb063b5d29dc4547d37efbcb86a89fdac Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sun, 21 Feb 2021 13:39:12 +0200 Subject: Call global constructors --- src/boot.s | 3 +++ src/kernel.cc | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) (limited to 'src') 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"); -- cgit v1.2.1