大家一起写操作系统(1)-引导程序

上一节我们知道bios会把启动设备第一扇区的512B程序加载到0x7c00处执行.由于512B程序大小所限,所以这段程序一般用于引导,就是说将内核程序从启动设备中读出并复制到一个合适的位置,然后引导程序把控制权将给内核。这一节我们就实现这样一个引导程序。

实验环境:

编译器:NASM

虚拟机vmware8.0

二进制编辑器winHex:用于将引导程序和内核写入软盘映射文件img.

代码编辑器notepad++


结合代码详细分析引导程序的内容.

下面是引导程序内容:

BOOTSEG equ 0x07c0 ;boot.bin 被bios加载到0x7c00内存处
SYSSEG equ 0x1000 ;kernel先被加载到0x10000,再移动到0x0处
SYSLEN equ 17 ;内核最多占用17个扇区 17*512字节
KERNEL_CS equ 0x08 ;内核代码段选择符
start:
    jmp 0x07c0:go ;这条指令将cs寄存器设为0x07c0,便于寻址
go:
    mov ax,cs
    mov ds,ax
    mov es,ax
    mov ss,ax
    mov sp,0x400 ;开辟栈空间逻辑地址0x400-0x200用作栈空间,0x200-0x00用于存放boot.bin
上面的代码先用一个jmp跳转指令将cs寄存器的内容置为0x07c0,并同步给ds,es,ss.这是为了便于后面寻址,这样后面用label(比如load_kernel作为偏移地址时就是实际的物理地址,因为这段程序被加载到0x7c00处,就相当于cs*16 + label = 0x7c00 + label

你可能感兴趣的:(Linux/Unix)