]> Zhao Yanbai Git Server - kernel.git/commitdiff
进一步解决在启动初期printk无法正常显示的问题;在boot阶段引入临时时钟中断以限制输出信息过快
authoracevest <zhaoyanbai@126.com>
Tue, 30 May 2023 12:16:56 +0000 (20:16 +0800)
committeracevest <zhaoyanbai@126.com>
Tue, 30 May 2023 12:17:50 +0000 (20:17 +0800)
21 files changed:
Makefile
boot/boot.c
boot/multiboot.S
drivers/ide.c
drivers/keyboard.c
include/i8259.h
include/irq.h
include/printk.h
include/system.h
kernel/entry.S
kernel/fork.c
kernel/i8259.c
kernel/interrupts.S
kernel/setup.c
kernel/system.c
kernel/task_root.c
kernel/task_user.c
kernel/tty.c
lib/lib.c
mm/bootmem.c
mm/mm.c

index e295b1f537da0eae288b5df2b18c472e9ca7e1cb..5f727f787259089a5d1cecd936895f78cf0a66d2 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -42,7 +42,7 @@ OBJS := $(patsubst %,%.o,$(SOURCE_FILES))
 ${KERNELBIN}: ${OBJS}
        ${LD} -z noexecstack -m elf_i386 -M -T$(LINKSCRIPT) $(OBJS) -o $@ > $(SYSTEMMAP)
        nm -a $@ > kernel.sym
-       rm kernel/setup.c.o
+       #rm kernel/setup.c.o
 
 %.S.o: %.S ${HEADER_FILES}
        ${CC} ${CFLAGS} $< -o $@
index e7510a0c746d764c7fb4ec55c739dff3a093bcab..665261108b127d8840043710fa8e8d5e640a77d2 100644 (file)
@@ -21,18 +21,71 @@ struct boot_params boot_params __attribute__((aligned(32)));
 
 void parse_cmdline(const char *cmdline);
 void init_vbe(void *, void *);
+
+// ticks < 0 代表永远等待
+void boot_delay(int ticks) {
+    char chs[] = {'\\', '-', '/', '-'};
+    uint32_t cnt = 0;
+
+    printk(" ");
+    asm("sti;");
+    while (true) {
+        if (ticks == 0) {
+            break;
+        }
+
+        if (ticks > 0) {
+            ticks--;
+        }
+
+        printk("\b%c", chs[(cnt++ / 3) % sizeof(chs)]);
+        asm("hlt");
+    }
+    asm("cli;");
+    printk("\b \b");
+}
+
+void init_ttys();
+void setup_gdt();
+void setup_idt();
+void setup_gates();
+void set_tss();
+void setup_i8253(uint16_t);
+void setup_boot_irqs();
+
 void check_kernel(unsigned long addr, unsigned long magic) {
+    init_ttys();
+
+    printk("setup gdt\n");
+    setup_gdt();
+
+    printk("setup idt\n");
+    setup_idt();
+
+    printk("setup trap and interrupt gates\n");
+    setup_gates();
+
+    // 在初始化阶段一直运行在特权级0上
+    // 在正在进入用户态前,所有中断都不会涉及特权级变化
+    // 自然就不会有栈切换
+    // 因此这里set_tss里的tss.esp0是不用初始化的
+    set_tss();
+
+    setup_boot_irqs();
+
+    setup_i8253(100);
+
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
+
     if (magic != MULTIBOOT2_BOOTLOADER_MAGIC) {
         printk("Your boot loader does not support multiboot.\n");
-        while (1) {
-        }
+        boot_delay(-1);
     }
-
     unsigned long total_size = *((unsigned long *)addr);
     struct multiboot_tag *tag = (struct multiboot_tag *)(addr + 8);  // 跳过中间的 reserved 字段
 
     printk("total size: %d tags: %x\n", total_size, tag);
-
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
     struct multiboot_tag_basic_meminfo *mminfo = 0;
     struct multiboot_tag_bootdev *bootdev = 0;
     struct multiboot_tag_mmap *mmap_tag = 0;
@@ -96,6 +149,8 @@ void check_kernel(unsigned long addr, unsigned long magic) {
         unsigned long size = (tag->size + 7) & (~7UL);
         tag = (struct multiboot_tag *)(((unsigned long)tag) + size);
     }
+
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 #if 0
     multiboot_info_t *mbi = (multiboot_info_t *)addr;
 
@@ -130,13 +185,15 @@ void check_kernel(unsigned long addr, unsigned long magic) {
     }
 
     init_boot_params(mbi);
+
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 #endif
 }
 
 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;
@@ -148,4 +205,6 @@ 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);
+
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 }
index 6616ee87baf64c2b17e13c064a6fc1652f6900a0..aad20a0e905b07b70d94b5109f9f4038a6b4f98d 100644 (file)
@@ -20,7 +20,6 @@
 .global kernel_entry
 .global main
 .extern check_kernel
-.extern init_default_tty_before_paging
 .extern init_system_info
 .extern setup_kernel
 .extern init_pgd
@@ -130,7 +129,6 @@ Label:
     addl    $8, %esp
 
     movl    $root_task + TASK_SIZE, %esp
-    call    init_default_tty_before_paging
     call    init_system_info
 
     call    setup_kernel
index 61bb7daeefe05795fd438b1890e77f14d1541c94..b314272be207fa450b67bc5540ea53b5da71946d 100644 (file)
@@ -169,7 +169,7 @@ void ide_pci_init(pci_device_t *pci) {
 
     ide_pci_controller.pci = pci;
 
-    printk("channel0: cmd %04x ctl %04x channel1: cmd %04x ctl %04x\n", ATA_CHL0_CMD_BASE, ATA_CHL0_CTL_BASE,
+    printd("channel0: cmd %04x ctl %04x channel1: cmd %04x ctl %04x\n", ATA_CHL0_CMD_BASE, ATA_CHL0_CTL_BASE,
            ATA_CHL1_CMD_BASE, ATA_CHL1_CTL_BASE);
     // printl(18, "channel0: cmd %04x ctl %04x channel1: cmd %04x ctl %04x", HD_CHL0_CMD_BASE, HD_CHL0_CTL_BASE,
     // HD_CHL1_CMD_BASE, HD_CHL1_CTL_BASE);
index 5c4450613e306232b0a191bfcc8428ac11e704ae..dea5b29324bcdeccaf34af3b481aaa54a8dc44eb 100644 (file)
@@ -82,7 +82,7 @@ void kbd_debug(uint8_t scan_code) {
         // reboot();
     }
 
-    printd("[%02x]", scan_code);
+    // printd("[%02x]", scan_code);
 
     if (scan_code == 0x3B) {  // F1
         tty_switch(&default_tty);
index c18fa12702f4a1e0ea83203985bcaceed84fdd50..8a5108d5d51bb6d5ad53070ec7a8d5a80fc94b8c 100644 (file)
 extern void init_i8259();
 extern void mask_i8259();
 
+int enable_i8259_irq(unsigned int irq);
+int disable_i8259_irq(unsigned int irq);
+void mask_ack_i8259_irq(unsigned int irq);
+void ack_i8259_irq(unsigned int irq);
+
 #if 0
 =Programmable Interrupt Controller=
 
index 034ca1a9c941863b310a304f150b78198ad06179..c96eae49966d869bea5651f27c49e725f8688eba 100644 (file)
@@ -75,4 +75,9 @@ bool irq_disabled();
         __asm__ __volatile__("pushl %0; popfl" ::"g"(x) : "memory", "cc"); \
     } while (0)
 
+#define IRQ_CLOCK 0x00
+#define IRQ_KEYBOARD 0x01
+#define IRQ_CASCADE 0x02
+#define IRQ_DISK 0x0E
+
 #endif  //_IRQ_H
index 00efc26da54ef2f1e66becec40a04c6036eca0de..5b2908cb90dbfd30be4f29fc7ec590908e427d76 100644 (file)
@@ -52,3 +52,5 @@ enum {
     MPO_KEYBOARD = 50,
     MPO_IDE = 1,
 };
+
+int sprintf(char *str, const char *fmtstr, ...);
index a40cc795bead6c1ab01e3e985f5acaa16af1a847..7e920eb02223c5c9666f20cac8192aa068b191dd 100644 (file)
@@ -70,14 +70,8 @@ void kfree(void *addr);
 
 extern char etext, edata, end;
 
-extern char gdtr[6], idtr[6];
-#define lgdt() __asm__ __volatile__("lgdt gdtr")
-#define sgdt() __asm__ __volatile__("sgdt gdtr")
-#define lidt() __asm__ __volatile__("lidt idtr")
-#define sidt() __asm__ __volatile__("sidt idtr")
-
-#define cli() __asm__ __volatile__("cli")
-#define sti() __asm__ __volatile__("sti")
+#define cli() asm volatile("cli")
+#define sti() asm volatile("sti")
 #define nop() asm volatile("nop")
 #define mb() asm volatile("" ::: "memory")
 #define disableIRQ() cli()
@@ -271,6 +265,9 @@ void disk_task_entry();
 void user_task_entry();
 
 extern volatile int reenter;
+
+#define DEFAULT_BOOT_DELAY_TICKS 30
+void boot_delay(int ticks);
 #endif
 
 #endif  //_SYSTEM_H
index 32a5d683a349ac2d354a6fd5156ee25063fa809a..4c0089503f0f2685c896be52a72fab1044550df0 100644 (file)
@@ -1,16 +1,16 @@
 /*
  *--------------------------------------------------------------------------
  *   File Name: entry.S
- * 
+ *
  * Description: none
- * 
- * 
+ *
+ *
  *      Author: Zhao Yanbai [zhaoyanbai@126.com]
- * 
+ *
  *     Version:    1.0
  * Create Date: Thu Jul 09 19:56:40 2009
  * Last Update: Thu Jul 09 19:56:40 2009
- * 
+ *
  *--------------------------------------------------------------------------
  */
 #define ASM
@@ -70,4 +70,3 @@ ERRORCODE    (StackFault)
 ERRORCODE    (GeneralProtection)
 ERRORCODE    (PageFault)
 NOERRCODE    (CoprocError)
-
index e49942a3cfe5586878bd4a0c09f77f35396a34c4..d600f7320e9ccfb6d36992690aad0191ca92fd03 100644 (file)
@@ -22,7 +22,7 @@ int do_fork(pt_regs_t *regs, unsigned long flags) {
     task_union *tsk;
     tsk = alloc_task_union();
 
-    printk("fork task %08x flags %08x\n", tsk, flags);
+    printd("fork task %08x flags %08x\n", tsk, flags);
     if (tsk == NULL) {
         panic("can not malloc PCB");
     }
@@ -95,7 +95,7 @@ int do_fork(pt_regs_t *regs, unsigned long flags) {
 
     pt_regs_t *child_regs = ((pt_regs_t *)(TASK_SIZE + (unsigned long)tsk)) - 1;
 
-    printk("child regs: %x %x\n", child_regs, regs);
+    printd("child regs: %x %x\n", child_regs, regs);
     memcpy(child_regs, regs, sizeof(*regs));
 
     tsk->esp0 = TASK_SIZE + (unsigned long)tsk;
@@ -109,7 +109,7 @@ int do_fork(pt_regs_t *regs, unsigned long flags) {
     child_regs->eax = 0;
     child_regs->eflags |= 0x200;  // enable IF
 
-    printk("tsk %08x child_regs esp %08x esp0 %08x\n", tsk, tsk->esp, tsk->esp0);
+    printd("task %08x child_regs esp %08x esp0 %08x\n", tsk, tsk->esp, tsk->esp0);
 
     tsk->state = TASK_INITING;
 
@@ -124,4 +124,4 @@ int do_fork(pt_regs_t *regs, unsigned long flags) {
     return (int)tsk->pid;
 }
 
-int sysc_fork(pt_regs_t regs) { return do_fork(&regs, 0); }
\ No newline at end of file
+int sysc_fork(pt_regs_t regs) { return do_fork(&regs, 0); }
index 1c01157a25b2d006a6d71fe9d57c89f722ae5088..73078dc9a56d3073ee3cf30e7db3559584fa6dff 100644 (file)
@@ -138,3 +138,21 @@ irq_chip_t i8259_chip = {
 };
 
 void do_i8259_IRQ(pt_regs_t *regs, unsigned int irq) {}
+
+__attribute__((regparm(1))) void boot_irq_handler(pt_regs_t *regs) {
+    unsigned int irq = regs->irq;
+    if (irq != 0 && irq != 1) {
+        panic("invalid irq %d\n", irq);
+    }
+
+    assert(irq_disabled());
+
+    // 屏蔽当前中断
+    disable_i8259_irq(irq);
+
+    // 发送EOI
+    ack_i8259_irq(irq);
+
+    // 解除屏蔽当前中断
+    enable_i8259_irq(irq);
+}
index f480ff3a9db7aa5b7a1f5487ee2aaaddae4a4e52..8bc701b2eacf95b7d675303e20a440b74e619dc5 100644 (file)
@@ -1,16 +1,16 @@
 /*
  *--------------------------------------------------------------------------
  *   File Name: interrupts.S
- * 
+ *
  * Description: none
- * 
- * 
+ *
+ *
  *      Author: Zhao Yanbai [zhaoyanbai@126.com]
- * 
+ *
  *     Version:    1.0
  * Create Date: Thu Jul 16 18:54:08 2009
  * Last Update: Wed Feb 10 23:10:56 2010
- * 
+ *
  *--------------------------------------------------------------------------
  */
 #define ASM
@@ -29,7 +29,7 @@ jmp     _irq_handler;
 .global no_irq_handler
 no_irq_handler:
 pushl   $0xFFFFFFFF
-jmp     _irq_handler
+jmp     _boot_irq_handler
 
 
 DEF_IRQ(0,0)
@@ -67,7 +67,41 @@ _irq_handler:
 
     movl    %esp, %eax
     call    irq_handler
-    
+
     RESTORE_REGS
     addl    $4, %esp
-    iret
\ No newline at end of file
+    iret
+
+
+
+.extern boot_irq_handler
+_boot_irq_handler:
+    SAVE_REGS
+
+    // ebp指向栈桢
+    movl    $-TASK_SIZE, %ebp
+    andl    %esp, %ebp
+
+    movw    %ss, %ax
+    movw    %ax, %ds
+    movw    %ax, %es
+    movw    %ax, %fs
+    movw    %ax, %gs
+
+    movl    %esp, %eax
+    call    boot_irq_handler
+
+    RESTORE_REGS
+    addl    $4, %esp
+    iret
+
+
+.global _boot_clk_irq_handler
+.global _boot_kbd_irq_handler
+
+_boot_clk_irq_handler:
+    push $0x00;
+    jmp _boot_irq_handler
+_boot_kbd_irq_handler:
+    push $0x01;
+    jmp _boot_irq_handler
index 016d433ff8a119f4e0a8e76b9d23ee671451b8c5..4270530e7ce7133c74c4de8db2cc16c027841800 100644 (file)
@@ -56,32 +56,35 @@ void setup_kernel() {
     init_mm();
 
     // printk("kernel: %08x - %08x\n", system.kernel_begin, system.kernel_end);
-
-    setup_gdt();
-    setup_idt();
-    setup_gate();
-    set_tss();
-
-    setup_i8253(100);
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
     setup_sysc();
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
     cnsl_init();
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
     printl(MPL_TITLE, "                                 KERNEL MONITOR");
 
     setup_tasks();
-
-    setup_irqs();
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
     setup_pci();
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
     detect_cpu();
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
     printk(version);
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
     extern tty_t monitor_tty;
-    tty_switch(&monitor_tty);
+    // tty_switch(&monitor_tty);
+
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
+
+    setup_i8253(100);
+    setup_irqs();
 
     void ide_init();
     ide_init();
index 53b72dde2b213bf399882289273e6e975b3acb3e..4bd43a2c1acae107f467f67eacac11a9a316ae58 100644 (file)
 #include <syscall.h>
 #include <system.h>
 
+System system;
+TSS_t tss;
+Desc idt[NIDT] __attribute__((__aligned__(8)));
+Desc gdt[NGDT] __attribute__((__aligned__(8)));
+char gdtr[6] __attribute__((__aligned__(4)));
+char idtr[6] __attribute__((__aligned__(4)));
+
+extern char _gdtr[6];
+extern char _idtr[6];
+
+volatile int reenter = -1;
+
+#if 0
+void setup_gdt_before_pageing() {
+    pDesc pdesc;
+    // change to new gdt.
+    asm volatile("sgdt _gdtr");
+    Desc *_gdt = (Desc *)va2pa(gdt);
+    memcpy((void *)_gdt, (void *)(_gdtr + 2), *((uint16_t *)(_gdtr + 0)));
+
+    //
+    *((uint16_t *)(_gdtr + 0)) = NGDT * sizeof(Desc);
+    *((uint32_t *)(_gdtr + 2)) = (uint32_t)_gdt;
+    asm volatile("sgdt _gdtr");
+    memcpy(_gdt + INDEX_UCODE, _gdt + INDEX_KCODE, sizeof(Desc));
+    memcpy(_gdt + INDEX_UDATA, _gdt + INDEX_KDATA, sizeof(Desc));
+    pdesc = _gdt + INDEX_UCODE;
+    pdesc->seg.DPL = 3;
+    pdesc = _gdt + INDEX_UDATA;
+    pdesc->seg.DPL = 3;
+}
+#endif
+
 void setup_gdt() {
     pDesc pdesc;
     // change to new gdt.
-    sgdt();
-    memcpy(gdt, (void *)pa2va(*((unsigned long *)(gdtr + 2))), *((unsigned short *)gdtr));
+    asm volatile("sgdt gdtr");
+
+    // 复制旧的GDT
+    memcpy(gdt, (void *)pa2va(*((uint32_t *)(gdtr + 2))), *((uint16_t *)(gdtr + 0)));
     *((unsigned short *)gdtr) = NGDT * sizeof(Desc);
     *((unsigned long *)(gdtr + 2)) = (unsigned long)gdt;
-    lgdt();
+
+    asm volatile("lgdt gdtr");
+
     memcpy(gdt + INDEX_UCODE, gdt + INDEX_KCODE, sizeof(Desc));
     memcpy(gdt + INDEX_UDATA, gdt + INDEX_KDATA, sizeof(Desc));
     pdesc = gdt + INDEX_UCODE;
@@ -42,14 +79,16 @@ void setup_gdt() {
     pdesc->seg.DPL = 3;
 }
 
+// 中断门和陷阱门的区别是
+// 通过中断门进入中断服务程序CPU会自动将中断关闭,也就是将EFLAGS的IF位清0
+// 通过陷阱门进入服务程序时则维持IF标志位不变
 void setup_idt() {
     *((unsigned short *)idtr) = NIDT * sizeof(Gate);
     *((unsigned long *)(idtr + 2)) = (unsigned long)idt;
-    lidt();
+    asm volatile("lidt idtr");
 }
 
-void setup_gate() {
-    int i;
+void setup_gates() {
     set_sys_int(0x00, TRAP_GATE, PRIVILEGE_KRNL, DivideError);
     set_sys_int(0x01, TRAP_GATE, PRIVILEGE_KRNL, Debug);
     set_sys_int(0x02, INTR_GATE, PRIVILEGE_KRNL, NMI);
@@ -67,10 +106,22 @@ void setup_gate() {
     set_sys_int(0x0E, TRAP_GATE, PRIVILEGE_KRNL, PageFault);
     set_sys_int(0x10, TRAP_GATE, PRIVILEGE_KRNL, CoprocError);
 
-    for (i = 0x11; i < 0x20; i++) set_sys_int(i, INTR_GATE, PRIVILEGE_KRNL, no_irq_handler);
+    for (int i = 0x11; i < 0x20; i++) {
+        set_sys_int(i, INTR_GATE, PRIVILEGE_KRNL, no_irq_handler);
+    }
+
+    for (int i = 0x20; i < 256; i++) {
+        set_sys_int(i, INTR_GATE, PRIVILEGE_KRNL, no_irq_handler);
+    }
+}
+
+void ide_irq();
+
+void default_irq_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) { printk("default irq handler %d \n", irq); }
 
-    for (i = 0x20; i < 256; i++) set_sys_int(i, INTR_GATE, PRIVILEGE_KRNL, no_irq_handler);
+void init_i8259();
 
+void setup_irqs() {
     set_sys_int(0x20, INTR_GATE, PRIVILEGE_KRNL, irq_0x00_handler);
     set_sys_int(0x21, INTR_GATE, PRIVILEGE_KRNL, irq_0x01_handler);
     set_sys_int(0x22, INTR_GATE, PRIVILEGE_KRNL, irq_0x02_handler);
@@ -87,15 +138,6 @@ void setup_gate() {
     set_sys_int(0x2D, INTR_GATE, PRIVILEGE_KRNL, irq_0x0D_handler);
     set_sys_int(0x2E, INTR_GATE, PRIVILEGE_KRNL, irq_0x0E_handler);
     set_sys_int(0x2F, INTR_GATE, PRIVILEGE_KRNL, irq_0x0F_handler);
-}
-
-void ide_irq();
-
-void default_irq_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) { printk("default irq handler %d \n", irq); }
-
-void setup_irqs() {
-    extern void init_i8259();
-    init_i8259();
 
     for (int i = 0; i < NR_IRQS; i++) {
         irq_desc[i] = no_irq_desc;
@@ -125,12 +167,27 @@ void setup_irqs() {
 
     // 清除8259A的级连中断引脚的中断屏蔽位
     // 以让从片的中断在放开后能发送到CPU
-    open_irq(2);
+    open_irq(IRQ_CASCADE);
 
     // 打开支持的中断
-    open_irq(0x00);
-    open_irq(0x01);
-    open_irq(0x0E);
+    open_irq(IRQ_CLOCK);
+    open_irq(IRQ_KEYBOARD);
+    open_irq(IRQ_DISK);
+}
+
+void boot_irq_handler();
+void setup_boot_irqs() {
+    init_i8259();
+
+    // clock
+    set_sys_int(0x20 + IRQ_CLOCK, INTR_GATE, PRIVILEGE_KRNL, _boot_clk_irq_handler);
+
+    // keyboard
+    set_sys_int(0x20 + IRQ_KEYBOARD, INTR_GATE, PRIVILEGE_KRNL, _boot_kbd_irq_handler);
+
+    // 打开支持的中断
+    enable_i8259_irq(IRQ_CLOCK);
+    enable_i8259_irq(IRQ_KEYBOARD);
 }
 
 void set_tss_gate(u32 vec, u32 addr, u32 limit) {
@@ -185,12 +242,3 @@ int sysc_reboot(int mode) {
 
     return 0;
 }
-
-System system;
-TSS_t tss;
-Desc idt[NIDT] __attribute__((__aligned__(8)));
-Desc gdt[NGDT] __attribute__((__aligned__(8)));
-char gdtr[6] __attribute__((__aligned__(4)));
-char idtr[6] __attribute__((__aligned__(4)));
-
-volatile int reenter = -1;
\ No newline at end of file
index fcde446d8f3bf3bbff07866401f78765cf1fb51b..4baa76819a48458bb1b964c50802afe18187f694 100644 (file)
@@ -46,7 +46,7 @@ void kernel_task(char *name, void *entry) {
 
     int pid = do_fork(&regs, FORK_KRNL);
 
-    printk("kernel[%s] task pid is %d\n", name, pid);
+    printd("kernel[%s] task pid is %d\n", name, pid);
 }
 
 // 测试用的代码
@@ -178,4 +178,4 @@ void root_task_entry() {
     while (1) {
         asm("hlt;");
     }
-}
\ No newline at end of file
+}
index 1545db92a5c1e19edaf40d6824ce7988c62348b4..d5ec98e194eb4816d58e0e1c7aa67cb49d041bab 100644 (file)
@@ -64,8 +64,8 @@ void user_task_entry() {
 
     unsigned long *p = (unsigned long *)(pa2va(current->cr3));
 
-    printk("page dir : %x %x %x %x\n", p, pt_text_page, ring3_text_page);
-    printk("pt bss page %x %x", pt_bss_page, ring3_bss_page);
+    printd("page dir : %x %x %x %x\n", p, pt_text_page, ring3_text_page);
+    printd("pt bss page %x %x", pt_bss_page, ring3_bss_page);
 
     // text: 0x0800_0000
     //  bss: 0x3000_0000
@@ -84,4 +84,4 @@ void user_task_entry() {
     // eip --> edx
     // esp --> ecx
     asm volatile("sysexit;" ::"d"(0x08000000), "c"(0x30000000 + PAGE_SIZE - 100));
-}
\ No newline at end of file
+}
index 11a23f508dd24407c868957dcfae6d7493f83e76..8c0a2897c93fa823f26634d2184b87dcd7b1de9a 100644 (file)
@@ -19,7 +19,7 @@
 // 所以大致可以分出8个tty
 // 每个的起始地址以0x1000对齐
 const uint32_t PHY_VADDR = 0xB8000;
-#define VADDR ((uint32_t)pa2va(PHY_VADDR))
+const uint32_t VADDR = (uint32_t)pa2va(PHY_VADDR);
 #define TTY_VRAM_SIZE (0x1000)
 
 #define MAX_X 80
@@ -62,14 +62,6 @@ 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);
 
@@ -81,6 +73,12 @@ void init_tty(tty_t *tty, const char *name, unsigned long base) {
     tty->bg_color = TTY_BLACK;                     // 不闪
 
     tty->base_addr = base;
+
+    for (int i = 0; i < TTY_VRAM_SIZE; i += 2) {
+        uint8_t *p = (uint8_t *)base;
+        p[i + 0] = ' ';
+        p[i + 1] = (tty->bg_color << 4) | tty->fg_color;
+    }
 }
 
 void init_ttys() {
@@ -103,10 +101,6 @@ void init_ttys() {
     tty_clear(&monitor_tty);
     tty_clear(&debug_tty);
 
-    // 恢复在分页前的输出位置
-    default_tty.xpos = xpos;
-    default_tty.ypos = ypos;
-
     current_tty = &default_tty;
 }
 
index 6c1fec690c5a1f8b5b05f9b46c1e6b7da59a6839..80c515bb08765f24df020373ca920aef65182b24 100644 (file)
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -33,3 +33,12 @@ int systest() { return syscall0(SYSC_TEST); }
 int sysdebug(unsigned int v) { return syscall1(SYSC_DEBUG, v); }
 
 int pause(unsigned long tick) { return syscall1(SYSC_PAUSE, tick); }
+
+int vsprintf(char *buf, const char *fmt, char *args);
+int sprintf(char *str, const char *fmtstr, ...) {
+    char *args = (char *)(((char *)&fmtstr) + 4);
+
+    vsprintf(str, fmtstr, args);
+
+    return 0;
+}
index a4f09d7f4196facd98dad2a17221ebfae5e91f17..c8d2f52df5b1d98bde21b29caf03c0fa0b6d64d9 100644 (file)
 #include <string.h>
 #include <system.h>
 
-static void e820_print_type(unsigned long type) {
+static void get_e820_size(uint32_t size, char *buf) {
+    const char *fmt = "%3u %s";
+    if (size < (1 << 10)) {
+        sprintf(buf, fmt, size, "B");
+    } else if (size < (1 << 20)) {
+        sprintf(buf, fmt, size >> 10, "KB");
+    } else if (size < (1 << 30)) {
+        sprintf(buf, fmt, size >> 20, "MB");
+    } else {
+        sprintf(buf, fmt, size >> 30, "GB");
+    }
+}
+
+// static void e820_print_type(unsigned long type) {
+//     switch (type) {
+//     case E820_RAM:
+//         printk("RAM");
+//         break;
+//     case E820_RESERVED:
+//         printk("RESERVED");
+//         break;
+//     case E820_ACPI:
+//         printk("ACPI");
+//         break;
+//     case E820_NVS:
+//         printk("NVS");
+//         break;
+//     case E820_UNUSABLE:
+//         printk("UNUSABLE");
+//         break;
+//     default:
+//         printk("type %x", type);
+//         break;
+//     }
+// }
+
+static void get_e820_type(uint32_t type, char *buf) {
     switch (type) {
     case E820_RAM:
-        printk("RAM");
+        sprintf(buf, "%s", "RAM");
         break;
     case E820_RESERVED:
-        printk("RESERVED");
+        sprintf(buf, "%s", "RESERVED");
         break;
     case E820_ACPI:
-        printk("ACPI");
+        sprintf(buf, "%s", "ACPI");
         break;
     case E820_NVS:
-        printk("NVS");
+        sprintf(buf, "%s", "NVS");
         break;
     case E820_UNUSABLE:
-        printk("UNUSABLE");
+        sprintf(buf, "%s", "UNUSABLE");
         break;
     default:
-        printk("type %x", type);
+        sprintf(buf, "type %x", type);
         break;
     }
 }
@@ -63,16 +99,16 @@ void fast_init_bootmem_bitmap(unsigned long bgn_pfn, unsigned long end_pfn, int
 
 void e820_print_map() {
     unsigned int i = 0;
-
     for (i = 0; i < boot_params.e820map.map_cnt; ++i) {
         struct e820_entry *p = boot_params.e820map.map + i;
 
-        printk(" [%02d] 0x%010lX - 0x%010lX size %- 10u %8dKB %5dMB ", i, p->addr, (p->addr + p->size - 1),
-               (uint32_t)p->size, (uint32_t)(p->size >> 10), (uint32_t)(p->size >> 20));
-
-        e820_print_type(p->type);
-
-        printk("\n");
+        // printk(" [%02d] 0x%010lX - 0x%010lX size %- 10u %8dKB %5dMB ", i, p->addr, (p->addr + p->size - 1),
+        //        (uint32_t)p->size, (uint32_t)(p->size >> 10), (uint32_t)(p->size >> 20));
+        char size_buf[16];
+        char type_buf[16];
+        get_e820_size((uint32_t)p->size, size_buf);
+        get_e820_type(p->type, type_buf);
+        printk(" [%02d] 0x%08lX - 0x%08lX %7s %s\n", i, p->addr, (p->addr + p->size - 1), size_buf, type_buf);
     }
 }
 
diff --git a/mm/mm.c b/mm/mm.c
index 7d063738b3419a8ed5fe6b9ccea450e56aac033f..71deb0574c1665672b2a0fcfebc1f6162f136337 100644 (file)
--- a/mm/mm.c
+++ b/mm/mm.c
@@ -125,20 +125,19 @@ void init_mm() {
     printk("init bootmem alloc...\n");
     extern void init_bootmem();
     init_bootmem();
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
     printk("init global paging...\n");
     init_paging();
-
-    // 只能将这个调用放在此处
-    // 在这之前是没开启页映射用的是物理地址
-    // 在这之后需要用到线性地址来定位显存
-    init_ttys();
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
     printk("init buddy system...\n");
     extern void init_buddy_system();
     init_buddy_system();
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 
     printk("init kmem caches...\n");
     extern void init_kmem_caches();
     init_kmem_caches();
     printk("memory init finished...\n");
+    boot_delay(DEFAULT_BOOT_DELAY_TICKS);
 }