#include "arch/kernel/main.hpp" #include "arch/boot/multiboot.hpp" #include "arch/boot/pointers.hpp" #include "arch/video/vga/text.hpp" namespace teachos::arch::kernel { auto main() -> void { using namespace video::vga; text::clear(); text::cursor(false); text::write("TeachOS is starting up...", text::common_attributes::green_on_black); auto mip = arch::boot::multiboot_information_pointer; // Address of the first multiboot tag auto multiboot_tag = (struct multiboot_tag *)((uint8_t *)mip + 8); /* * Loop over the multiboot2 tags to access the information needed. * Tags are defined in the header. */ for (auto tag = multiboot_tag; tag->type != MULTIBOOT_TAG_TYPE_END; tag = (struct multiboot_tag *)((uint8_t *)tag + ((tag->size + 7) & ~7))) { switch (tag->type) { case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO: uint32_t size = tag->size; uint32_t mem_lower = *(uint32_t *)(&size + 32); uint32_t mem_upper = *(uint32_t *)(&size + 64); text::write_number(mem_lower, text::common_attributes::green_on_black); text::write("Lower memory bound", text::common_attributes::green_on_black); text::write_number(mem_lower, text::common_attributes::green_on_black); text::write("Upper memory bound", text::common_attributes::green_on_black); text::write_number(mem_upper, text::common_attributes::green_on_black); break; } } } } // namespace teachos::arch::kernel