]> Zhao Yanbai Git Server - kernel.git/commitdiff
修复在启动分页前的输出看不见的问题
authoracevest <zhaoyanbai@126.com>
Mon, 29 May 2023 15:14:59 +0000 (23:14 +0800)
committeracevest <zhaoyanbai@126.com>
Mon, 29 May 2023 15:14:59 +0000 (23:14 +0800)
boot/boot.c
boot/multiboot.S
gdbscript
include/printk.h
kernel/setup.c
kernel/tty.c
mm/bootmem.c
mm/mm.c

index 62bc897d9ceaf2f9ed7301d28458a4c09390717f..e7510a0c746d764c7fb4ec55c739dff3a093bcab 100644 (file)
@@ -136,6 +136,7 @@ void check_kernel(unsigned long addr, unsigned long magic) {
 extern void *kernel_begin;
 extern void *kernel_end;
 extern void *bootmem_bitmap_begin;
+extern void init_default_tty_before_paging();
 void init_system_info() {
     system.kernel_begin = &kernel_begin;
     system.kernel_end = &kernel_end;
@@ -147,6 +148,4 @@ void init_system_info() {
     printk("boot device: bios dev %x partition %x sub partition %x\n", boot_params.biosdev, boot_params.partition,
            boot_params.sub_partition);
     printk("mem lower %uKB upper %uKB\n", boot_params.mem_lower >> 10, boot_params.mem_upper >> 10);
-    // while (1)
-    //     ;
 }
index 8c44dfee8a9111fbb02c8ae20a8c56c0f0793988..6616ee87baf64c2b17e13c064a6fc1652f6900a0 100644 (file)
@@ -1,16 +1,16 @@
 /*
  *--------------------------------------------------------------------------
  *   File Name: multiboot.S
- * 
+ *
  * Description: none
- * 
- * 
+ *
+ *
  *      Author: Zhao Yanbai [zhaoyanbai@126.com]
- * 
+ *
  *     Version:    1.0
  * Create Date: Mon Nov 10 15:58:46 2008
  * Last Update: Tue Feb 10 22:39:24 2009
- * 
+ *
  *--------------------------------------------------------------------------
  */
 #define ASM
@@ -19,7 +19,8 @@
 #include "task.h"
 .global kernel_entry
 .global main
-.extern check_kernel 
+.extern check_kernel
+.extern init_default_tty_before_paging
 .extern init_system_info
 .extern setup_kernel
 .extern init_pgd
@@ -99,7 +100,7 @@ main:
     stosl
     addl    $0x1000,%eax
     loop    2b
-    
+
     # 初始化页表
     # 直接线性映射BOOT_INIT_PAGETBL_CNT*4M物理内存
     movl    $init_pgt-KRNLADDR,%ebx
@@ -129,6 +130,7 @@ Label:
     addl    $8, %esp
 
     movl    $root_task + TASK_SIZE, %esp
+    call    init_default_tty_before_paging
     call    init_system_info
 
     call    setup_kernel
index c8c22183f9dfb7d8fb5eeca44e773b9cfa6510b5..7c763a757b838824d00cdaba5bd8412ddf78f48f 100644 (file)
--- a/gdbscript
+++ b/gdbscript
@@ -1,3 +1,5 @@
 target remote localhost:1234
-b setup_kernel
+b init_system_info
+#b setup_kernel
+#b e820_init_bootmem_data
 c
index f142ebee00de7ed19507050e54317e908c382744..e8f1c6fa8b631b1558573f4e9994922703a77dae 100644 (file)
@@ -27,7 +27,6 @@ int printlo(unsigned int line, unsigned int offset, const char *fmtstr, ...);
 // monitor print line
 enum {
     MPL_TITLE,
-    MPL_ROOTDEV,
     MPL_CLOCK,
     MPL_KEYBOARD,
     MPL_IDE,
index cd8802bc82cbf8fc239e88e61144dadfb88c243c..016d433ff8a119f4e0a8e76b9d23ee671451b8c5 100644 (file)
@@ -35,7 +35,6 @@ extern void setup_ext2();
 
 extern void reboot();
 extern void cnsl_init();
-extern void init_ttys();
 
 #define VERSION "0.3.1"
 const char *version = "Kernel version " VERSION " @ " BUILDER
@@ -46,8 +45,6 @@ const char *version = "Kernel version " VERSION " @ " BUILDER
                       "\n";
 
 void setup_kernel() {
-    init_ttys();
-
     printk("sysenter esp mode: %s\n",
 #if FIX_SYSENTER_ESP_MODE
            "fixed to &tss.esp0"
@@ -72,7 +69,6 @@ void setup_kernel() {
     cnsl_init();
 
     printl(MPL_TITLE, "                                 KERNEL MONITOR");
-    printl(MPL_ROOTDEV, "root device %08x", system.root_dev);
 
     setup_tasks();
 
@@ -97,4 +93,4 @@ void setup_under_irq() {
     ata_init();
     return;
     setup_fs();
-}
\ No newline at end of file
+}
index f10f56942f7bac170ee00ef53e8a5c5482a6ae6a..11a23f508dd24407c868957dcfae6d7493f83e76 100644 (file)
@@ -18,7 +18,8 @@
 // 而一屏所需要的显存为 80*25*2 = 4000 约为4K
 // 所以大致可以分出8个tty
 // 每个的起始地址以0x1000对齐
-#define VADDR ((unsigned long)pa2va(0xB8000))
+const uint32_t PHY_VADDR = 0xB8000;
+#define VADDR ((uint32_t)pa2va(PHY_VADDR))
 #define TTY_VRAM_SIZE (0x1000)
 
 #define MAX_X 80
@@ -61,6 +62,14 @@ void __tty_set_next_pos_color(tty_t *tty, char color) {
     }
 }
 
+void init_default_tty_before_paging() {
+    default_tty.fg_color = TTY_FG_HIGHLIGHT | TTY_GREEN;  // 高亮
+    default_tty.bg_color = TTY_BLACK;                     // 不闪
+    default_tty.base_addr = PHY_VADDR;
+    default_tty.xpos = 0;
+    default_tty.ypos = 0;
+}
+
 void init_tty(tty_t *tty, const char *name, unsigned long base) {
     assert(0 != tty);
 
@@ -75,19 +84,30 @@ void init_tty(tty_t *tty, const char *name, unsigned long base) {
 }
 
 void init_ttys() {
+    assert(irq_disabled());
+
+    // 先备份default_tty在分页前用到的xpos, ypos
+    unsigned int xpos = default_tty.xpos;
+    unsigned int ypos = default_tty.ypos;
+
     init_tty(&default_tty, "tty.default", VADDR + 0 * TTY_VRAM_SIZE);
     init_tty(&monitor_tty, "tty.monitor", VADDR + 1 * TTY_VRAM_SIZE);
+    init_tty(&debug_tty, "tty.debug", VADDR + 7 * TTY_VRAM_SIZE);
 
     monitor_tty.fg_color = TTY_FG_HIGHLIGHT | TTY_WHITE;
     monitor_tty.bg_color = TTY_BLUE;
-    tty_clear(&monitor_tty);
-
-    current_tty = &default_tty;
 
-    init_tty(&debug_tty, "tty.debug", VADDR + 7 * TTY_VRAM_SIZE);
     debug_tty.fg_color = TTY_FG_HIGHLIGHT | TTY_WHITE;
     debug_tty.bg_color = TTY_CYAN;
+
+    tty_clear(&monitor_tty);
     tty_clear(&debug_tty);
+
+    // 恢复在分页前的输出位置
+    default_tty.xpos = xpos;
+    default_tty.ypos = ypos;
+
+    current_tty = &default_tty;
 }
 
 void tty_do_scroll_up(tty_t *tty) {
@@ -240,4 +260,4 @@ void tty_switch(tty_t *tty) {
     tty_set_cursor(current_tty);
 }
 
-tty_t *current_tty;
\ No newline at end of file
+tty_t *current_tty;
index 92e9f7ad7a368b9f45691a0505ab50300b97c578..a4f09d7f4196facd98dad2a17221ebfae5e91f17 100644 (file)
 static void e820_print_type(unsigned long type) {
     switch (type) {
     case E820_RAM:
-        printk("usable");
+        printk("RAM");
         break;
     case E820_RESERVED:
-        printk("reserved");
+        printk("RESERVED");
         break;
     case E820_ACPI:
-        printk("ACPI data");
+        printk("ACPI");
         break;
     case E820_NVS:
-        printk("ACPI NVS");
+        printk("NVS");
         break;
     case E820_UNUSABLE:
-        printk("unusable");
+        printk("UNUSABLE");
         break;
     default:
         printk("type %x", type);
@@ -203,7 +203,6 @@ void init_bootmem() {
     e820_print_map();
     e820_init_bootmem_data();
     init_bootmem_allocator();
-    // asm("cli;hlt;");
 }
 
 // 由于只有在构建buddy system的时候才会用到
diff --git a/mm/mm.c b/mm/mm.c
index 1626bb68e77a2336b1c5e2d21778f67968d23ec2..7d063738b3419a8ed5fe6b9ccea450e56aac033f 100644 (file)
--- a/mm/mm.c
+++ b/mm/mm.c
@@ -119,6 +119,8 @@ void init_paging() {
     // }
 }
 
+extern void init_ttys();
+
 void init_mm() {
     printk("init bootmem alloc...\n");
     extern void init_bootmem();
@@ -126,6 +128,11 @@ void init_mm() {
     printk("init global paging...\n");
     init_paging();
 
+    // 只能将这个调用放在此处
+    // 在这之前是没开启页映射用的是物理地址
+    // 在这之后需要用到线性地址来定位显存
+    init_ttys();
+
     printk("init buddy system...\n");
     extern void init_buddy_system();
     init_buddy_system();