当前位置: 技术问答>linux和unix
学习内核(赵博分析的那一版本)时,不理解empty_dir(namei.c中)指针转换,请高手指点
来源: 互联网 发布时间:2015-11-30
本文导语: struct buffer_head * bh; struct dir_entry * de; len = inode->i_size / sizeof (struct dir_entry); if (leni_zone[0] || !(bh=bread(inode->i_dev,inode->i_zone[0]))) { printk("warning - bad directory on dev %04xn",inode->i_dev); return 0; } de = (struct...
struct buffer_head * bh;
struct dir_entry * de;
len = inode->i_size / sizeof (struct dir_entry);
if (leni_zone[0] ||
!(bh=bread(inode->i_dev,inode->i_zone[0]))) {
printk("warning - bad directory on dev %04xn",inode->i_dev);
return 0;
}
de = (struct dir_entry *) bh->b_data; =================1
if (de[0].inode != inode->i_num || !de[1].inode || ================2
strcmp(".",de[0].name) || strcmp("..",de[1].name)) {
printk("warning - bad directory on dev %04xn",inode->i_dev);
return 0;
}
对于1处,不明白,两个不同的结构指针,如此转换可以吗?
强行把struct buffer_head指针中的域b_data的地址转换为另外一个结构体指针(struct dir_entry *),这个转换对吗?
这样2处应该会出问题的阿。
后来我仿照该函数写了一个小函数测试了一下,根本通不过,2处有问题。
我的理解是在2处前根本没有对de进行赋值操作,2处的取操作不可; de[0].inode这个又怎么理解呢?
也许我理解的不对,请指点
struct dir_entry * de;
len = inode->i_size / sizeof (struct dir_entry);
if (leni_zone[0] ||
!(bh=bread(inode->i_dev,inode->i_zone[0]))) {
printk("warning - bad directory on dev %04xn",inode->i_dev);
return 0;
}
de = (struct dir_entry *) bh->b_data; =================1
if (de[0].inode != inode->i_num || !de[1].inode || ================2
strcmp(".",de[0].name) || strcmp("..",de[1].name)) {
printk("warning - bad directory on dev %04xn",inode->i_dev);
return 0;
}
对于1处,不明白,两个不同的结构指针,如此转换可以吗?
强行把struct buffer_head指针中的域b_data的地址转换为另外一个结构体指针(struct dir_entry *),这个转换对吗?
这样2处应该会出问题的阿。
后来我仿照该函数写了一个小函数测试了一下,根本通不过,2处有问题。
我的理解是在2处前根本没有对de进行赋值操作,2处的取操作不可; de[0].inode这个又怎么理解呢?
也许我理解的不对,请指点
|
先看一下struct buffer_head 和struct dir_entry :
68 struct buffer_head {
69 char * b_data; /* pointer to data block (1024 bytes) */
70 unsigned long b_blocknr; /* block number */
71 unsigned short b_dev; /* device (0 = free) */
72 unsigned char b_uptodate;
73 unsigned char b_dirt; /* 0-clean,1-dirty */
74 unsigned char b_count; /* users using this block */
75 unsigned char b_lock; /* 0 - ok, 1 -locked */
76 struct task_struct * b_wait;
77 struct buffer_head * b_prev;
78 struct buffer_head * b_next;
79 struct buffer_head * b_prev_free;
80 struct buffer_head * b_next_free;
81 };
157 struct dir_entry {
158 unsigned short inode;
159 char name[NAME_LEN];
160 };
可以看出bh->b_data是指向1024字节数据块的指针,而进行操作:de = (struct dir_entry *) bh->b_data 是把一个char *类型的指针强制转换为一个struct dir_entry *类型的指针,这是允许的。
这个转换的实际含义是:将指针de指向由bh->b_data指向的一个数据块,这个数据块有1024字节,存放的是一个目录所有子目录。这时你就可以把这个数据块想像成一个数组,它的每个元素是一个目录项struct dir_entry,就是说这个数据块存放的内容是一个个结构体struct dir_entry。
一个目录中应至少包括两个目录项,指向本身的"."和指向父目录的"..",而这两个目录项就是放在由bh->b_data所指向数据块中的目录项的开头两个目录项中。要查找一个目录中的所有子目录,也就可以从bh->b_data中按照目录项的结构一项一项往下找了。
de[0]是指第一个目录项,对应的是目录项".",de[0].inode就是本目录的i节点号,de[0].name就是该目录名,对应的是一个字符串。同理de[1]就是目录项"..",de[n]就对应该目录中的一个子目录了。
68 struct buffer_head {
69 char * b_data; /* pointer to data block (1024 bytes) */
70 unsigned long b_blocknr; /* block number */
71 unsigned short b_dev; /* device (0 = free) */
72 unsigned char b_uptodate;
73 unsigned char b_dirt; /* 0-clean,1-dirty */
74 unsigned char b_count; /* users using this block */
75 unsigned char b_lock; /* 0 - ok, 1 -locked */
76 struct task_struct * b_wait;
77 struct buffer_head * b_prev;
78 struct buffer_head * b_next;
79 struct buffer_head * b_prev_free;
80 struct buffer_head * b_next_free;
81 };
157 struct dir_entry {
158 unsigned short inode;
159 char name[NAME_LEN];
160 };
可以看出bh->b_data是指向1024字节数据块的指针,而进行操作:de = (struct dir_entry *) bh->b_data 是把一个char *类型的指针强制转换为一个struct dir_entry *类型的指针,这是允许的。
这个转换的实际含义是:将指针de指向由bh->b_data指向的一个数据块,这个数据块有1024字节,存放的是一个目录所有子目录。这时你就可以把这个数据块想像成一个数组,它的每个元素是一个目录项struct dir_entry,就是说这个数据块存放的内容是一个个结构体struct dir_entry。
一个目录中应至少包括两个目录项,指向本身的"."和指向父目录的"..",而这两个目录项就是放在由bh->b_data所指向数据块中的目录项的开头两个目录项中。要查找一个目录中的所有子目录,也就可以从bh->b_data中按照目录项的结构一项一项往下找了。
de[0]是指第一个目录项,对应的是目录项".",de[0].inode就是本目录的i节点号,de[0].name就是该目录名,对应的是一个字符串。同理de[1]就是目录项"..",de[n]就对应该目录中的一个子目录了。
|
嗯,我没有看过这本书,不过就这个问题看起来,这里的bh->b_data中的数据应该就是按照struct dir_entry 的结构填入的,而且似乎还是struct dir_entry 型的数组。b_data本身的数据类型,我猜应该是一个char型的数组,可以向里面按照需要的格式写入数据。你可以去看看是哪里填入的。