Przeglądaj źródła

Kernel: Move more things from init() to init_stage2()

The purpose of init() is to get multi-tasking up and running. We don't
want to do anything in init() that doesn't advance that goal.

This patch moves some things from init() to init_stage2(), and adds a
comment block explaining the split.
Andreas Kling 5 lat temu
rodzic
commit
c8087a42fc
1 zmienionych plików z 47 dodań i 40 usunięć
  1. 47 40
      Kernel/init.cpp

+ 47 - 40
Kernel/init.cpp

@@ -24,11 +24,6 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
  */
 
 
-#include "Devices/PATADiskDevice.h"
-#include "KSyms.h"
-#include "Process.h"
-#include "RTC.h"
-#include "Scheduler.h"
 #include <AK/Types.h>
 #include <AK/Types.h>
 #include <Kernel/ACPI/ACPIDynamicParser.h>
 #include <Kernel/ACPI/ACPIDynamicParser.h>
 #include <Kernel/ACPI/ACPIStaticParser.h>
 #include <Kernel/ACPI/ACPIStaticParser.h>
@@ -48,6 +43,7 @@
 #include <Kernel/Devices/MBVGADevice.h>
 #include <Kernel/Devices/MBVGADevice.h>
 #include <Kernel/Devices/NullDevice.h>
 #include <Kernel/Devices/NullDevice.h>
 #include <Kernel/Devices/PATAChannel.h>
 #include <Kernel/Devices/PATAChannel.h>
+#include <Kernel/Devices/PATADiskDevice.h>
 #include <Kernel/Devices/PS2MouseDevice.h>
 #include <Kernel/Devices/PS2MouseDevice.h>
 #include <Kernel/Devices/RandomDevice.h>
 #include <Kernel/Devices/RandomDevice.h>
 #include <Kernel/Devices/SB16.h>
 #include <Kernel/Devices/SB16.h>
@@ -61,12 +57,16 @@
 #include <Kernel/Interrupts/APIC.h>
 #include <Kernel/Interrupts/APIC.h>
 #include <Kernel/Interrupts/InterruptManagement.h>
 #include <Kernel/Interrupts/InterruptManagement.h>
 #include <Kernel/Interrupts/PIC.h>
 #include <Kernel/Interrupts/PIC.h>
+#include <Kernel/KSyms.h>
 #include <Kernel/Multiboot.h>
 #include <Kernel/Multiboot.h>
 #include <Kernel/Net/LoopbackAdapter.h>
 #include <Kernel/Net/LoopbackAdapter.h>
 #include <Kernel/Net/NetworkTask.h>
 #include <Kernel/Net/NetworkTask.h>
 #include <Kernel/PCI/Access.h>
 #include <Kernel/PCI/Access.h>
 #include <Kernel/PCI/Initializer.h>
 #include <Kernel/PCI/Initializer.h>
+#include <Kernel/Process.h>
+#include <Kernel/RTC.h>
 #include <Kernel/Random.h>
 #include <Kernel/Random.h>
+#include <Kernel/Scheduler.h>
 #include <Kernel/TTY/PTYMultiplexer.h>
 #include <Kernel/TTY/PTYMultiplexer.h>
 #include <Kernel/TTY/VirtualConsole.h>
 #include <Kernel/TTY/VirtualConsole.h>
 #include <Kernel/Time/TimeManagement.h>
 #include <Kernel/Time/TimeManagement.h>
@@ -92,6 +92,16 @@ static void setup_time_management();
 
 
 VirtualConsole* tty0;
 VirtualConsole* tty0;
 
 
+// SerenityOS Kernel C++ entry point :^)
+//
+// This is where C++ execution begins, after boot.S transfers control here.
+//
+// The purpose of init() is to start multi-tasking. It does the bare minimum
+// amount of work needed to start the scheduler.
+//
+// Once multi-tasking is ready, we spawn a new thread that starts in the
+// init_stage2() function. Initialization continues there.
+
 extern "C" [[noreturn]] void init()
 extern "C" [[noreturn]] void init()
 {
 {
     setup_serial_debug();
     setup_serial_debug();
@@ -105,7 +115,6 @@ extern "C" [[noreturn]] void init()
 
 
     MemoryManager::initialize();
     MemoryManager::initialize();
 
 
-    bool text_debug = kernel_command_line().contains("text_debug");
     gdt_init();
     gdt_init();
     idt_init();
     idt_init();
 
 
@@ -113,8 +122,10 @@ extern "C" [[noreturn]] void init()
     setup_acpi();
     setup_acpi();
 
 
     new VFS;
     new VFS;
+    new KeyboardDevice;
+    new PS2MouseDevice;
+    setup_vmmouse();
     new DebugLogDevice;
     new DebugLogDevice;
-
     new Console;
     new Console;
 
 
     klog() << "Starting SerenityOS...";
     klog() << "Starting SerenityOS...";
@@ -127,11 +138,6 @@ extern "C" [[noreturn]] void init()
     for (ctor_func_t* ctor = &start_ctors; ctor < &end_ctors; ctor++)
     for (ctor_func_t* ctor = &start_ctors; ctor < &end_ctors; ctor++)
         (*ctor)();
         (*ctor)();
 
 
-    new KeyboardDevice;
-    new PS2MouseDevice;
-    setup_vmmouse();
-
-    new SB16;
     new NullDevice;
     new NullDevice;
     if (!get_serial_debug())
     if (!get_serial_debug())
         new SerialDevice(SERIAL_COM1_ADDR, 64);
         new SerialDevice(SERIAL_COM1_ADDR, 64);
@@ -144,33 +150,22 @@ extern "C" [[noreturn]] void init()
     new VirtualConsole(1);
     new VirtualConsole(1);
     VirtualConsole::switch_to(0);
     VirtualConsole::switch_to(0);
 
 
-    // Sample test to see if the ACPI parser is working...
-    klog() << "ACPI: HPET table @ " << ACPI::Parser::the().find_table("HPET");
-
-    setup_pci();
-
-    if (text_debug) {
-        dbg() << "Text mode enabled";
-    } else {
-        if (multiboot_info_ptr->framebuffer_type == 1 || multiboot_info_ptr->framebuffer_type == 2) {
-            new MBVGADevice(
-                PhysicalAddress((u32)(multiboot_info_ptr->framebuffer_addr)),
-                multiboot_info_ptr->framebuffer_pitch,
-                multiboot_info_ptr->framebuffer_width,
-                multiboot_info_ptr->framebuffer_height);
-        } else {
-            new BXVGADevice;
-        }
-    }
-
-    LoopbackAdapter::the();
-
     Process::initialize();
     Process::initialize();
     Thread::initialize();
     Thread::initialize();
 
 
     Thread* init_stage2_thread = nullptr;
     Thread* init_stage2_thread = nullptr;
     Process::create_kernel_process(init_stage2_thread, "init_stage2", init_stage2);
     Process::create_kernel_process(init_stage2_thread, "init_stage2", init_stage2);
 
 
+    Scheduler::pick_next();
+
+    sti();
+
+    Scheduler::idle_loop();
+    ASSERT_NOT_REACHED();
+}
+
+void init_stage2()
+{
     Thread* syncd_thread = nullptr;
     Thread* syncd_thread = nullptr;
     Process::create_kernel_process(syncd_thread, "syncd", [] {
     Process::create_kernel_process(syncd_thread, "syncd", [] {
         for (;;) {
         for (;;) {
@@ -193,22 +188,34 @@ extern "C" [[noreturn]] void init()
         }
         }
     });
     });
 
 
-    Scheduler::pick_next();
+    // Sample test to see if the ACPI parser is working...
+    klog() << "ACPI: HPET table @ " << ACPI::Parser::the().find_table("HPET");
 
 
-    sti();
+    setup_pci();
 
 
-    Scheduler::idle_loop();
-    ASSERT_NOT_REACHED();
-}
+    if (kernel_command_line().contains("text_debug")) {
+        dbg() << "Text mode enabled";
+    } else {
+        if (multiboot_info_ptr->framebuffer_type == 1 || multiboot_info_ptr->framebuffer_type == 2) {
+            new MBVGADevice(
+                PhysicalAddress((u32)(multiboot_info_ptr->framebuffer_addr)),
+                multiboot_info_ptr->framebuffer_pitch,
+                multiboot_info_ptr->framebuffer_width,
+                multiboot_info_ptr->framebuffer_height);
+        } else {
+            new BXVGADevice;
+        }
+    }
+
+    LoopbackAdapter::the();
 
 
-void init_stage2()
-{
     Syscall::initialize();
     Syscall::initialize();
 
 
     new ZeroDevice;
     new ZeroDevice;
     new FullDevice;
     new FullDevice;
     new RandomDevice;
     new RandomDevice;
     new PTYMultiplexer;
     new PTYMultiplexer;
+    new SB16;
 
 
     bool dmi_unreliable = kernel_command_line().contains("dmi_unreliable");
     bool dmi_unreliable = kernel_command_line().contains("dmi_unreliable");
     if (dmi_unreliable) {
     if (dmi_unreliable) {