From bfd13e7a9b0bb3bc55d62861958883e9344b7528 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sun, 24 May 2020 17:58:45 -0700 Subject: [PATCH] [kernel] Re-enable most of kernel_main The `kernel_main()` had a lot change out from under it with the bootloader changes. This change brings most of it back in line with the new kernel arguments. Tags: pml4 paging boot --- src/kernel/main.cpp | 49 +++++++++++++++++---------------- src/kernel/memory_bootstrap.cpp | 4 +-- src/kernel/page_manager.cpp | 11 ++++---- src/kernel/page_manager.h | 3 +- 4 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 0c47ab1..8d107be 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -86,41 +86,44 @@ kernel_main(args::header *header) memory_initialize(header); - /* kutil::allocator &heap = g_kernel_heap; + /* if (header->frame_buffer && header->frame_buffer_length) { page_manager::get()->map_offset_pointer( &header->frame_buffer, header->frame_buffer_length); } - - - log::debug(logs::boot, " jsix header is at: %016lx", header); - log::debug(logs::boot, " Framebuffer is at: %016lx", header->frame_buffer); - log::debug(logs::boot, " Kernel data is at: %016lx", header->data); - log::debug(logs::boot, " Memory map is at: %016lx", header->memory_map); - log::debug(logs::boot, "ACPI root table is at: %016lx", header->acpi_table); - log::debug(logs::boot, "Runtime service is at: %016lx", header->runtime); - - initrd::disk ird(header->initrd, heap); - log::info(logs::boot, "initrd loaded with %d files.", ird.files().count()); - for (auto &f : ird.files()) - log::info(logs::boot, " %s%s (%d bytes).", f.executable() ? "*" : "", f.name(), f.size()); - */ + + log::debug(logs::boot, " jsix header is at: %016lx", header); + log::debug(logs::boot, " Memory map is at: %016lx", header->mem_map); + log::debug(logs::boot, "ACPI root table is at: %016lx", header->acpi_table); + log::debug(logs::boot, "Runtime service is at: %016lx", header->runtime_services); + + // Load the module tagged as initrd + kutil::vector initrds(heap); + for (unsigned i = 0; i < header->num_modules; ++i) { + args::module &mod = header->modules[i]; + if (mod.type != args::mod_type::initrd) + continue; + + initrd::disk &ird = initrds.emplace(mod.location, heap); + log::info(logs::boot, "initrd loaded with %d files.", ird.files().count()); + for (auto &f : ird.files()) + log::info(logs::boot, " %s%s (%d bytes).", f.executable() ? "*" : "", f.name(), f.size()); + } + /* page_manager::get()->dump_pml4(nullptr, 0); page_manager::get()->dump_blocks(true); */ - /* device_manager *devices = new (&device_manager::get()) device_manager(header->acpi_table, heap); interrupts_enable(); - */ /* auto r = cpu.get(0x15); log::info(logs::boot, "CPU Crystal: %dHz", r.ecx); @@ -129,11 +132,9 @@ kernel_main(args::header *header) __asm__ __volatile__ ( "mov %%cr4, %0" : "=r" (cr4) ); log::info(logs::boot, "cr4: %016x", cr4); */ - /* devices->init_drivers(); - */ /* block_device *disk = devices->get_block_device(0); if (disk) { @@ -157,7 +158,6 @@ kernel_main(args::header *header) log::warn(logs::boot, "No block devices present."); } */ - /* devices->get_lapic()->calibrate_timer(); @@ -166,9 +166,11 @@ kernel_main(args::header *header) sched->create_kernel_task(-1, logger_task); - for (auto &f : ird.files()) { - if (f.executable()) - sched->load_process(f.name(), f.data(), f.size()); + for (auto &ird : initrds) { + for (auto &f : ird.files()) { + if (f.executable()) + sched->load_process(f.name(), f.data(), f.size()); + } } log::info(logs::objs, "Testing object system:"); @@ -187,5 +189,4 @@ kernel_main(args::header *header) } sched->start(); - */ } diff --git a/src/kernel/memory_bootstrap.cpp b/src/kernel/memory_bootstrap.cpp index fc7b0dd..43d1618 100644 --- a/src/kernel/memory_bootstrap.cpp +++ b/src/kernel/memory_bootstrap.cpp @@ -70,6 +70,7 @@ memory_initialize(args::header *kargs) { args::mem_entry *entries = kargs->mem_map; size_t entry_count = kargs->num_map_entries; + page_table *kpml4 = reinterpret_cast(kargs->pml4); new (&g_kernel_heap) kutil::heap_allocator {heap_start, kernel_max_heap}; @@ -82,14 +83,13 @@ memory_initialize(args::header *kargs) } // Create the page manager - page_manager *pm = new (&g_page_manager) page_manager(*fa); + page_manager *pm = new (&g_page_manager) page_manager(*fa, kpml4); new (&g_kernel_space) kutil::vm_space { kernel_offset, (page_offset-kernel_offset), g_kernel_heap}; - page_table *kpml4 = reinterpret_cast(kargs->pml4); uintptr_t current_start = 0; size_t current_bytes = 0; diff --git a/src/kernel/page_manager.cpp b/src/kernel/page_manager.cpp index 051ec00..da5d0d3 100644 --- a/src/kernel/page_manager.cpp +++ b/src/kernel/page_manager.cpp @@ -14,7 +14,7 @@ using memory::kernel_offset; using memory::page_offset; using memory::page_mappable; -page_manager g_page_manager(g_frame_allocator); +page_manager g_page_manager(g_frame_allocator, 0); extern kutil::vm_space g_kernel_space; // NB: in 4KiB page table entries, bit 7 isn't pagesize but PAT. Currently this @@ -45,7 +45,8 @@ struct free_page_header }; -page_manager::page_manager(frame_allocator &frames) : +page_manager::page_manager(frame_allocator &frames, page_table *pml4) : + m_kernel_pml4(pml4), m_page_cache(nullptr), m_frames(frames) { @@ -56,9 +57,9 @@ page_manager::create_process_map() { page_table *table = get_table_page(); - kutil::memset(table, 0, frame_size); - table->entries[510] = m_kernel_pml4->entries[510]; - table->entries[511] = m_kernel_pml4->entries[511]; + kutil::memset(table, 0, frame_size/2); + for (unsigned i = 256; i < 512; ++i) + table->entries[i] = m_kernel_pml4->entries[i]; // Create the initial user stack map_pages( diff --git a/src/kernel/page_manager.h b/src/kernel/page_manager.h index d2f7759..9393dea 100644 --- a/src/kernel/page_manager.h +++ b/src/kernel/page_manager.h @@ -20,7 +20,8 @@ class page_manager public: /// Constructor. /// \arg frames The frame allocator to get physical frames from - page_manager(frame_allocator &frames); + /// \arg pml4 The initial kernel-space pml4 + page_manager(frame_allocator &frames, page_table *pml4); /// Helper to get the number of pages needed for a given number of bytes. /// \arg bytes The number of bytes desired