Loader设计与实现
1.设计
loader最主要的功能就是检测计算机硬件信息,然后加载操作系统到指定的物理内存0x200000。
因为KePOS操作系统还没有文件系统功能,因此将应用程序简单的保存到了物理内存地址0xd0000000。要将应用程序最终保存到物理内存上,就需要程序实现从软盘FAT12文件系统读取应用程序bin文件(mymain.bin),然后将其保存到物理地址0xd0000000。
2.功能
1.检测计算机SVGA信息,设置SVGA。
2.在软盘上找到kernel.bin,并将其加载到物理地址0x200000。
3.在软盘上找到mymain.bin,并将其加载到物理地址0xd0000000。
4.设置段表,页表,进入64位长模式。
5.跳转到kernel代码处执行。
3.部分代码
1.地址:
;kernel.bin被加载到的内存地址
BaseOfKernelFile equ 0x00
OffsetOfKernelFile equ 0x200000
;mymain.bin被加载到的内存地址
OffsetofuserFile equ 0xd0000000
2.段表:
[SECTION gdt64]
LABEL_GDT64: dq 0x0000000000000000
LABEL_DESC_CODE64: dq 0x0020980000000000
LABEL_DESC_DATA64: dq 0x0000920000000000
GdtLen64 equ $ - LABEL_GDT64
;保存到GDTR寄存器的值
GdtPtr64 dw GdtLen64 - 1
dd LABEL_GDT64
3.页表:
;每条页表项占8B
;PML4页表,基址是90000H
mov dword [0x90000], 0x91007
mov dword [0x90004], 0x00000
mov dword [0x90800], 0x91007
mov dword [0x90804], 0x00000
;PDPT页表
mov dword [0x91000], 0x92007
mov dword [0x91004], 0x00000
;PDT页表,最终的页表。
;本次的页大小的2M,不是4k
mov dword [0x92000], 0x000083
mov dword [0x92004], 0x000000
mov dword [0x92008], 0x200083
mov dword [0x9200c], 0x000000
mov dword [0x92010], 0x400083
mov dword [0x92014], 0x000000
mov dword [0x92018], 0x600083
mov dword [0x9201c], 0x000000
mov dword [0x92020], 0x800083
mov dword [0x92024], 0x000000
mov dword [0x92028], 0xa00083
mov dword [0x9202c], 0x000000
4.建议
推荐阅读:一个64位操作系统的设计与实现----->(第 3 章 BootLoader引导启动程序)