]> Zhao Yanbai Git Server - kernel.git/commitdiff
初始化VBE;建立到视频缓冲区物理地址的页映射;并测试
authoracevest <zhaoyanbai@126.com>
Sun, 7 Nov 2021 08:36:21 +0000 (16:36 +0800)
committeracevest <zhaoyanbai@126.com>
Sun, 7 Nov 2021 08:36:21 +0000 (16:36 +0800)
boot/boot.c
boot/multiboot.S
boot/vbe.c
mm/mm.c
scripts/grub.cfg

index 066f34203600f29031031c211d0a459fa17d81cb..62bc897d9ceaf2f9ed7301d28458a4c09390717f 100644 (file)
@@ -20,7 +20,7 @@
 struct boot_params boot_params __attribute__((aligned(32)));
 
 void parse_cmdline(const char *cmdline);
-void init_vbe(void *vmiptr);
+void init_vbe(void *, void *);
 void check_kernel(unsigned long addr, unsigned long magic) {
     if (magic != MULTIBOOT2_BOOTLOADER_MAGIC) {
         printk("Your boot loader does not support multiboot.\n");
@@ -81,10 +81,12 @@ void check_kernel(unsigned long addr, unsigned long magic) {
             void *vmi = (void *)vbe->vbe_mode_info.external_specification;
             // vbe->vbe_control_info;
             // asm volatile("xchg %%bx, %%bx;nop;nop;" ::"a"(vci), "b"(vmi));
-            init_vbe(vmi);
+            // asm volatile("xchg %%bx, %%bx;nop;nop;" ::"a"(vbe->vbe_interface_seg), "b"(vbe->vbe_interface_off),
+            //              "c"(vbe->vbe_interface_len));
+            init_vbe(vci, vmi);
             break;
         case MULTIBOOT_TAG_TYPE_FRAMEBUFFER:
-            asm volatile("xchg %bx, %bx;nop;nop;nop;nop;");
+            // asm volatile("xchg %bx, %bx;nop;nop;nop;nop;");
             break;
         default:
             printk("tag %x size %x\n", tag->type, tag->size);
index 971a19ca0b562b903198ea141a839df034815cf1..4526b67af8eff37c3b5ddf8aeb9855dc78e6a37a 100644 (file)
@@ -167,15 +167,15 @@ multiboot2_header_bgn:
     # checksum
     .long   -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot2_header_end - multiboot2_header_bgn))
 
-    .align 8
-    .framebuffer_tag_bgn:
-    .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER
-    .short MULTIBOOT_HEADER_TAG_OPTIONAL
-    .long .framebuffer_tag_end - .framebuffer_tag_bgn
-    .long 1280
-    .long 800
-    .long 32
-    .framebuffer_tag_end:
+    // .align 8
+    // .framebuffer_tag_bgn:
+    // .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER
+    // .short MULTIBOOT_HEADER_TAG_OPTIONAL
+    // .long .framebuffer_tag_end - .framebuffer_tag_bgn
+    // .long 800
+    // .long 600
+    // .long 32
+    // .framebuffer_tag_end:
 
     .align 8
     .multiboot2_tag_end:
index 18aa2e3add4a0b5a22c1b9c6b5785e86f8727637..d6a6ac4fbabbace805396cb391ea284a6ed6110a 100644 (file)
@@ -11,6 +11,7 @@
 // #include <page.h>
 #include <system.h>
 #include <types.h>
+
 typedef struct vbe_mode_info {
     u16 mode_attributes;
     u8 wina_attributes;
@@ -62,23 +63,10 @@ typedef struct vbe_mode_info {
 // pte_t vbe_pte[PTECNT_PER_PAGE] __attribute__((__aligned__(PAGE_SIZE)));
 
 // extern pde_t init_pgd[];
-void init_vbe(void *vmiptr) {
+void init_vbe(void *vciptr, void *vmiptr) {
     vbe_mode_info_t *vmi = (vbe_mode_info_t *)vmiptr;
+
     system.vbe_phys_addr = vmi->phys_base_ptr;
     system.x_resolution = vmi->x_resolution;
     system.y_resolution = vmi->y_resolution;
-    // unsigned long phys_base_addr = vmi->phys_base_ptr;
-
-    // asm volatile("xchg %%bx, %%bx;nop;" ::"a"(phys_base_addr));
-
-    // init_pgd[phys_base_addr >> 22] = va2pa(vbe_pte) | 7;
-    // asm volatile("xchg %bx, %bx;nop;nop;nop;nop;");
-    // for (int i = 0; i < PTECNT_PER_PAGE; i++) {
-    //     vbe_pte[i] = phys_base_addr + i * PAGE_SIZE + 7;
-    // }
-    // asm volatile("xchg %bx, %bx;nop;nop;nop;nop;");
-    // unsigned long *p = (unsigned long *)phys_base_addr;
-    // for (int i = 0; i < 1024; i++) {
-    //     p[i] = 0x00FF0000;
-    // }
 }
\ No newline at end of file
diff --git a/mm/mm.c b/mm/mm.c
index 1a10d05679476cf488922078d8edd209a6aa59f4..40cf447d5fd2c5561e04ef56ea81574965c410d0 100644 (file)
--- a/mm/mm.c
+++ b/mm/mm.c
@@ -99,11 +99,27 @@ void init_paging() {
 
     LoadCR3(va2pa(init_pgd));
 
-    // 测试显存
-    for (int i = 0; i < 4096; i++) {
-        unsigned long *vram = (unsigned long *)VRAM_VADDR_BASE;
-        vram[i] = 0x00FF0000;
-    }
+    // // 测试显存
+    // for (int i = 0; i < system.x_resolution * (system.y_resolution - 32); i++) {
+    //     unsigned long *vram = (unsigned long *)VRAM_VADDR_BASE;
+    //     vram[i] = 0x000000FF;
+    // }
+
+    // while (1) {
+    //     u16 lineH = 32;
+    //     unsigned long *vram = (unsigned long *)VRAM_VADDR_BASE;
+    //     int sep = system.x_resolution * (system.y_resolution - lineH);
+    //     for (int i = 0; i < sep; i++) {
+    //         vram[i] = vram[i + system.x_resolution * lineH];
+    //     }
+
+    //     unsigned int long color = 0x0000FF;
+    //     color = (vram[0] == 0x0000FF ? 0x00FF00 : 0x0000FF);
+
+    //     for (int i = sep; i < sep + system.x_resolution * lineH; i++) {
+    //         vram[i] = color;
+    //     }
+    // }
 }
 
 void init_mm() {
index e65ad22fca0109e6a4aa6f2874d6f67f2f8af566..55df1a4654b5438e756b0fb999363ead066196f0 100644 (file)
@@ -1,10 +1,9 @@
 set default="0"
 
 set timeout=1
-
 menuentry 'Kernel' --class os {
     #insmod ext2
-    set root='(hd0,msdos1)'
+    set root='(hd0,1)'
     multiboot2 /boot/Kernel root=hda0 delay=2
     boot
 }