打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
学习《操作系统真相还原》三


https://blog.csdn.net/qq_59848320/article/details/128744163?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-128744163-blog-121042836.235%5Ev29%5Epc_relevant_default_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-128744163-blog-121042836.235%5Ev29%5Epc_relevant_default_base3&utm_relevant_index=5

前言

我们开始实现了loader,从mbr跳转到loader。并执行的loader的代码。在屏幕上打印了"2 LOADER"。

1.进入保护模式

保护模式,顾名思义,就是为了让操作系统变的更加安全。相比实模式,在保护模式下也可以充分利用计算机资源。

1.打开A20地址线

IBM为了兼容以前的cpu,必须兼容实模式。在兼容实模式下情况,又要有保护模式。为了解决这个问题,IBM在键盘控制器上的一些输出线来控制第21根地址线。

  1. 如果A20Gate被打开,当访问到0x100000~0x10FFFEF之间的地址时,CPU将真正访问这块内存地址。

  2. 如果A20Gate被打开,当访问到0x100000~0x10FFFEF之间的地址时,CPU采用地址回绕

    1. in al,0x92
    2. or al,0000_0010B
    3. out 0x92,al

打开A20地址只有三行代码

2.打开CR0寄存器的PE位

  1. mov eax, cr0
  2. or eax,0x00000001
  3. mov cr0, eax

代码比较简单,就只有三行。

3.加载全局描述符表GDT

这个是进入保护模式最麻烦的部分。前面说道,保护模式对于实模式来说更加安全。那么如何来保证一些关键的内存不能被用户随便访问了。那这个时候就需要GDT了。将内存映射到这个表里面。并对每一块内存进行说明。保护模式也不是直接影cs:ip来执行代码。而是有个新的玩意,叫选择子,顾名思义,选择子就是在GDT里面选择内存进行访问。这样有个好处,就是比直接用cs:ip进行访问更加安全。

  1.   %include "boot.inc"
  2.   section loader vstart=LOADER_BASE_ADDR
  3.   LOADER_STACK_TOP equ LOADER_BASE_ADDR
  4.   jmp loader_start ; 此处的物理地址是:
  5. ;构建gdt及其内部的描述符
  6.   GDT_BASE:   dd   0x00000000
  7.       dd    0x00000000
  8.   CODE_DESC:  dd    0x0000FFFF
  9.       dd    DESC_CODE_HIGH4
  10.   DATA_STACK_DESC:  dd    0x0000FFFF
  11.     dd    DESC_DATA_HIGH4
  12.   VIDEO_DESC: dd    0x80000007       ;limit=(0xbffff-0xb8000)/4k=0x7
  13.       dd    DESC_VIDEO_HIGH4  ; 此时dpl已改为0
  14.   GDT_SIZE   equ   $ - GDT_BASE
  15.   GDT_LIMIT   equ   GDT_SIZE - 1
  16.   times 60 dq 0 ; 此处预留60个描述符的slot
  17.   SELECTOR_CODE equ (0x0001<<3) + TI_GDT + RPL0         ; 相当于(CODE_DESC - GDT_BASE)/8 + TI_GDT + RPL0
  18.   SELECTOR_DATA equ (0x0002<<3) + TI_GDT + RPL0 ; 同上
  19.   SELECTOR_VIDEO equ (0x0003<<3) + TI_GDT + RPL0 ; 同上
  20.   ;以下是定义gdt的指针,前2字节是gdt界限,后4字节是gdt起始地址
  21.   gdt_ptr  dw  GDT_LIMIT
  22.    dd  GDT_BASE
  23.   loadermsg db '2 loader in real.'
  24.   loader_start:
  25. ;------------------------------------------------------------
  26. ;INT 0x10   功能号:0x13   功能描述:打印字符串
  27. ;------------------------------------------------------------
  28. ;输入:
  29. ;AH 子功能号=13H
  30. ;BH = 页码
  31. ;BL = 属性(若AL=00H或01H)
  32. ;CX=字符串长度
  33. ;(DH、DL)=坐标(行、列)
  34. ;ES:BP=字符串地址
  35. ;AL=显示输出方式
  36. ;   0——字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变
  37. ;   1——字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变
  38. ;   2——字符串中含显示字符和显示属性。显示后,光标位置不变
  39. ;   3——字符串中含显示字符和显示属性。显示后,光标位置改变
  40. ;无返回值
  41.   mov sp, LOADER_BASE_ADDR
  42.   mov bp, loadermsg           ; ES:BP = 字符串地址
  43.   mov cx, 17 ; CX = 字符串长度
  44.   mov ax, 0x1301 ; AH = 13, AL = 01h
  45.   mov bx, 0x001f ; 页号为0(BH = 0) 蓝底粉红字(BL = 1fh)
  46.   mov dx, 0x1800 ;
  47.   int 0x10                    ; 10h 号中断
  48. ;----------------------------------------   准备进入保护模式   ------------------------------------------
  49. ;1 打开A20
  50. ;2 加载gdt
  51. ;3 将cr0的pe位置1
  52.   ;----------------- 打开A20 ----------------
  53.   in al,0x92
  54.   or al,0000_0010B
  55.   out 0x92,al
  56.   ;----------------- 加载GDT ----------------
  57.   lgdt [gdt_ptr]
  58.   ;----------------- cr0第0位置1 ----------------
  59.   mov eax, cr0
  60.   or eax, 0x00000001
  61.   mov cr0, eax
  62.   ;jmp dword SELECTOR_CODE:p_mode_start     ; 刷新流水线,避免分支预测的影响,这种cpu优化策略,最怕jmp跳转,
  63.   jmp  SELECTOR_CODE:p_mode_start     ; 刷新流水线,避免分支预测的影响,这种cpu优化策略,最怕jmp跳转,
  64.     ; 这将导致之前做的预测失效,从而起到了刷新的作用。
  65. [bits 32]
  66. p_mode_start:
  67.   mov ax, SELECTOR_DATA
  68.   mov ds, ax
  69.   mov es, ax
  70.   mov ss, ax
  71.   mov esp,LOADER_STACK_TOP
  72.   mov ax, SELECTOR_VIDEO
  73.   mov gs, ax
  74.   mov byte [gs:160], 'P'
  75.   jmp $

这里的loader.s进行了修改。最后用远跳转刷新流水线,清空段描述符寄存器。

2.编译运行

调用info gdt查看是否建立成功

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
编写自己的操作系统
第11章 保护模式下的程序设计简介
添加LDT数据段, by myself
特权级转移
裸机版的hello world
80386ASM程序设计基础(十一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服