Linux内核设计的艺术boot/bootsect.c的代码----第二篇

本文详细解析了计算机从开机加电到执行main函数前的过程,重点介绍了如何利用BIOS提供的int0x13中断服务程序加载setup程序至内存指定位置。通过具体的汇编指令代码,展示了直接磁盘服务的功能及参数传递过程。

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

第一章:从开机加电到执行main函数之前的过程

1.2.2 加载第二部分代码----setup          

      3.将Setup程序加载到内存中

 

        执行完之前的复制过程就要执行第二步操作:将Setup程序加载到内存中,加载setup这个程序,要借助BIOS提供的int 0x13终端向量所指向的中断服务程序(即磁盘服务程序)来完成。int 0x13的中断服务程序可以根据设计者的意图,把指定扇区的代码加载到内存的指定位置。

        针对服务程序的特性,使用int 0x13H中断时,就要事先将指定的扇区和加载的内存位置等信息传递给服务程序。

 

补充:直接磁盘服务的功能描述,部分如下(其他具体参数课自行查找):

;功能描述:读扇区

;入口参数:AH=02H

;AL=扇区数

;CH=柱面

;CL=扇区

;DH=磁头

;DL=驱动器,00H-7F:软盘;80-0FFH:硬盘

;ES:BX=缓冲区的地址

;出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码。

代码如下:

load_setup:

mov ds,#0x0000                     ;AH=02H,是功能02H,为读扇区,设置驱动器和磁头,DL=0驱动器为0,DH=0磁头为 0

mov cx,#0x0002                ;同上,CH=0,柱面为0,CL为2,扇区为2,cl=开始扇区(位0—5),磁道号高二位(位6 -7)

mov bx,#0x0200                     ;设置读的地址为es:dx = 0x90200,es为0x9000,bx为0200

mov ax,#0x0200+SETUPLEN     ;AL为扇区数为4,即调入4个扇区

                                                     ;到此参数传递完成

int 0x13                                        ;调用中断

jnc ok_load_setup                       ;读入成功则跳转,否则下一步

mov dx,#0x0000                          ;未成功,复位磁盘

mov ax,#0x0000                          ;因为未成功,则AL值被置为一个特定值,所以要进行重置

int 0x13                                          ;参数传递完毕后,执行0x13中断,通过中断向量表找到这个中断服务程序,将软盘从

                                            ;第二扇区开始的四个扇区,即setup.s对应的程序加载至内存的SETUPSEG(0x90200)处。

j load_setup                         ;重新循环,再次读取          

ok_load_setup:

          在参数传递完毕后,执行int 0x13H指令,产生0x13中断,通过中断向量表找到这个中断服务程序,将软盘从第二扇区开始的4个扇区,即setup.s对应的程序加载至内存的SETUPSEG(0x90200处),现在操作系统已经从软盘中加载了5个扇区的代码,等bootsect执行完毕后,setup开始工作。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值