Настройка и работа в Linux
adb5321d

Запись загрузочного сектора на флоппи-диск


Теперь мы должны написать программу на C, которая скопирует наш код (код нашей ОС) в первый сектор дискеты. Вот она:

#include <sys/types.h> /* unistd.h needs this */ #include <unistd.h> /* contains read/write */ #include <fcntl.h>

int main() { char boot_buf[512]; int floppy_desc, file_desc;

file_desc = open("./boot", O_RDONLY); read(file_desc, boot_buf, 510); close(file_desc);

boot_buf[510] = 0x55; boot_buf[511] = 0xaa;

floppy_desc = open("/dev/fd0", O_RDWR); lseek(floppy_desc, 0, SEEK_CUR); write(floppy_desc, boot_buf, 512); close(floppy_desc); }

Сперва мы открываем файл boot в режиме только для чтения и копируем файловый дескриптор в переменную file_desc. Затем читаем первые 510 байт, либо, если файл размером меньше 510 байт, читаем весь файл. Наш код невелик, поэтому последний случай наш. Будьте паинькой -- не забудьте закрыть файл. 8-)

Последние четыре строки кода открывают устройство флоппи-диска (которым, как правило, является /dev/fd0). Затем переводим указатель в начало файла, используя lseek и записываем 512 байт из буфера на дискету.

Страницы справочного руководства функций read, write, open и lseek (смотрите man 2) дадут вам достаточно информации о том, что обозначают другие параметры функций и как их использовать. Есть две строки, которые выглядят немного таинственно. Вот они:

boot_buf[510] = 0x55; boot_buf[511] = 0xaa;

Это информация для BIOS. Если предполагается, что BIOS должна распознать устройство как загрузочное, то устройство должно содержать значения 0x55 и 0xaa, расположенные по смещениям 510 и 511. (Не берусь утверждать на все 100%, но раньше [по слухам], во времена MS DOS 2.0 и ниже, этой сигнатуры не было вообще. Она появилась позднее, как ответ на загрузочный вирус ( помните такие? -- прим. ред.), который при помощи этой сигнатуры проверял , заражал ли он этот компьютер или нет. Если нет, то вирус делал свое "черное дело" и "приписывал" эти два байта. Прим.перев.). Теперь почти все. Программа читает файл boot в буфер boot_buf. Делает нужные изменения в 510 и 511 байтах и записывает boot_buf на флоппи-диск. Сохраним файл как write.c .



Содержание раздела