我是OS设计的新手,到目前为止设计了一个“OS”(实际上只是一个bootsector),并决定尝试制作一个独特的bootloader和“kernel”(仍然非常简单)。我的问题很简单,但通过谷歌搜索和搜索这个网站设法逃避了我(好吧,我确实找到了一个类似的问题,但答案是模糊/高级让我能够使用它。)
我看过int 0x13 AH = 02,但是它使用了轨道,我不认为CD是使用的。我在哪里看到我应该使用扩展读取扇区(AH = 0x42),但是我没有看到如何使用它,因为我看不到在哪里可以指定要读取的扇区,以及扇区应该放在RAM中的哪个位置
以下是问题:如何从使用El Torito的CD中加载扇区而不进行仿真。如果您能以“最简单的形式”回答问题并尝试提供一些代码,我会很感激,因为我是新手。提前谢谢!
编辑:
我不知道你是否需要它,但我正在使用NASM语法,所以如果你能在NASM中给我答案,那就太好了。
答案 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如何在实模式下表示地址。