文件系统是操心系统必不可少的一部分,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

最低0.47元/天 解锁文章
1017

被折叠的 条评论
为什么被折叠?



