简单的文件系统 php,如何写一个简易的文件系统(4):umount_PHP教程

如何写一个简易的文件系统(4):umount哈哈,时隔几年,又从磁盘深处找出了原始代码

1146431155-0.pngmyfs.zip。

-----------------------------------------无敌分割线------------------------------

最近准备从新写一个基于block设备的小文件系统来完成这个系列的博客。 这次是基于3.10的kernel来写的。可能跟前3篇稍有差异。

umount就是将文件系统卸载掉。那么卸载文件系统需要做什么事情呢?需要将所有的数据全部更新的设备上(不管是文件数据 ,还是文件系统数据)

以后我会将文件数据称为media data,而将文件系统数据(inode,superblock等等)称为meta data。

前一篇的mount的fill super中看到下面一行代码:

sb->s_op = &dfs_sops;

就是给sb一个super block的操作结构体。当然如果你不给的话,暂时不影响umount操作,但是所有的数据都不会更新设备上去。

const struct super_operations dfs_sops = {

.alloc_inode = dfs_alloc_inode,

.put_super = dfs_put_super,

.sync_fs = dfs_sync_fs,

};

除了mount过程中要用到的alloc_inode之外,这边又添加了两个函数,一个叫put_super,另外一个叫sync_fs.

其中put_super用于更新设备上的super block,而sync_fs用于同步文件系统,也就是将所有的dirty文件全部更新到设备上去。

暂时我们还没有做好创建/更新文件的准备,所以这边只实现了put_super函数。

static void dfs_put_super(struct super_block *sb)

{

struct dfs_sb_info *sbi = DFS_SB(sb);

dfs_trace("%s\n", __func__);

if (sbi->dirty)

return dfs_write_super(sb);

kfree(sbi);

}

static int dfs_sync_fs(struct super_block *sb, int wait)

{

dfs_trace("%s\n", __func__);

dfs_put_super(sb);

/* todo: sync files as well*/

return 0;

}

static void dfs_write_super(struct super_block *sb)

{

struct dfs_sb_info *sbi = DFS_SB(sb);

struct buffer_head *bh;

struct dfs_super_block ds;

dfs_trace("%s\n", __func__);

#defineDFS_SB_BLOCK 0

if (!(bh = sb_bread(sb, DFS_SB_BLOCK)))

return;

/* update super block */

ds.inode_count = sbi->inode_count;

ds.block_size = sbi->block_size;

ds.total_blocks = sbi->total_blocks;

ds.free_blocks = sbi->free_blocks;

ds.used_blocks = sbi->used_blocks;

ds.bad_blocks = sbi->bad_blocks;

ds.inode_size = sbi->inode_size;

ds.magic = sbi->magic;

ds.max_inode_no = sbi->max_inode_no;

memcpy((void*)(bh->b_data), &ds, sizeof(struct dfs_super_block));

mark_buffer_dirty(bh);

sync_dirty_buffer(bh);

return brelse(bh);

}

root:/ # mount -t dfs /dev/block/bootdevice/by-name/oem /oem

mount -t dfs /dev/block/bootdevice/by-name/oem /oem

root/ # mount

rootfs / rootfs ro,seclabel 0 0

tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0

devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0

proc /proc proc rw,relatime 0 0

sysfs /sys sysfs rw,seclabel,relatime 0 0

selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0

debugfs /sys/kernel/debug debugfs rw,seclabel,relatime 0 0

none /acct cgroup rw,relatime,cpuacct 0 0

none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0

tmpfs /mnt tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0

none /dev/cpuctl cgroup rw,relatime,cpu 0 0

adb /dev/usb-ffs/adb functionfs rw,relatime 0 0

/dev/block/dm-0 /system ext4 ro,seclabel,relatime,discard,data=ordered 0 0

/dev/block/bootdevice/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0

/dev/block/bootdevice/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0

/dev/block/bootdevice/by-name/dsp /dsp ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0

/dev/block/bootdevice/by-name/modem /firmware vfat ro,context=u:object_r:firmware_file:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0

tmpfs /storage tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0

/dev/block/dm-1 /data ext4 rw,seclabel,nosuid,nodev,relatime,discard,noauto_da_alloc,data=ordered 0 0

/dev/fuse /mnt/runtime/default/emulated fuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

/dev/fuse /storage/emulated fuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

/dev/fuse /mnt/runtime/read/emulated fuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

/dev/fuse /mnt/runtime/write/emulated fuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

/dev/block/bootdevice/by-name/oem /oem dfs rw,relatime 0 0

root:/ # umount /oem

umount /oem

尝试cd /oem的时候发现一个问题。

root/ # cd oem

cd oem

/system/bin/sh: cd: /oem: Not a directory

原来内核没有实现lookup功能,添加如下

static struct dentry *dfs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)

{

return NULL;//暂时为空,没啥好找的。

}

const struct inode_operations dfs_inode_operations = {

.getattr = dfs_getattr,

.lookup = dfs_lookup,

};

http://www.bkjia.com/PHPjc/1114326.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1114326.htmlTechArticle如何写一个简易的文件系统(4):umount 哈哈,时隔几年,又从磁盘深处找出了原始代码 myfs.zip。 -----------------------------------------无敌分割...

共两个不同设计例子,都含详细的文档资料。 任务2.设计一个简单的二级文件系统 设计要求: 在任一OS下,建立一个大文件,把它假象成硬盘,在其中实现一个简单的模拟文件系统。 编一管理程序对此空间进行管理,要求: 1. 实现盘块管理 2. 实现文件的读操作 3. 每组最多2人,小组内要有明确分工,课程设计报告中设计部分可以相同,个人实现部分不同 参考建议: 将模拟硬盘的文件空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。 设计技术参数(数据结构)参考: #define MaxSize 100 #define Disk 512 //每个盘块大小为512bit #define NumDisk 2048 //有2048个盘块,既可分配空间为 1M /*************目录和文件的结构定义***********************/ struct DirectoryNode { char name[9]; /*目录或文件的名字*/ int type; /*0代表目录,1代表普通文件*/ struct DirectoryNode *next; /*指向下一个兄弟结点的指针*/ struct DirectoryNode *preDirFile; /*指向父结点的指针*/ struct DirectoryNode *subFile; /*指向第一个子结点的指针*/ int size; /*如果是文件则表示文件的大小*/ int first; /*起始盘块号*/ int last; /*末尾盘块号*/ int order; /*备用*/ }; //连续分配 struct FileSys { int VacTable[NumDisk]; //空闲表,0为空闲,1为被用 struct DirectoryNode root; //根目录 struct DirectoryNode Directory[NumDisk]; } *filesys; typedef struct { struct DirectoryNode *DirFile; char name[9]; }DataType; //包含一个指向目录的指针和名字 typedef struct { //队列结构的实现 DataType data[MaxSize]; int front,rear; //分别表示队列的头结点和尾结点 }Tp; void InitQueue(Tp *sq) //队列初始化 int EnAddQueue(Tp *sq,DataType data) //在队列中增加元素 DataType EnDelQueue(Tp *sq) //从队列中删除一个元素 int Empty(Tp *sq) //判断队列是否为空,返回0表示队列为空 ①.Dir:显示目录内容命令,显示当前目录下的文件和子目录。 ②.Md:创建目录操作。 ③.Create:创建文件,在当前目录下创建一个文件。 ④. all:显示从根目录开始的所有目录和文件及其层次结点。 ⑤.Cd:改变目录。 ⑥.Del:删除文件操作。 ⑦. Rd:删除目录操作,删除当前目录下的子目录。 ⑧. Ren:重命名函数 ⑨. Exit:退出命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值