Разработка ОС: реализация функции записи FAT12

Так что я довольно новичок в разработке ОС, сейчас я пишу код своей файловой системы FAT12. Я записал все на дискету, используя работающий код FDC, но, похоже, не могу понять, как мне поступить при записи файла на диск.

Я знаю, где находится мой корневой каталог, и всю связанную с ним информацию, но как мне найти правильный сектор, куда записать мой файл? И после этого, как мне добавить эту запись в FAT?

Вот код, который я использую для обхода корневого каталога и поиска файла:

FILE fsysFatDirectory (const char* DirectoryName) {

        FILE file;
    unsigned char* buf;
    PDIRECTORY directory;

    //! get 8.3 directory name
    char DosFileName[11];
    ToDosFileName (DirectoryName, DosFileName, 11);
    DosFileName[11]=0;

    //! 14 sectors per directory
    int sector;
    for (sector=0; sector<14; sector++) {

        //! read in sector of root directory
        buf = (unsigned char*) flpydsk_read_sector (_MountInfo.rootOffset + sector );

        //! get directory info
        directory = (PDIRECTORY) buf;

        //! 16 entries per sector
        int i;
        for (i=0; i<16; i++) {

            //! get current filename
            char name[11];
            kmemcpy (name, directory->Filename, 11);
            name[11]=0;

            //! find a match?
            if (kstrcmp (DosFileName, name) == 0) {

                //! found it, set up file info
                kstrcpy (file.name, DirectoryName);
                file.id             = 0;
                file.currentCluster = directory->FirstCluster;
                file.fileLength     = directory->FileSize;
                file.eof            = 0;
                file.fileLength     = directory->FileSize;

                //! set file type
                if (directory->Attrib == 0x10)
                    file.flags = FS_DIRECTORY;
                else
                    file.flags = FS_FILE;

                //! return file
                return file;
            }

            //! go to next directory
            directory++;
        }
    }

    //! unable to find file
    file.flags = FS_INVALID;
    return file;
    }

Я планировал написать нечто подобное и пройтись по корневому каталогу, запись за записью, пока не найду место. Что касается добавления / обхода FAT, я знаю, что каждая запись представляет кластер (запись 1 = кластер 1). Но я не знаю, должен ли я проходить через FAT вместо корневого каталога или обоих.

Большая часть моего кода основана на этом руководстве: http://www.brokenthorn.com/Resources/OSDev22.html Но он никогда не добавлял бит создания / записи файла, поэтому я делаю это самостоятельно.

Любая помощь приветствуется.

1 ответ

Решение

Одна реализация, о которой я могу подумать, - это использовать древовидную структуру, в которой корневым каталогом является родительский каталог.

struct fat_component{
    fat_component *parent;
    /*other fat components here*/
};

Как только мы получим это, мы можем вызвать что-то вроде встроенного вызова ассемблера для int 13h/AH=03. Я не слишком знаком с этим, но вот ссылка: http://stanislavs.org/helppc/int_13-3.html.

inline_asm("mov ah, 03h");
inline_asm("mov ch, %s", fc->cylindernum);
inline_asm("mov cl, %s", fc->sectornum);
/*other int13h initializations here*/
inline_asm ("int 13h");
Другие вопросы по тегам