自己动手写操作系统(一)--bootloader

本文介绍了如何从零开始编写操作系统的引导加载器(bootloader)。内容涵盖bootloader的代码实现、makefile配置以及如何在QEMU环境中运行和测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、bootloader代码

#计算机启动运行在实模式,主要经过以下几个步骤进入保护模式

.text

#.code16表示16位代码段

.code16

.global start

start:

#1、将ds、es和ss段寄存器均设置成cs段寄存器的值,并将栈顶指针esp指向0x7c00,栈向低地址增长。这步操作其实也可省略,因为在16位代码段中还用不到其他段寄存器,在需要使用的时候再初始

#化也不迟。

movw %cs,%ax

     movw %ax,%ds                                   # -> Data Segment

     movw %ax,%es                                   # -> Extra Segment

     movw %ax,%ss                                   # -> Stack Segment

movl $0x7C00,%esp

 

#2、关中断,在后面我们在内存中会建立中断向量表,所以事先关好中断,防止在建表过程中来了中断,所以事先屏蔽,防止这种情况产生。

cli

 

#3、打开地址线A20。实际上若我们使用qemu跑这个程序时,A20默认已经打开了,但为了兼容性,最好还是手动将A20地址线打开,读者可以试一试将打开A20代码删去后,在保护模式(32位代码段#)下用回滚机制测试时是否仍然显示字符

#8042(键盘控制器)端口的P21和A20相连,置1则打开

#0x64端口 读:位1=1 输入缓冲器满(0x60/0x64口有给8042的数据)

#0x64端口 写: 0xd1->写8042的端口P2,比如位2控制P21 当写时,0x60端口提供数据,比如0xdf,这里面把P2置1

waitforbuffernull1:

#先确定8042是不是为空,如果不为空,则一直等待

xorl %eax,%e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值