babyos2(19) fs (1), fs struct, super block, inode, bitmap, namei

文件系统是操心系统必不可少的一部分,babyos2准备参考xv6实现一个简单的文件系统。
为了简单,暂时不考虑多进程之间的竞争,即暂时不考虑锁的问题,功能实现完后再增加锁。

xv6文件系统,磁盘第一个扇区为引导扇区,第二个扇区是super block,后面是inode,再后面是bitmap,之后是data block,xv6后面还有log扇区,babyos2暂时不准备实现该功能,所以没有这部分。

1.superblock

typedef struct super_block_s {
    uint32 m_size;      /* total num of blocks */
    uint32 m_nblocks;   /* num of data blocks */
    uint32 m_ninodes;   /* num of inodes */
} super_block_t;

/*
 * guzhoudiaoke@126.com
 * 2018-01-05
 */

#include "fs.h"
#include "babyos.h"
#include "ide.h"
#include "console.h"
#include "string.h"

void file_system_t::read_super_block()
{
    io_clb_t clb;
    clb.init(m_dev, 1, m_super_block_lba);
    os()->get_ide()->request(&clb);
    memcpy(&m_super_block, clb.buffer, sizeof(super_block_t));
}

void file_system_t::dump_super_block()
{
    console()->kprintf(WHITE, "super block: \t");
    console()->kprintf(WHITE, "size: %u block num: %u inode num: %u \n", 
            m_super_block.m_size, m_super_block.m_nblocks, m_super_block.m_ninodes);
}

void file_system_t::init()
{
    m_dev = 1;
    m_super_block_lba = 1;
    read_super_block();
}

这里写图片描述

2.disk inode

class disk_inode_t {
   
   
public:

public:
    uint16 m_type;
    uint16 m_major;
    uint16 m_minor;
    uint16 m_nlinks;
    uint32 m_size;
    uint32 m_addrs[NDIRECT + 1];
};


class inode_t {
   
   
public:
    enum inode_type {
        I_TYPE_DIR = 1,
        I_TYPE_FILE,
    };

public:
    uint32 m_dev;           // device number
    uint32 m_inum;          // inode number
    uint32 m_ref;           // reference count
    uint32 m_flags;

    uint16 m_type;          // copy of disk inode
    uint16 m_major;
    uint16 m_minor;
    uint16 m_nlinks;
    uint32 m_size;
    uint32 m_addrs[NDIRECT+1];
};


uint32 file_system_t::inode_block(uint32 id)
{
    return m_inode_lba + id / (BSIZE / sizeof(disk_inode_t));
}

uint32 file_system_t::inode_offset(uint32
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值