Требуется помощь в создании файловой сисетмы

Написал простую операционную систему на Си и NASM

Застрял на моменте создания файловой системы

Вот так сейчас выглядит прототип файловой системы:

void init_file_system() {
    memset(file_table, 0, sizeof(file_table)); // Обнуляем таблицу файлов
    memset(disk, 0, sizeof(disk)); // Обнуляем "диск"
}

int write_block(int block_number, const char* data, int size) {
    if (block_number < 0 || block_number >= MAX_BLOCKS || size > BLOCK_SIZE) {
        return -1; // Ошибка: неверный номер блока или размер
    }
    memcpy(disk[block_number], data, size); // Копируем данные в блок
    return 0; // Успех
}

int read_block(int block_number, char* buffer, int size) {
    if (block_number < 0 || block_number >= MAX_BLOCKS || size > BLOCK_SIZE) {
        return -1; // Ошибка: неверный номер блока или размер
    }
    memcpy(buffer, disk[block_number], size); // Копируем данные в буфер
    return 0; // Успех
}

int create_file(const char* filename, const char* data, int size) {
    if (file_count >= MAX_FILES) return -1; // Превышено максимальное количество файлов

    // Найти первый свободный блок
    int start_block = -1;
    for (int i = 0; i < MAX_BLOCKS; i++) {
        if (strlen(disk[i]) == 0) { // Если блок пустой
            start_block = i;
            break;
        }
    }

    if (start_block == -1) return -1; // Не найден свободный блок

    // Записать данные в блок
    write_block(start_block, data, size);

    // Сохранить метаданные файла
    strcpy(file_table[file_count].filename, filename);
    file_table[file_count].start_block = start_block;
    file_table[file_count].size = size;
    file_count++;

    return 0; // Успех
}

int read_file(const char* filename, char* buffer) {
    for (int i = 0; i < file_count; i++) {
        if (strcmp(file_table[i].filename, filename) == 0) {
            read_block(file_table[i].start_block, buffer, file_table[i].size);
            return file_table[i].size; // Возвращаем размер файла
        }
    }
    return -1; // Файл не найден
}

bool ends_with(const char *str, const char *suffix) {
    size_t lenstr = strlen(str);
    size_t lensuff = strlen(suffix);
    if (lensuff > lenstr) return false;
    return strcmp(str + lenstr - lensuff, suffix) == 0;
}

void create_file_command() {
    char filename[32];
    char data[BLOCK_SIZE];

    print("Enter filename: ");
    input(filename, sizeof(filename));

    // Проверяем, заканчивается ли имя файла на ".ram"
    if (!ends_with(filename, ".ram")) {
        print("Error: Filename must end with '.ram'\n");
        return;
    }

    print("Enter data to write to file: ");
    input(data, sizeof(data));

    if (create_file(filename, data, strlen(data)) == 0) {
        print("File created successfully.\n");
    } else {
        print("Error creating file.\n");
    }
}

void delete_file_command() {
    char filename[32];
    print("Enter filename to delete: ");
    input(filename, sizeof(filename));

    for (int i = 0; i < file_count; i++) {
        if (strcmp(file_table[i].filename, filename) == 0) {
            // Сдвигаем все файлы в таблице, чтобы удалить текущий
            for (int j = i; j < file_count - 1; j++) {
                file_table[j] = file_table[j + 1];
            }
            file_count--;
            print("File deleted successfully.\n");
            return;
        }
    }
    print("File not found.\n");
}

void read_file_command() {
    char filename[32];
    char buffer[BLOCK_SIZE];

    print("Enter filename to read: ");
    input(filename, sizeof(filename));

    int size = read_file(filename, buffer);
    if (size > 0) {
        buffer[size] = '\0'; // Завершаем строку
        print("File content: ");
        print(buffer);
        print("\n");
    } else {
        print("File not found!\n");
    }
}

void list_files(void) {
    color(COLOR_GREEN);
    print("\nFILES");
    kprint_newline();
    
    if (file_count == 0) {
        print("No files found.\n");
    } else {
        for (int i = 0; i < file_count; i++) {
            print(file_table[i].filename);
            print("\n");
        }
    }
    kprint_newline();
}

То есть пока файл не создаётся физически на диске

Пробовал использовать прерывания для создания физического файла, но ОС просто не включалась

ОС 32 битная


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