Требуется помощь в создании файловой сисетмы
Написал простую операционную систему на Си и 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 битная