【问题标题】:Floppy disk sector count软盘扇区数
【发布时间】:2014-03-20 03:27:21
【问题描述】:

我试图理解为什么在这个图像创建器中使用 lseek()。为什么距离文件开头 5 个字节?如果我更改了那个数字,操作系统将无法启动。

镜像创建者会创建一个.img 文件,其中包含 bootloader.bin。

/* modify the sector count */



total_sector_number = file_size / 512

lseek(disk_image_fd, 5, SEEK_SET);
write(disk_image_fd, &total_sector_number, 2);
write(disk_image_fd, &kernel_32_sector_number, 2);

//printf("%d\n", lawl);
printf("TOTAL_SECTOR_NUMBER : %d\n", total_sector_number);
printf("KERNEL_32_SECTOR_NUMBER : %d\n", kernel_32_sector_number);

源代码(图像生成器): http://pastebin.com/raw.php?i=MuDpYP3Y

引导加载程序: http://pastebin.com/raw.php?i=kzw2ZaU1

使用 lseek() 的 hexdump 并将扇区数写入偏移量 5 处的字节:

没有 lseek() 操作系统无法正确启动。

【问题讨论】:

  • 很明显,因为这是这个未命名的“操作系统”或引导加载程序希望为这些信息提供资金的位置。
  • 我模糊地记得前 5 个字节是实际引导加载程序开始的一个分支。在控制分支中读取扇区后,转到扇区中的第一个位置。
  • 我认为引导加载程序从 0x07C0 开始? [ORG 0x07c0] 和 ax 和所有的段寄存器都设置为 0x07c0

标签: bootloader osdev floppy


【解决方案1】:

我只是因为您之前的帖子 Bootloader memory location 包含引导加载程序的不同源代码才知道这一点。

您提到了TOTALSECTORCOUNTKERNEL32SECTORCOUNT 这两个未知变量。这些变量位于文件的开头附近,我猜在组装时它们在二进制文件中占 5 个字节。使用SEEK_SET 参数调用lseek 会将文件指针移动到文件开头 之后的5 个字节。然后它会写入两个值,这将覆盖引导加载程序代码中的值。

当您删除 lseek 时,它会将两个值附加到文件末尾。如果您将lseek 的偏移参数更改为零,则会覆盖引导加载程序的jmp 命令。

注意在您的 hexdump 中。

00000000 00eb b8fa 02c0 0000 c000 e08e e88e 00b8
                     ^    ^- kernel_32_sector_number is never initialized.
                     |-total_sector_number which was calculated in code before the write.

【讨论】:

  • 我还没有编写内核,所以它是 0。引导加载程序仍然可以正常加载/运行。但是,如果我删除了 lseek() 调用和之后的两个 write 调用,操作系统将无法加载。我不知道这是为什么?因为我并没有真正使用 total_sector_number 或 kernel_sector_number。引导加载程序不应该加载得很好吗?
  • 我什至可以为这两个变量传入假值。它会运行良好,所以这真的让我很困惑。
  • 您能否将您现在用于引导加载程序和映像编写器的确切代码粘贴到二进制文件中?你在使用 NASM 吗?
  • 您的引导加载程序中恰好有一个错误。幸运的是,图像编写器覆盖了您的错误代码,并且非常巧合地运行了
  • 这两个占位符有必要吗?因为我已经注释掉了两个写命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2015-12-29
  • 2012-04-18
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
相关资源
最近更新 更多