(尚未解决该问题,还在查找资料中)
任务描述:
文件系统实验
实验内容:
(1) 查看当前系统所使用的文件系统的类型及版本号;
(2) 阅读Ext3(或Ext4)文件系统,特别是索引节点相关的源代码。
(3) 为内核添加一个新的系统调用filesys, 其从调用者接收一个磁盘文件的全局路径名,打印该文件占用的所有磁盘块;
(5) 重新编译、安装内核;
(6) 编写用户测试程序,测试filesys系统调用。
解决思路:
*查阅的linux源代码的版本为3.16.39
1、ext4文件系统种inode的定义位置:ext4.h/ext4_inode
参考博客:
ext2/3/4的inode结构说明
http://www.cnblogs.com/liuxuzzz/p/5348545.html
2、
可以看到inode的定义中有这样一行:
__le32 i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
i_block数组中存放的即为文件所在的磁盘块号。
通过查阅源码可以得到EXT4_N_BLOCKS的大小为15:
3、“inode填充可以从inode_operations.lookup看到,比如在ext3文件系统中,ext3_lookup->ext3_iget来填充inode”
“如何填充一个新创建的 inode, 是由具体文件系统提供的函数实现的。
http://www.cnblogs.com/wangzahngjun/p/5365310.html”
ext4_lookup中有这样一行:
1413 inode = ext4_iget_normal(dir->i_sb, ino);
将ext4_inode中的i_block[]填充到vfs的inode中的i_data的代码的位置:
ext4_inode中的i_block[]转换到vfs的inode里的i_data的代码位置如下:
/fs/ext4/inode.c
在这个函数内:
4394 struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
4509 /*
4510 * NOTE! The in-memory inode i_data array is in little-endian order
4511 * even on big-endian machines: we do NOT byteswap the block numbers!
4512 */
4513 for (block = 0; block < EXT4_N_BLOCKS; block++)
4514 ei->i_data[blo