从CD加载扇区

时间:2012-03-13 01:54:17

标签: assembly cd 16-bit sector

我是OS设计的新手,到目前为止设计了一个“OS”(实际上只是一个bootsector),并决定尝试制作一个独特的bootloader和“kernel”(仍然非常简单)。我的问题很简单,但通过谷歌搜索和搜索这个网站设法逃避了我(好吧,我确实找到了一个类似的问题,但答案是模糊/高级让我能够使用它。)

我看过int 0x13 AH = 02,但是它使用了轨道,我不认为CD是使用的。我在哪里看到我应该使用扩展读取扇区(AH = 0x42),但是我没有看到如何使用它,因为我看不到在哪里可以指定要读取的扇区,以及扇区应该放在RAM中的哪个位置

以下是问题:如何从使用El Torito的CD中加载扇区而不进行仿真。如果您能以“最简单的形式”回答问题并尝试提供一些代码,我会很感激,因为我是新手。提前谢谢!

编辑:

我不知道你是否需要它,但我正在使用NASM语法,所以如果你能在NASM中给我答案,那就太好了。

2 个答案:

答案 0 :(得分:3)

按照惯例,BIOS将您应该用于int 13h的驱动器号放入DL寄存器。然后你可以使用int 13h,ax = 4B01h(获取仿真状态)来确定磁盘信息,使用int 13x函数42h来读取具有LBA字段中扇区号的0x800大小的CD扇区。查看ISOLINUX bootloader了解更多详情。入口点为_start,读取扇区的例程为getlinsec_cdrom

编辑:阅读有关如何使用它的int 13h扩展的the documentation。基本上,您需要传递一个填充结构,其中包含缓冲区的扇区号,计数和地址,以便放置读取数据。

答案 1 :(得分:0)

我的启动加载程序认为它加载在0x07c0:0x000而不是0x0000:0x7c00。但它的确有效。我使用的是GNU工具。

这是集会:

private String get_mac_address() {
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiInfo wInfo = wifiManager.getConnectionInfo();
    String macAddress = wInfo.getMacAddress();
    return macAddress;
}

 public void getSessionId() {
     SecureRandom random = new SecureRandom();
        sessionId =  new BigInteger(130, random).toString(32);
      }

这是Makefile:

all:
        i686-elf-as -o boot.o boot.S
        i686-elf-ld --oformat=binary -Ttext=0x0 -o boot.bin boot.o

# Make fd is for test only, our target media is CD.
fd: all
        dd status=noxfer conv=notrunc if=boot.bin of=floppy.flp
        qemu-system-i386 -fda floppy.flp

cd: all
        mkdir -p iso/boot
        cp boot.bin iso/boot/loader.sys
        mkisofs -R -J -c boot/bootcat \
                -b boot/loader.sys -no-emul-boot -boot-load-size 4 \
                -input-charset utf-8 \
                -o ./boot.iso ./iso
        qemu-system-i386 -cdrom boot.iso

clean:
        @rm -rf iso boot.o boot.bin floppy.flp boot.iso

关键是要了解Seg:Offset如何在实模式下表示地址。