免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2204 | 回复: 6

[C] 一段代码看不懂,求指点 [复制链接]

论坛徽章:
0
发表于 2013-02-16 15:53 |显示全部楼层
看别人写的源代码的时候没看懂,求指点:

最早的入口:
  1. static inline struct ext4_inode_info *EXT4_I(struct inode *inode)
  2. {
  3.         return container_of(inode, struct ext4_inode_info, vfs_inode);
  4. }
复制代码
然后container_of的定义:
  1. #define container_of(ptr, type, member) ({                        \
  2.         const typeof(((type *)0)->member) * __mptr = (ptr);        \
  3.         (type *)((char *)__mptr - offsetof(type, member)); })
  4. #endif
复制代码
然后google告诉我这里定义了__m的宏:
  1. 409 #define __get_user_asm_ex(x, addr, itype, rtype, ltype)                 \
  2. 410         asm volatile("1:        mov"itype" %1,%"rtype"\n"              \
  3. 411                      "2:\n"                                             \
  4. 412                      _ASM_EXTABLE(1b, 2b - 1b)                          \
  5. 413                      : ltype(x) : "m" (__m(addr)))
复制代码
至此,感觉很模糊了...
求指点.

论坛徽章:
0
发表于 2013-02-16 16:04 |显示全部楼层
回复 1# asdmonster




    #define container_of(ptr, type, member) ({                        \
            const typeof(((type *)0)->member) * __mptr = (ptr);        \
            (type *)((char *)__mptr - offsetof(type, member)); })
    #endif


然后google告诉我这里定义了__m的宏:

    409 #define __get_user_asm_ex(x, addr, itype, rtype, ltype)                 \
    410         asm volatile("1:        mov"itype" %1,%"rtype"\n"              \
    411                      "2:\n"                                             \
    412                      _ASM_EXTABLE(1b, 2b - 1b)                          \
    413                      : ltype(x) : "m" (__m(addr)))

上面这两段没有任何联系吧   __mptr是个变量

论坛徽章:
0
发表于 2013-02-16 16:26 |显示全部楼层
container_of(inode, struct ext4_inode_info, vfs_inode);

已知结构成员的地址inode , 这个地址对应 第2个结构的成员vfs_inode
返回结构 struct ext4_inode_info 的地址, 返回值是struct ext4_inode_info *

论坛徽章:
0
发表于 2013-02-16 16:47 |显示全部楼层
container_of实现了根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针的功能。

论坛徽章:
0
发表于 2013-02-16 16:50 |显示全部楼层
首先这个定义的是一个内联函数
static inline struct ext4_inode_info *EXT4_I(struct inode *inode)
{
         return container_of(inode, struct ext4_inode_info, vfs_inode);
}
下面这个是个宏替换,先把这个概念建立好.然后再去理解那个宏替换.
#define container_of(ptr, type, member) ({                        \
        const typeof(((type *)0)->member) * __mptr = (ptr);        \
        (type *)((char *)__mptr - offsetof(type, member)); })
#endif
freshxman 该用户已被删除
发表于 2013-02-16 18:08 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2013-02-18 17:46 |显示全部楼层
return container_of(inode, struct ext4_inode_info, vfs_inode);

返回 inode 里面 vfs_inode中,上一个 ext4_inode_info 的指针。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP