免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2099 | 回复: 5
打印 上一主题 下一主题

[内核入门] 关于kernel中的红黑树结构体 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-10 08:33 |只看该作者 |倒序浏览
大家好:
  1. struct rb_node
  2. {
  3.         unsigned long  rb_parent_color;
  4. #define RB_RED          0
  5. #define RB_BLACK        1
  6.         struct rb_node *rb_right;
  7.         struct rb_node *rb_left;
  8. } __attribute__((aligned(sizeof(long))));
复制代码
如上为2.6.39.4中的rbtree的结构体,话说由于对齐使得rb_parebt_color中最后两位未用到,从而可以存放节点颜色信息。我想了解具体怎样通过对齐能使的rb_parent_color变量多出来两个位?

谢谢.....

论坛徽章:
0
2 [报告]
发表于 2012-09-10 09:02 |只看该作者
__attribute__((aligned(sizeof(long))))

这玩意应该能保证至少4字节对齐,即使struct rb_node内嵌于其它结构体,参考没有出处,但是有一点,如果不是这样,那这玩意bug大了。

论坛徽章:
0
3 [报告]
发表于 2012-09-10 09:36 |只看该作者
__attribute__((aligned(sizeof(long))));  

这行代码, 会让 rb_node 在内存中以 4 字节对齐. 也就是 rb_node 的内存地址, 最低两位一定是0, 当然是其他的也无所谓, 因为并不会用到.

论坛徽章:
0
4 [报告]
发表于 2012-09-10 12:24 |只看该作者
回复 3# hk2305621


    你好,我对对齐的概念不是很清除。我的理解是这样的:既然是按照4字节对齐,应该是找   地址%4==0  的存储单元来存放数据,而这个地址只是存储单元的编制,即使它的最后两位是0,又怎能存放数据呢?

论坛徽章:
0
5 [报告]
发表于 2012-09-10 12:31 |只看该作者
这样说吧. 内存地址是 Addr % 4 后的结果.

那定义一个指针 *p = Addr,  然后,再对指针 *p 的最低两位赋值, *p = *p | 0x01(将最低位置1). 这个应该很容易理解吧.

那么下次使用指针 p 的时候.

*q = *q & (~0x3);

获取标志: flag = *q & 0x03.

论坛徽章:
0
6 [报告]
发表于 2012-09-10 12:39 |只看该作者
回复 5# hk2305621


    谢谢....我懂了.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP