대학용 원격 파일 시스템 서버를 만들고 있는데 루트 디렉토리를 읽는 데 문제가 있습니다 ... 루트 아이 노드 (inode 2)를 읽었으며 일관된 데이터를 가지고 있습니다. 예를 들어, 소유자 사용자 ID 필드가 '1000'으로 설정되어 있습니다. 그런 다음 inode 데이터 블록의 내용을 읽으려고 시도하지만, 문제의 데이터 블록 (inode i_block 배열에서 해결되는 유일한 데이터 블록, 디버깅시 240)에 액세스하려고하면 모든 바이트가 '0 '. 아무도 이것으로 나를 도울 수 있습니까? 정말 중요합니다. 참고 : 매핑 된 메모리가 아닌 다른 방법으로 만들 수는 없으며 실제 디스크를 열지 않고 .disk Linux 파일을 여는 것이 좋습니다. 그것은 명령 줄어떻게 매핑 된 메모리에서 ext2 루트 디렉토리를 읽습니까?
mkfs.ext2 -F -r 0 -b 1024 ext2.disk로 만들어졌습니다 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;
}