我试图理解为什么在这个图像创建者中使用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处将字节数写入字节:
没有lseek()操作系统无法正常启动。
答案 0 :(得分:1)
我之前认为这是因为你之前的帖子Bootloader memory location包含了不同的bootloader源代码。
您提到了两个未知变量TOTALSECTORCOUNT
和KERNEL32SECTORCOUNT
。这些变量接近文件的开头,我猜想在组装时它们会将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.