简易开发操作系统内核:利用内核加载器启动
内核加载器:
将一个内核加载器放入到第一扇区,加载器加入到内存中后(加载器中指定了内核的地址),再将内核从软盘中加载到系统内存,跳转到内核的加载地址。假设将编译好的,内核代码放到第一柱面,第二扇区。若内核大小超过512字节,只需在加载器中多读取几个扇区,就可以将系统内核添加到内存中!
内核加载器汇编代码boot.asm:
org 0x7c00;
LOAD_ADDR EQU 0X8000
entry:
mov ax, 0
mov ss, ax
mov ds, ax
mov es, ax
mov si, ax
readFloppy:
mov CH, 1 ;CH 用来存储柱面号
mov DH, 0 ;DH 用来存储磁头号
mov CL, 2 ;CL 用来存储扇区号
mov BX, LOAD_ADDR ; ES:BX 数据存储缓冲区
mov AH, 0x02 ; AH = 02 表示要做的是读盘操作
mov AL, 1 ; AL 表示要练习读取几个扇区
mov DL, 0 ;驱动器编号,一般我们只有一个软盘驱动器,所以写死
;为0
INT 0x13 ;调用BIOS中断实现磁盘读取功能
JC fin
jmp LOAD_ADDR
fin:
HLT
jmp fin
内核代码kernel.asm:
org 0x8000
entry:
mov ax,0
;mov ss,ax
mov ds,ax
;mov es,ax
mov si,msg
putloop:
mov al,[si]
inc si
cmp al,0
je fin
mov ah,0x0e
mov bx,15
int 0x10
jmp putloop
fin:
HLT
jmp fin
msg:
DB "This is Hello World from kernel!"