跟我一起写操作系统

    返回首页    发表留言
本文作者:李德强
          第四节 光盘文件
 
 

        有了文件系统,就可以为我们的光盘写入指定的文件,光盘中前1024扇区为引导扇区和系统内核程序所在扇区,在1024扇区之后我们要将光盘按指定的格式写入一套完整的文件系统。          首先在工程中创建一系列的文件目录:


        再创建一个新的工程叫作filesys放入tool文件夹中,此工程用于将一个完整的目录拷贝到光盘镜像当中去,并使用我们上一节实现的文件系统来拷贝:


        读入lidqos/fs/目录下的内容,并将其拷贝到光盘中:

int install_fs(char *path_src, char *os_path, u32 uid, u32 gid, u32 mode)
{
        DIR *dir;
        struct dirent *dirinfo;
        if ((dir = opendir(path_src)) == NULL)
        {
                printf("Path is not exist \"%s\".\n", path_src);
                return -1;
        }
        while ((dirinfo = readdir(dir)) != NULL)
        {
                char old_path[0x400];
                int path_src_len = str_length(path_src);
                if (path_src[path_src_len - 1] != '/')
                {
                        path_src[path_src_len++] = '/';
                        path_src[path_src_len++] = '\0';
                }
                str_append(path_src, dirinfo->d_name, old_path);
                if (is_folder(old_path))
                {
                        char path[0x400];
                        str_append(os_path, dirinfo->d_name, path);
                        int len = str_length(path);
                        path[len++] = '/';
                        path[len++] = '\0';
                        fs_create_path(path, uid, gid, mode);
                        if (strcmp(".", dirinfo->d_name) != 0 && strcmp("..", dirinfo->d_name) != 0)
                        {
                                install_fs(old_path, path, uid, gid, mode);
                        }
                }
                else
                {
                        char path[0x400];
                        str_append(os_path, dirinfo->d_name, path);
                        install_file(old_path, path, uid, gid, mode);
                }
        }
        closedir(dir);
        return 0;
}

        将文件安装至光盘

int install_file(char *path, char *os_path, u32 uid, u32 gid, u32 mode)
{
        FILE *fp_src = fopen(path, "r");
        if (fp_src == NULL)
        {
                return -1;
        }
        s_file *fp_read = f_open(os_path, FS_MODE_READ);
        if (fp_read != NULL)
        {
                printf("HAVE %s\n", os_path);
                f_close(fp_read);
                return -1;
        }
        f_close(fp_read);
        f_create(os_path, uid, gid, mode);
        s_file *fp_dec = f_open(os_path, FS_MODE_WRITE);
        fseek(fp_src, 0L, SEEK_END);
        int size_src = ftell(fp_src);
        fseek(fp_src, 0L, SEEK_SET);
        char ch;
        for (int i = 0; i < size_src && !feof(fp_src); i++)
        {
                fread(&ch, sizeof(char), 1, fp_src);
                f_write(fp_dec, 1, &ch);
        }
        fclose(fp_src);
        f_close(fp_dec);
        return 0;
}

        最后将硬盘读写、文件系统等所有的功能整合到一起,在kernel.c中加入查看/home/lidq/Documents/wecome文件内容的代码:

s_file *fp = f_open("/home/lidq/Documents/welcome", FS_MODE_READ, 0, 0);
char *temp = alloc_mm(fp->fs.size);
f_read(fp, fp->fs.size, (char *) temp);
for (int i = 0; i < fp->fs.size; i++)
{
        putchar(temp[i]);
}
putchar('\n');
f_close(fp);

        首先编译lidqos工程,再编译运行filesys工程将文件系统拷贝到光盘文件。最后启动虚拟机并查看运行结果:



        “This is a text from the file system.”这句话就是从光盘中/home/lidq/Documents/welcome文件中读取出来的内容。值得提一下的是本章的内容逻辑上并不复杂,但实现的代码却非常的多,教程中给出的代码也只不过是一小部分而已,具体实现过程比较繁琐,希望读者能够通过自己的努力学习并深入了解文件系统的原理,一步步的实现这一章的内容而不要直接将大量的代码拷贝到自己的工程中来使用。

 

        源代码的下载地址为:

https           https://github.com/magicworldos/lidqos.git 
git             git@github.com:magicworldos/lidqos.git 
subverion       https://github.com/magicworldos/lidqos 
branch          v0.17

 

    返回首页    返回顶部
#1楼  匿名  于 2019年05月26日15:47:37 发表
 
hd_rw()写的有问题,阻塞在while ((hd_status & 0xc0) != 0x40),加了延时也解决不了,不知道为什么你这个居然可以!
  看不清?点击刷新

 

  Copyright © 2015-2023 问渠网 辽ICP备15013245号