[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
This commit is contained in:
@@ -86,41 +86,44 @@ kernel_main(args::header *header)
|
|||||||
|
|
||||||
memory_initialize(header);
|
memory_initialize(header);
|
||||||
|
|
||||||
/*
|
|
||||||
kutil::allocator &heap = g_kernel_heap;
|
kutil::allocator &heap = g_kernel_heap;
|
||||||
|
|
||||||
|
/*
|
||||||
if (header->frame_buffer && header->frame_buffer_length) {
|
if (header->frame_buffer && header->frame_buffer_length) {
|
||||||
page_manager::get()->map_offset_pointer(
|
page_manager::get()->map_offset_pointer(
|
||||||
&header->frame_buffer,
|
&header->frame_buffer,
|
||||||
header->frame_buffer_length);
|
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<initrd::disk> 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_pml4(nullptr, 0);
|
||||||
page_manager::get()->dump_blocks(true);
|
page_manager::get()->dump_blocks(true);
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
|
|
||||||
device_manager *devices =
|
device_manager *devices =
|
||||||
new (&device_manager::get()) device_manager(header->acpi_table, heap);
|
new (&device_manager::get()) device_manager(header->acpi_table, heap);
|
||||||
|
|
||||||
interrupts_enable();
|
interrupts_enable();
|
||||||
|
|
||||||
*/
|
|
||||||
/*
|
/*
|
||||||
auto r = cpu.get(0x15);
|
auto r = cpu.get(0x15);
|
||||||
log::info(logs::boot, "CPU Crystal: %dHz", r.ecx);
|
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) );
|
__asm__ __volatile__ ( "mov %%cr4, %0" : "=r" (cr4) );
|
||||||
log::info(logs::boot, "cr4: %016x", cr4);
|
log::info(logs::boot, "cr4: %016x", cr4);
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
|
|
||||||
devices->init_drivers();
|
devices->init_drivers();
|
||||||
|
|
||||||
*/
|
|
||||||
/*
|
/*
|
||||||
block_device *disk = devices->get_block_device(0);
|
block_device *disk = devices->get_block_device(0);
|
||||||
if (disk) {
|
if (disk) {
|
||||||
@@ -157,7 +158,6 @@ kernel_main(args::header *header)
|
|||||||
log::warn(logs::boot, "No block devices present.");
|
log::warn(logs::boot, "No block devices present.");
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
|
|
||||||
devices->get_lapic()->calibrate_timer();
|
devices->get_lapic()->calibrate_timer();
|
||||||
|
|
||||||
@@ -166,9 +166,11 @@ kernel_main(args::header *header)
|
|||||||
|
|
||||||
sched->create_kernel_task(-1, logger_task);
|
sched->create_kernel_task(-1, logger_task);
|
||||||
|
|
||||||
for (auto &f : ird.files()) {
|
for (auto &ird : initrds) {
|
||||||
if (f.executable())
|
for (auto &f : ird.files()) {
|
||||||
sched->load_process(f.name(), f.data(), f.size());
|
if (f.executable())
|
||||||
|
sched->load_process(f.name(), f.data(), f.size());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log::info(logs::objs, "Testing object system:");
|
log::info(logs::objs, "Testing object system:");
|
||||||
@@ -187,5 +189,4 @@ kernel_main(args::header *header)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sched->start();
|
sched->start();
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ memory_initialize(args::header *kargs)
|
|||||||
{
|
{
|
||||||
args::mem_entry *entries = kargs->mem_map;
|
args::mem_entry *entries = kargs->mem_map;
|
||||||
size_t entry_count = kargs->num_map_entries;
|
size_t entry_count = kargs->num_map_entries;
|
||||||
|
page_table *kpml4 = reinterpret_cast<page_table*>(kargs->pml4);
|
||||||
|
|
||||||
new (&g_kernel_heap) kutil::heap_allocator {heap_start, kernel_max_heap};
|
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
|
// 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 {
|
new (&g_kernel_space) kutil::vm_space {
|
||||||
kernel_offset,
|
kernel_offset,
|
||||||
(page_offset-kernel_offset),
|
(page_offset-kernel_offset),
|
||||||
g_kernel_heap};
|
g_kernel_heap};
|
||||||
|
|
||||||
page_table *kpml4 = reinterpret_cast<page_table*>(kargs->pml4);
|
|
||||||
|
|
||||||
uintptr_t current_start = 0;
|
uintptr_t current_start = 0;
|
||||||
size_t current_bytes = 0;
|
size_t current_bytes = 0;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ using memory::kernel_offset;
|
|||||||
using memory::page_offset;
|
using memory::page_offset;
|
||||||
using memory::page_mappable;
|
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;
|
extern kutil::vm_space g_kernel_space;
|
||||||
|
|
||||||
// NB: in 4KiB page table entries, bit 7 isn't pagesize but PAT. Currently this
|
// 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_page_cache(nullptr),
|
||||||
m_frames(frames)
|
m_frames(frames)
|
||||||
{
|
{
|
||||||
@@ -56,9 +57,9 @@ page_manager::create_process_map()
|
|||||||
{
|
{
|
||||||
page_table *table = get_table_page();
|
page_table *table = get_table_page();
|
||||||
|
|
||||||
kutil::memset(table, 0, frame_size);
|
kutil::memset(table, 0, frame_size/2);
|
||||||
table->entries[510] = m_kernel_pml4->entries[510];
|
for (unsigned i = 256; i < 512; ++i)
|
||||||
table->entries[511] = m_kernel_pml4->entries[511];
|
table->entries[i] = m_kernel_pml4->entries[i];
|
||||||
|
|
||||||
// Create the initial user stack
|
// Create the initial user stack
|
||||||
map_pages(
|
map_pages(
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ class page_manager
|
|||||||
public:
|
public:
|
||||||
/// Constructor.
|
/// Constructor.
|
||||||
/// \arg frames The frame allocator to get physical frames from
|
/// \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.
|
/// Helper to get the number of pages needed for a given number of bytes.
|
||||||
/// \arg bytes The number of bytes desired
|
/// \arg bytes The number of bytes desired
|
||||||
|
|||||||
Reference in New Issue
Block a user