基于扩展INT 13H的光驱引导程序设计

最近对操作系统产生兴趣,于是着手研究,大多国内的参考资料都是以软盘为基础设计loader,而我想用光驱实现
摘要由CSDN通过智能技术生成

    最近一直在研究操作系统,好多资料的引导程序完全基于软盘设计,在软盘早已被淘汰的今天,用软盘没什么意思了就,这里我是基于最常见光盘设计的,光盘还有一好处,就是引导扇区可以大于512字节,我们要考虑的,仅在于实模式下的地址访问空间(1M),这对于一个引导程序来说,已经很够用了,所以我们可以直接用C语言嵌入汇编实现,毕竟现在GCC是很NB的。

        首先参考了基于软盘的引导程序,一般用的是INT13中断,也试了一下,发现INT13获得的所谓的第一扇区是从引导扇区开始的,这样就会产生一个问题:无法读取ISO9660的文件头(ISO9660文件头之后才是引导扇区)。这样的办法一定不行,因为如果这样,我们用的系统盘的引导就没有办法实现了,因为系统盘里面文件更是多而杂,没有ISO文件头的支持,是根本没办法获得文件的相关数据的。所以肯定会有更好的办法,只是还不了解。于是我便从windows7的安装光盘的引导程序下手,IDA反编译看出引导程序调用INT13之前在AH寄存器装入了0x42,搜了一下,还真的有,这个办法叫扩展INT13.

为了确定BIOS是否支持扩展INT13(其实有些多余,不过还是分享下吧),我们先来写程序来测试一下。

        入口:AH=0x41,DL=设备号,BX=0x55AA返回:若存在,CF=1,BX=0xAA55,AH=主版本号,若不存在,CF=0,AH=错误码。

        这里我在用BOCHS和VMWARE虚拟的时候发现即使存在CF最终也会为1,不知道为什么,在这个问题上我纠结了好久,甚至翻看了BOCHS虚拟机的源代码,也没查出个究竟来。还好有第二个办法:检测BX值。附代码:

char IsExtened()//返回1,即存在;返回0,即不存在  
{  
    unsigned int BxRtn = 0;//因为C代码中嵌入汇编一般寄存器会用32位的,所以为了防止内存访问过界,我们也要用32位的  
    __asm__ __volatile__(  
        "movb $0x41, %%ah\n\r"  
        "movw $0x55aa, %%bx\n\r"  
        "int $0x13\n\r"  
        "movl %0, %%ebx\n\r"//32位赋值  
        :"=r"(BxRtn)//输出BX到BxRtn,这里要注意gcc中汇编嵌入的输入和输出用到的r,r所代表的是32位的寄存器,百度上很多说明都是错误的  
        :  
        );  
    return BxRtn == 0xaa55;  
}  

        有了上面代码的保证,我们就可以更踏实地实现从光驱读数据了。

        下面具体了解下扩展INT13的用法,这里我们仅以读为例。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值