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