当前位置:  技术问答>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 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]就对应该目录中的一个子目录了。

|
嗯,我没有看过这本书,不过就这个问题看起来,这里的bh->b_data中的数据应该就是按照struct dir_entry 的结构填入的,而且似乎还是struct dir_entry 型的数组。b_data本身的数据类型,我猜应该是一个char型的数组,可以向里面按照需要的格式写入数据。你可以去看看是哪里填入的。

    
 
 

您可能感兴趣的文章:

  • C语言指针学习经验总结浅谈
  • 函数指针与指针函数的学习总结
  • 关于《C和指针》的学习笔记
  • 我想学习linux桌面编程,那么有没有必要学习linux的内核以及内核的相关编程呢?
  • 学习linux网络编程需要学习些内核知识吗?
  • 《Linux内核情景分析》值得推荐的内核学习参考两用资料
  • linux内核中网络模块的学习
  • 有关linux内核的学习
  • 高人指点下内核学习
  • 在哪儿可以报名学习Linux内核编程
  • 紧急求救,内核的学习
  • 如何深入Linux的内核学习?
  • ★★★小弟想学习Linux内核,请问装哪个版本的比较合适?★★★
  • 学习linux内核入门:从哪一部分开始学习?
  • 有没有linux内核学习的QQ群呢?
  • 内核学习,请达人指导
  • 学习LIUNX内核应具备那些知识!!
  • 请教linux的学习,怎么学? 内核开发找什么样的工作?
  • 搞ARM一定要学习Linux内核吗?
  • 请教高手:如何学习内核编程?
  • linux内核学习及工作的提问
  • 怎么学习LINUX的内核呀?
  • 内核学习求教!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 学习java的迷惑...望各位大侠指点迷经
  • 下一步该学习linux/unix的什么?请高手指点……
  • 谁来帮帮初学者,指点一条学习路线
  • 加入linux,学习流程和方法问题,请指点
  • 网络安全学习疑惑?请指点
  • 怎样学习Jsp能速成???帮忙指点,多谢!!!!
  • SecureCRT终端学习指点
  • 想学习linux嵌入式开发,具体买什么开发板,请高人指点?
  • 由于本人刚开始学习JSP,请各位高手指点
  • 初学linux 请大家指点一下学习书籍
  • 想学习写协议栈,请高手指点一下好吗?
  • 哪位能给指点下学习路线
  • 请指点:初学者应怎样学习?
  • 小弟初来乍到,不知学习j2me从何入手?请各位老大指点
  • 想通过自己动手学习Linux网络编程,做一个什么比较好呢?望有经验的高手指点~~
  • Java做Web开发,想学习下Linux,不知用什么版本的好,望各位大神们指点
  • 想学习linux环境下的IM server/client 开发,请有经验的朋友指点一下!
  • 小弟刚开始学习UNIX 编成 。哪个高手指点一下推荐一本编成书。最好电子版
  • 我刚刚开始学习Java,请各位高手指点捷径,推荐几个学习Java的网站。谢谢。
  • 学习design pattern,苦于没有java代码的例子,高手指点
  • PHP介绍及学习网站推荐
  • 想深入学习Java应该学习哪些东西
  • 准备学习docker: docker version命令查看版本
  • 新手提问:学习c++同时也想学习unix和linux
  • 编程语言 iis7站长之家
  • 学习c后,学习pb,大家提点建议,谢谢哦
  • OpenStack相关学习资料搜集
  • 有最近开始学习Minix的吗?一起来学习吧
  • juqery的python实现:pyquery学习使用教程
  • 我想问问哪里有AIX下啊!~版本越新越好!~我想拿来学习学习
  • 想找共同学习Linux的新手,一起学习,共同成长


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3