Directory 如何从映射内存中读取ext2根目录?

Directory 如何从映射内存中读取ext2根目录?,directory,root,ext2,Directory,Root,Ext2,我正在为我的大学制作一个远程文件系统服务器,我在读取根目录时遇到了一些问题。。。事情是这样的: 我已经读取了根索引节点(索引节点2),它有一致的数据,我的意思是,例如,所有者用户Id字段设置为“1000”。然后,我继续读取inode数据块的内容,但当我尝试访问相关数据块(inode I_块数组中唯一寻址的数据块,调试时为240)时,所有字节都设置为“0”。有人能帮我吗?这真的很重要。注意:除了使用映射内存之外,我没有其他方法,我不是打开一个真正的磁盘,而是打开一个.disk linux文件。它是

我正在为我的大学制作一个远程文件系统服务器,我在读取根目录时遇到了一些问题。。。事情是这样的: 我已经读取了根索引节点(索引节点2),它有一致的数据,我的意思是,例如,所有者用户Id字段设置为“1000”。然后,我继续读取inode数据块的内容,但当我尝试访问相关数据块(inode I_块数组中唯一寻址的数据块,调试时为240)时,所有字节都设置为“0”。有人能帮我吗?这真的很重要。注意:除了使用映射内存之外,我没有其他方法,我不是打开一个真正的磁盘,而是打开一个.disk linux文件。它是用命令行创建的

mkfs.ext2-F-r0-b102ext2.30000磁盘

这是我的密码:

#include <linux/ext2_fs.h>

typedef struct s_inode *pinode;         /* Pointer to inode struct  */
typedef struct s_direct *pdir;          /* Pointer to direct struct */

int main(int argv, char *argc[]){
   int *data;
   pdir root = malloc(sizeof(struct s_direct));

   /* Code for mpping .disk file, fetching supernode, and other ext2 data */
   /* fsys is a global variable that holds general ext2 system data       */
   fsys->root           = get_inode(2);
   data                 = get_cont(fsys->root);
   root                 = (pdir)getblock(data[0]);

}

pinode get_inode(int idx){
    pinode inod;
    int grp, offs;

    grp =  (idx-1)/fsys->superblock->s_inodes_per_group;
    offs = (idx-1)%fsys->superblock->s_inodes_per_group;
    inod = (pinode)&fsys->diskmap[(fsys->group[grp]->itab)+offs*sizeof(struct s_inode)];

    return inod;
}

int *get_cont(pinode inod){
    int *cont; 
    int *idx;
    int i=0;
    int *block;

    idx  = malloc(sizeof(int)); 
    cont = malloc(sizeof(int));

    while(i < inod->i_blocks && i<13) {
            realloc(cont, i*sizeof(int));
            cont[i]=inod->i_block[i];
            i++;
    }

    if(i < inod->i_blocks){
        *idx=13;
        block=(int*)getblock(inod->i_block[*idx]);
        fetchcont(block, idx, cont, inod->i_blocks, 0);
    }
    if(i < inod->i_blocks){
        block=(int*)getblock(inod->i_block[*idx]);
        fetchcont(block, idx, cont, inod->i_blocks, 1);
    }
    if(i < inod->i_blocks){
        block=(int*)getblock(inod->i_block[*idx]);
        fetchcont(block, idx, cont, inod->i_blocks, 2);
    }

    return cont;

}

int fetchcont(int *block, int *idx, int *cont, int lim, int lvl){
    int i=0;

    if(lvl == 0){
        while((*idx) < lim && i<fsys->bsize){
            realloc(cont, (*idx)*sizeof(int));
            cont[*idx]=block[i];
            (*idx)++;
            i++;
        }
        if(i>=fsys->bsize){
            return 1;
        }else{
            return 0;
        }
    }else{
        lvl--;
        while(i<fsys->bsize){
            if(!fetchcont((int*)getblock(block[i]), idx, cont, lim, lvl)){
                return 0;
            }
            i++;
        }

    }
}

void *getblock(int idx){
    char *block;
    int grp, offs;

    grp   = (idx-1)/fsys->superblock->s_blocks_per_group;
    offs  = (idx-1)%fsys->superblock->s_blocks_per_group;
    block =  &fsys->diskmap[fsys->group[grp]->blocks+offs*fsys->bsize];

    return block; 
}
#包括
typedef结构s_inode*引脚;/*指向inode结构的指针*/
typedef结构s_direct*pdir;/*指向直接结构的指针*/
int main(int argv,char*argc[]){
int*数据;
pdir root=malloc(sizeof(struct s_direct));
/*用于mpping.disk文件、获取超级节点和其他ext2数据的代码*/
/*fsys是保存一般ext2系统数据的全局变量*/
fsys->root=get\u inode(2);
数据=获取控制(fsys->root);
root=(pdir)getblock(数据[0]);
}
pinode get_inode(int idx){
皮诺德·伊诺德;
int grp,OFF;
grp=(idx-1)/fsys->superblock->s_inodes_per_group;
offs=(idx-1)%fsys->superblock->s\u inodes\u每个组;
inod=(pinode)&fsys->diskmap[(fsys->group[grp]->itab)+offs*sizeof(struct s_inode)];
返回inod;
}
int*get_cont(pinode inod){
国际*续;
int*idx;
int i=0;
int*块;
idx=malloc(sizeof(int));
cont=malloc(sizeof(int));
而(ii_块和ii_块[i];
i++;
}
如果(ii_块){
*idx=13;
block=(int*)getblock(inod->i_block[*idx]);
fetchcont(块,idx,cont,inod->i_块,0);
}
如果(ii_块){
block=(int*)getblock(inod->i_block[*idx]);
fetchcont(块,idx,cont,inod->i_块,1);
}
如果(ii_块){
block=(int*)getblock(inod->i_block[*idx]);
fetchcont(块,idx,cont,inod->i_块,2);
}
返回控制;
}
int fetchcont(int*block、int*idx、int*cont、int lim、int lvl){
int i=0;
如果(lvl==0){
而((*idx)=fsys->bsize){
返回1;
}否则{
返回0;
}
}否则{
lvl--;
while(ibsize){
如果(!fetchcont((int*)getblock(block[i]),idx,cont,lim,lvl)){
返回0;
}
i++;
}
}
}
void*getblock(int-idx){
字符*块;
int grp,OFF;
grp=(idx-1)/fsys->superblock->s_blocks_per_group;
offs=(idx-1)%fsys->superblock->s\u blocks\u每个组;
block=&fsys->diskmap[fsys->group[grp]->blocks+offs*fsys->bsize];
返回块;
}

解决了这个问题。我假设block n是n个数据块,但是偏移量包含了所有的块。我将getblock函数改为

void *getblock(int idx){

    return &fsys->diskmap[fsys->bsize*idx];
}

并且成功了!

解决了这个问题。我假设块n是n数据块,但是偏移量包括了所有的块。我将getblock函数改为

void *getblock(int idx){

    return &fsys->diskmap[fsys->bsize*idx];
}
而且成功了