Operating system 操作系统开发:实现FAT12写功能

Operating system 操作系统开发:实现FAT12写功能,operating-system,filesystems,fwrite,fat,Operating System,Filesystems,Fwrite,Fat,所以我在操作系统开发方面还是个新手,现在我正在编写FAT12文件系统代码。我用FDC代码把所有的东西都写到软盘上了,但我似乎不知道在把文件写到软盘上时该怎么做 我知道我的根目录在哪里以及它的所有相关信息,但是我应该如何寻找正确的扇区来写入我的文件呢?在那之后,我该如何将该条目添加到FAT中 这是我用来遍历根目录并查找文件的代码: FILE fsysFatDirectory (const char* DirectoryName) { FILE file; unsigned

所以我在操作系统开发方面还是个新手,现在我正在编写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;
    }
文件fsysFatDirectory(const char*DirectoryName){
文件;
无符号字符*buf;
pddirectory目录;
//!获取8.3目录名
char文件名[11];
ToDosFileName(DirectoryName,DosFileName,11);
DosFileName[11]=0;
//!每个目录14个扇区
国际贸易部门;
对于(扇区=0;扇区第一集群;
file.fileLength=目录->文件大小;
file.eof=0;
file.fileLength=目录->文件大小;
//!设置文件类型
如果(目录->属性==0x10)
file.flags=FS\u目录;
其他的
file.flags=FS\u文件;
//!返回文件
返回文件;
}
//!转到下一个目录
目录++;
}
}
//!找不到文件
file.flags=FS\u无效;
返回文件;
}
我本来打算写一些类似的东西,然后逐条遍历根目录,直到找到一个位置。至于添加/遍历FAT,我知道每个条目都代表一个集群(条目1=集群1)。但是我不知道是应该遍历FAT而不是根目录,还是两者都要遍历

我的大部分代码都是基于本教程的:但他从未添加过创建/编写文件的功能,所以我自己做


非常感谢您的帮助。

我能想到的一个实现是使用树状结构,其中根目录是父目录

struct fat_component{
    fat_component *parent;
    /*other fat components here*/
};
一旦有了它,我们就可以调用一些东西,比如对int 13h/AH=03的内联汇编调用


更新:我刚刚意识到我从来没有将FAT表写入磁盘…如何手动将表写入磁盘映像?
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");