02-一个引导程序的框架——boot.s

抛个砖:电脑启动后,如何加载OS?

引块玉:

CPU上电后自动把CS设置为0xF000,段基地址为0xFFFF0000,段长度为64KB,而IP设置为0xFFF0
故,CPU代码指针指向0xFFFFFFF0处,即ROM BIOS存放的位置,开始执行BIOS的硬件自检和初始化功能

在执行完准备加载操作系统的引导程序到0x7c00处前,会检查引导程序是否有效,有效标志0xAA55.

若有效,则跳转到0x7c00处开始执行引导程序(这里是boot.s),否则会转去尝试其它启动设备,

若没有找到则显示“NO ROM BASIC”后死机。

boot.s测试程序:

!
! boot.s Linux0.12内核的bootsect.s的框架
! 功能:在屏幕上显示“Loading system ...”且鸣叫一声
!
! .global 声明全局标识符,供链接器使用(主要通过这些标识符可合并不同源文件的段)
!.global begtext,begdata,begbss,endtext,enddata,endbss
! 三个段定义在同一重叠地址范围中,因此本程序实际不分段
.text                
begtext:             !在代码段定义begtext标号
.data
begdata:             !在数据段定义begdata标号
.bss
begbss:              !在bss段定义begbss标号
.text                !切换到代码段开始编写随后的代码

BOOTSEG = 0x07c0     !BIOS加载bootsect代码的原始段地址
entry start          !告知链接程序,程序从start标号处开始执行
start:
    jmpi go,BOOTSEG  !jmpi段间跳转,cs=BOOTSEG(代码段地址) ip=go(代码段偏移地址)!组成的cs:ip=0x07c0:0x0005,构成下一条指令的地址
go: mov     ax,cs
    mov  ds,ax
    mov  es,ax       !ds es设置为cs,方便数据区(如msg1)寻址
    mov  [msg1+17],ah
    mov  cx,#20      !显示字符串的长度(包括回车换行符)
    mov  dx,#0x1004  !显示的行列数:第17行 第5列
    mov  bx,#0x000c  !字符显示属性(红色)
    mov  bp,#msg1    !指向要显示的字符串
    mov  ax,#0x1301  !功能号0x13 子功能01(写字符串并移动光标到串结尾处)
    int  0x10        !利用BIOS的中断调用0x10,功能0x13,子功能01
loop0: jmp loop0     !死循环
msg1: .ascii "Loading system ..."  !调用BIOS中断显示的信息,共20个ASCII字符
      .byte  13, 10
.org  510
      .word 0xAA55    		   !有效引导扇区标志,供BIOS加载引导扇区使用
.text
endtext:            		   !定义endtext,标志代码段的结束
.data
enddata:            		   !定义enddata,标志数据段的结束
.bss
endbss:                		   !定义endbss,标志bss段的结束

0.关于BIOS提供的0x13中断服务:
在这里插入图片描述

1.编译链接:
as86 -0 -a -o boot.o boot.s //-0:生成8086的16位目标程序
ld86 -0 -s -o boot boot.o //-a:指定生成与GNUas和ld部分兼容的代码 -s:去掉符号信息
备注:as86 和 ld86 在Ubuntu下的安装:
可先查找对应的软件包:apt-cache search as86 ld86
根据查询结果(bin86):apt-get install bin86
2.制作Image文件
dd bs=32 if=boot of=boot.img skip=1 //if:input file of:output file bs=32:去掉32B的头结构
3.bochsrc.bxrc文件:

#how much memory the emulated machine will have
msgs:32
#filename of ROM images
romimage:file=../BIOS-bochs-latest, address=0xf0000
vgaromimage:file=../VGABIOS-lgpl-latest
#hard disk
ata0:enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14
ata0-master:type=disk,path="boot.img",cylinders=306,head=4,spt=17
#choose the boot disk
boot:disk
#where do we send log messages?
log:bochsout.txt

4.运行结果
最后一个点被鸣叫声的ASCII值0x07替换

参考资料:
对于使用BIOS的中断服务,可参阅下文博客:
https://blog.csdn.net/Asdfffy/article/details/84074665
《Linux内核完全剖析——基于0.12内核》第二章

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xxl-job-admin-spring-boot是将xuxueli的xxl-job-admin项目重新设计并适配到spring boot框架的工作。 首先,xxl-job-admin是一个用于管理任务调度的平台,能够实现任务的添加、暂停、恢复、删除等功能。而spring boot是一种快速构建应用程序框架,因其简洁的配置和开发方式而广受欢迎。 在将xxl-job-admin迁移到spring boot框架时,需要进行一系列修改和适配。首先,要将原有的项目结构转化为符合spring boot规范的结构,包括调整包的命名、重新组织项目目录结构以及调整Maven或Gradle构建文件等。这样可以更好地利用spring boot的自动配置和约定,提高开发效率。 其次,需要调整原有的依赖关系和配置文件。由于spring boot采用自动配置的方式,我们需要根据xxl-job-admin的需求来配置相应的依赖和属性。这可能涉及到数据库连接、缓存、安全认证等方面的设置。同时,还要考虑与其他可能的项目组件的集成,如使用spring security实现权限控制。 最后,还要对原有的代码进行调整和优化。由于spring boot具有更好的集成性和可扩展性,我们可以使用spring boot提供的组件和注解来简化代码,提高系统性能。例如,使用spring的注解和AOP来处理事务,使用spring data来简化数据库操作等。 通过将xxl-job-admin迁移到spring boot框架,可以充分发挥spring boot的优势,使得项目更易于维护和扩展。同时,也能够与其他基于spring boot的项目更好地整合,加强协作效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值