软盘扇区数

时间:2014-03-20 03:27:21

标签: bootloader osdev floppy

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

图像创建者使用bootloader.bin创建一个.img文件。

/* 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处将字节数写入字节: enter image description here

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

1 个答案:

答案 0 :(得分:1)

我之前认为这是因为你之前的帖子Bootloader memory location包含了不同的bootloader源代码。

您提到了两个未知变量TOTALSECTORCOUNTKERNEL32SECTORCOUNT。这些变量接近文件的开头,我猜想在组装时它们会将5个字节放入二进制文件中。使用lseek参数调用SEEK_SET会将文件指针移动到文件的开始之后的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.