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

本文详细介绍了操作系统的引导程序过程,从BIOS如何加载启动扇区到引导程序如何将内核读入内存并移动到正确位置。通过NASM编译器、虚拟机VMware和WinHex工具,演示了引导程序的创建和执行。内容包括设置段寄存器、读扇区、处理错误、移动内核以及设置GDT和IDT,最终进入保护模式。
摘要由CSDN通过智能技术生成

上一节我们知道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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self-motivation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值