Почему система уходит в бесконечную перезагрузку

Создал простую операционную сисетму на Си и NASM и написал функцию для запси блока на диск с ипользованием прерываний.

int bios_write_block(int block_number, const char* data, int size) {
    if (block_number < 0 || size > BLOCK_SIZE) {
        return -1; // Ошибка: неверный номер блока или размер
    }

    // Преобразование номера блока в номер сектора
    uint16_t cylinder = block_number / (SECTORS_PER_TRACK * HEADS);
    uint16_t head = (block_number / SECTORS_PER_TRACK) % HEADS;
    uint16_t sector = (block_number % SECTORS_PER_TRACK) + 1; // Сектора начинаются с 1

    // Подготовка к записи
    asm volatile (
        "int $0x13" // Прерывание BIOS для работы с диском
        : // Нет выходных переменных
        : "a"(0x30), "b"(0), "c"((cylinder << 8) | (head << 8) | sector), "d"(data), "S"(size)
        : "memory"
    );

    return 0; // Успех
}

при компилировании gcc не выдаёт ошибок,однако когда ОС доходит до выполнения этой функции эмулятор qemu начинает перезагружаться. То же самое происходит и на реальном железе.

вот как я вызвал функцию:

char data[BLOCK_SIZE];
memset(data, 0xAB, BLOCK_SIZE);

int block_number = 0;
int size = BLOCK_SIZE;

int result = bios_write_block(block_number, data, size); 

вот так ведёт себя эмулятор

Так как функция вызывается при включении ОС,ошибка происходит сразу и не даёт системе запуститься.

что я делаю не так? почему система уходит в перезагрузку?


Ответы (0 шт):