1

我试图理解为什么 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() 操作系统无法正确启动。

4

1 回答 1

1

我只是因为您之前发布的引导加载程序内存位置而发现了这一点,其中包含引导加载程序的不同源代码。

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

当您删除它时,lseek它会将这两个值附加到文件的末尾。如果您将 offset 参数更改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.
于 2014-03-20T08:01:48.707 回答