Bläddra i källkod

fix: fix display bug of protection mode

runningwater 1 år sedan
förälder
incheckning
7b374c0814
5 ändrade filer med 38 tillägg och 38 borttagningar
  1. 5 5
      boot/include/boot.inc
  2. 30 30
      boot/loader.asm
  3. 2 2
      boot/mbr.asm
  4. 1 1
      boot/readme.md
  5. BIN
      hd30M.img

+ 5 - 5
boot/include/boot.inc

@@ -15,13 +15,13 @@ LOADER_START_SECTOR equ 0x2 ; loader 在硬盘上的逻辑扇区地址,即 LBA 
 ; |         Base                |        Limit              |
 ;  ----------------------------------------------------------
 ;
-DESC_G_4K equ 1000_0000_0000_0000_0000_0000b
-DESC_D_32 equ  100_0000_0000_0000_0000_0000b
+DESC_G_4K equ 1000_0000_0000_0000_0000_0000b ; 第23位G 表示4K或者1MB位 段界限的单位值 此时为1则为4k
+DESC_D_32 equ  100_0000_0000_0000_0000_0000b ; 第22位D/B位 表示地址值用32位EIP寄存器 操作数与指令码32位
 
-DESC_L   equ 00_0000_0000_0000_0000_0000b    ; 64 位代码标记,不设置, clear(0)
+DESC_L   equ 00_0000_0000_0000_0000_0000b    ; 第21位 设置成0表示不设置成64位代码段 忽略
 DESC_AVL equ  0_0000_0000_0000_0000_0000b    ; Reserved for future use
 
-DESC_LIMIT_CODE2  equ 11110000000000000000b
+DESC_LIMIT_CODE2  equ 11110000000000000000b  ; 第16-19位 段界限的最后四位 全部初始化为1 因为最大段界限*粒度必须等于0xffffffff
 DESC_LIMIT_DATA2  equ DESC_LIMIT_CODE2
 DESC_LIMIT_VIDEO2 equ 00000000000000000000b
 
@@ -41,7 +41,7 @@ DESC_TYPE_DATA equ 001000000000b    ; x=0,e=0,w=1,a=0 数据段是不可执行
 
 DESC_CODE_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_CODE2 + DESC_P + DESC_DPL_0 + DESC_S_CODE + DESC_TYPE_CODE + 0x00
 DESC_DATA_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_CODE2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x00
-DESC_VIDEO_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_VIDEO2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x00
+DESC_VIDEO_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + DESC_L + DESC_AVL + DESC_LIMIT_VIDEO2 + DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x0b
 
 ; ------------------------------------- 选择子属性 ---------------------------------------------------------------------------------------------------------------
 RPL0 equ 00b

+ 30 - 30
boot/loader.asm

@@ -16,8 +16,8 @@ CODE_DESC: dd 0x0000FFFF
 DATA_STACK_DESC: dd 0x0000FFFF
         dd DESC_DATA_HIGH4
 
-VIDEO_DESC: dd 0x80000007 ; limit=(0xbffff-0xb8000)/4k=0x7
-        dd DESC_VIDEO_HIGH4 ; 此时 dpl 为 0
+VIDEO_DESC: dd 0x80000007   ;limit=(0xbffff-0xb8000)/4k=0x7
+        dd DESC_VIDEO_HIGH4 ;此时 dpl 为 0
 
 GDT_SIZE equ $ - GDT_BASE
 GDT_LIMIT equ GDT_SIZE - 1
@@ -32,7 +32,6 @@ gdt_ptr dw GDT_LIMIT
         dd GDT_BASE
 loadermsg db '2 loader in real.'
 
-loader_start:
 ;----------------------------------------------------------------
 ; INT 0x10  功能号:0x13   功能描述: 打印字符串
 ;----------------------------------------------------------------
@@ -49,44 +48,45 @@ loader_start:
 ;   2 ---- 字符串中含显示字符和显示属性。显示后,光标位置不变
 ;   3 ---- 字符串中含显示字符和显示属性。显示后,光标位置改变
 ; 无返回值
-    mov sp, LOADER_BASE_ADDR
-    mov bp, loadermsg        ; ES:BP = 字符串地址
-    mov cx, 17               ; CX = 字符串长度
-    mov ax, 0x1301           ; AH = 13h, AL = 01h
-    mov bx ,0x001f           ; 页号 0(BH=0)蓝底粉红色(BL=1fh)
-    mov dx, 0x1800           ; 坐标(行,列)
-    int 0x10                 ; 10h 号中断
+loader_start:
+        mov sp, LOADER_BASE_ADDR
+        mov bp, loadermsg        ; ES:BP = 字符串地址
+        mov cx, 17               ; CX = 字符串长度
+        mov ax, 0x1301           ; AH = 13h, AL = 01h
+        mov bx ,0x001f           ; 页号 0(BH=0)蓝底粉红色(BL=1fh)
+        mov dx, 0x1800           ; 坐标(行,列)
+        int 0x10                 ; 10h 号中断
 
 ;---------------------- 准备进入保护模式 ------------------------------------------
 ; 1 打开 A20
 ; 2 加载 GDT
 ; 3 将 cr0 的 pe 位置 1
 
-    ;-------------------------- 打开 A20 --------------------------------
-    in al, 0x92
-    or al, 0000_0010b
-    out 0x92, al
+        ;-------------------------- 打开 A20 --------------------------------
+        in al, 0x92
+        or al, 0000_0010b
+        out 0x92, al
 
-    ;-------------------------- 加载 GDT --------------------------------
-    LGDT [gdt_ptr]
+        ;-------------------------- 加载 GDT --------------------------------
+        lgdt [gdt_ptr]
 
-    ;-------------------------- cr0 第 0 位置 1 --------------------------
-    mov eax, cr0
-    or eax, 0x00000001
-    mov cr0, eax 
+        ;-------------------------- cr0 第 0 位置 1 --------------------------
+        mov eax, cr0
+        or eax, 0x00000001
+        mov cr0, eax 
 
-    jmp dword SELECTOR_CODE:p_mode_start ; 刷新流水线
+        jmp dword SELECTOR_CODE:p_mode_start ; 刷新流水线
 
 [bits 32]
 p_mode_start:
-    mov ax, SELECTOR_DATA
-    mov ds, ax 
-    mov es, ax 
-    mov ss, ax 
-    mov esp, LOADER_STACK_TOP
-    mov ax, SELECTOR_VIDEO
-    mov gs, ax 
+        mov ax, SELECTOR_DATA
+        mov ds, ax 
+        mov es, ax 
+        mov ss, ax 
+        mov esp, LOADER_STACK_TOP
+        mov ax, SELECTOR_VIDEO
+        mov gs, ax 
 
-    mov byte [gs:160], 'P'
+        mov byte [gs:160], 'P'
 
-    jmp $
+        jmp $

+ 2 - 2
boot/mbr.asm

@@ -11,13 +11,13 @@ SECTION MBR vstart=MBR_BASE_ADDR
     mov ax, 0xb800 ;文本模式显示
     mov gs, ax
 
-    ; call clean_display
+    call clean_display
     ; call get_cursor_position
     call disp_string
 	
     mov eax, LOADER_START_SECTOR ; 起始扇区地址: LBA 地址
     mov bx, LOADER_BASE_ADDR ; 写入的地址
-    mov cx, 4 ; 待写入的扇区数(4 个扇区)
+    mov cx, 2 ; 待写入的扇区数(4 个扇区)
     call rd_disk_m_16  ; 读取硬盘数据
 
     jmp LOADER_BASE_ADDR

+ 1 - 1
boot/readme.md

@@ -16,7 +16,7 @@
     ```
 
 3. 将生成的 `loader.bin` 写入硬盘第 2 个扇区。第 0 个扇区是 MBR,第 1 个扇区是空的未使用。`dd if=./loader.bin of=/此处替换成你的安装目录
-/bochs/hd30M.img bs=512 count=1 seek=2 conv=notrunc 回车`
+/bochs/hd30M.img bs=512 count=2 seek=2 conv=notrunc 回车`
 
     ```sh
         (base) ➜  boot git:(master) ✗ dd if=loader.bin of=../hd30M.img bs=512 count=1 seek=2 conv=notrunc

BIN
hd30M.img