2 Star 6 Fork 4

稀风 / KOS

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
loader26.asm 2.63 KB
一键复制 编辑 原始数据 按行查看 历史
org 0x900
jmp CODE16_START
%include "./bootloader/inc.asm"
%include "./bootloader/common.asm"
; 全局描述符表定义
; 段基址 段界限 段属性
GDT_BASE : Descriptor 0, 0, 0
CODE32_DESC : Descriptor 0, CODE32_SEG_LEN - 1, DA_C + DA_32
FLAT_MODE_DESC : Descriptor 0, 0xFFFFF, DA_DRW + DA_32 + DA_LIMIT_4K
; ...
GDT_LEN equ $ - GDT_BASE ; GDT 长度 = 当前地址 - GDT_BASE 地址
GDT_PTR :
dw GDT_LEN - 1
dd GDT_BASE
; 段选择符定义,RPL = 0; TI = 0
CODE32_SELECTOR equ (0x0001 << 3) + SA_RPL0 + SA_TIG
FLAT_MODE_SELECTOR equ (0x0002 << 3) + SA_RPL0 + SA_TIG
msg db "Loader..." ; 使用 db 定义数据
msgLen equ $-msg ; 字符串 msg 长度
[bits 16]
CODE16_START :
xor ax, ax ; xor 指令与 and or 指令类似,两个操作数的每一对对应位都应用如下操作原则:
; 如果两个位的值相同(同为 0 或同为 1),则结果位等于 0;否则结果位等于 1
; xor ax, ax 等于 ax = 0
mov ss, ax ; 栈段 ss = 0
mov ds, ax ; 数据段 ds = 0
mov es, ax ; 附加数据段 es = 0
mov sp, 0x900 ; 设置栈,跟 0x7c00 一样,0x900 地址以下也有一段安全可用内存
; 设置光标位置 (dl, dh)
mov ah, 0x02 ; AH 功能号 = 0x02,设置光标
mov dh, 0x01 ; 设置光标行号
mov dl, 0x00 ; 设置光标列号
mov bh, 0x00 ; 页码
int 0x10
; 打印 msg
mov ax, msg
mov cx, msgLen
call print
; IOPL = 3
pushf
pop eax
or eax, 0x3000 ; bit12-bit13:11b
push eax
popf
; 初始化段描述符中的段基址
mov esi, CODE32_START
mov edi, CODE32_DESC
call InitDescItem
; 打开 A20 地址线
in al, 0x92
or al, 0000_0010B
out 0x92, al
; 加载描述符表
;mov eax, 0
;mov ax, ds
;shl eax, 4
;add eax, GDT_BASE
;mov dword [GDT_PTR + 2], eax
lgdt [GDT_PTR]
; 通知 CPU 进入保护模式,即将 CR0 寄存器的 PE(bit0) 位置 1
mov eax, cr0
or eax, 0x01
mov cr0, eax
; 刷新流水线
; 跳转到 32 位代码段继续执行
jmp dword CODE32_SELECTOR:0
; 参数: esi --> 代码段标签
; 参数: edi --> 段描述符标签
InitDescItem:
push eax
mov eax, 0
mov ax, cs
shl eax, 4
add eax, esi
mov word [edi + 2], ax
shr eax, 16
mov byte [edi + 4], al
mov byte [edi + 7], ah
pop eax
ret
[bits 32]
CODE32_START :
; jmp dword FLAT_MODE_SELECTOR:KERNEL_START_ADDR
jmp $
CODE32_SEG_LEN equ $-CODE32_START
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/thin-wind/KOS.git
git@gitee.com:thin-wind/KOS.git
thin-wind
KOS
KOS
main

搜索帮助

344bd9b3 5694891 D2dac590 5694891