Счетчик секторов гибкого диска

Я пытаюсь понять, почему 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() и записью количества секторов в байт по смещению 5: введите здесь описание изображения

Без lseek() ОС загружается неправильно.


person Quaxton Hale    schedule 20.03.2014    source источник
comment
Довольно очевидно, потому что это место, где эта неназванная ОС или загрузчик рассчитывает финансировать эту информацию.   -  person Chris Stratton    schedule 20.03.2014
comment
Я смутно припоминаю, что первые 5 байтов - это ответвление к началу фактического загрузчика. После того, как сектор был прочитан в контрольных ветвях до первого места в секторе.   -  person Hot Licks    schedule 20.03.2014
comment
Я думал загрузчик начинается с 0x07C0? [ORG 0x07c0] и ax и все сегментные регистры установлены на 0x07c0   -  person Quaxton Hale    schedule 20.03.2014


Ответы (1)


Я понял это только из вашего предыдущего сообщения Расположение памяти загрузчика, которое содержало другой исходный код для загрузчика.

Вы упомянули две неизвестные переменные TOTALSECTORCOUNT и KERNEL32SECTORCOUNT. Эти переменные были ближе к началу файла, и я предполагаю, что при сборке они занимают 5 байтов в двоичном файле. Вызов lseek с параметром SEEK_SET перемещает указатель файла на 5 байтов после начала файла. Затем он записывает два значения, которые перезапишут значения в коде загрузчика.

Когда вы удаляете lseek, вместо этого два значения добавляются в конец файла. Если вы измените параметр смещения lseek на ноль, вместо этого будет перезаписана команда jmp загрузчика.

Заметьте в своем шестнадцатеричном дампе.

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.
person Breavyn    schedule 20.03.2014
comment
Я еще не написал ядро, поэтому оно равно 0. Загрузчик по-прежнему загружается/работает нормально. Однако, если я удалю вызов lseek() и два последующих вызова записи, ОС не загрузится. Интересно, почему это так? Поскольку на самом деле я не использую total_sector_number или kernel_sector_number. Разве загрузчик не должен загружаться нормально? - person Quaxton Hale; 20.03.2014
comment
Я даже могу передать ложные значения для обеих переменных. И это будет работать нормально, так что это действительно смущает меня. - person Quaxton Hale; 20.03.2014
comment
можете ли вы вставить точный код, который вы используете прямо сейчас для загрузчика и записи образа? А вы используете NASM? - person Breavyn; 20.03.2014
comment
Так уж случилось, что в вашем загрузчике есть ошибка. Просто повезло, что программа записи изображений перезаписывает ваш неверный код и по какому-то крайнему стечению обстоятельств запускается. - person Breavyn; 20.03.2014
comment
Нужны ли эти два заполнителя? Потому что я закомментировал две команды записи. - person Quaxton Hale; 20.03.2014
comment
Можете ли вы дать мне какой-нибудь способ связаться с вами? Комментарии не место для этих дискуссий. - person Breavyn; 20.03.2014
comment
давайте продолжим это обсуждение в чате - person Quaxton Hale; 20.03.2014