忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 2647 | 回复: 10

[内核入门] biefield与endian 2 [复制链接]

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2016-07-06 17:17 |显示全部楼层
本帖最后由 karma303 于 2016-07-06 17:19 编辑

  本来想更新到这篇旧帖子里的,但觉得这部分有点儿“地理大发现”的感觉,就专门贴出来,跟各位交流。
  我说的“地理大发现”,是说wiki上的ip header的布局图,它们用0,1,2,3,4,5,6,7细分出每个字节的bit,但wiki上的0,1,2,3,4,5,6,7,分别对应常规思维的7,6,5,4,3,2,1,0。

1.png
   到这里我才发现,原来wiki上给出的布局图,是彻彻底底的按照“大端思维“来走的。
   其实wiki就从RFC里摘的图,1981年的文档,那时的程序员为什么会反着看bit?(是没经过x86的洗礼吗?)
   
   题外话:
   在上一篇帖子里,我贴了一点关于bitfield跨字节的测试。
   其实今天意识到这个问题,也是从ip header里的offset成员开始的,我发现没办法用bitfield来表示这个成员。

2.png
  如果编译目标是小端机器,gcc是没有办法用bitfield来表示offset这个成员的。
  所以linux内核里,很粗暴的定义成:
  __be16        frag_off;
  __be16就是unsigned short。
  然后在代码里再分解它:
        offset = ntohs(ip_hdr(skb)->frag_off);
        flags = offset & ~IP_OFFSET;
        offset &= IP_OFFSET;
        offset <<= 3;                /* offset is in 8-byte chunks */

评分

参与人数 1可用积分 +6 收起 理由
Godbach + 6 赞一个!

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2016-07-06 19:43 |显示全部楼层
回复 1# karma303

佩服 LZ 深度钻研的精神!

   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2016-07-06 19:48 |显示全部楼层
回复 1# karma303
最后一个图,太能说明问题了。


   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2016-07-07 15:32 |显示全部楼层
karma303 发表于 2016-07-06 17:17
本来想更新到这篇旧帖子里的,但觉得这部分有点儿“地理大发现”的感觉,就专门贴出来,跟各位交流。
   ...


在部分平台或许可以,linux要用在各种CPU平台上,所以这样了

论坛徽章:
16
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00黑曼巴
日期:2016-12-26 16:00:32每日论坛发贴之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:51程序设计版块每日发帖之星
日期:2016-06-03 06:20:00程序设计版块每日发帖之星
日期:2016-06-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-30 06:20:00程序设计版块每日发帖之星
日期:2016-03-19 06:20:00程序设计版块每日发帖之星
日期:2016-03-12 06:20:00
发表于 2016-07-07 17:03 |显示全部楼层
本帖最后由 nswcfd 于 2016-07-07 17:04 编辑

精彩的分析!

对于线上的bit,估计是先到的算0号吧?

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2016-07-07 17:44 |显示全部楼层
回复 5# nswcfd



   网线按什么样的bit序传递数据,似乎影响不到软件编程。连写网卡驱动时都不需要关心它。
   我在osdev上问过相关的问题,但得到的回答有不痛不痒,可能是我英文水平有限吧。
   forum.osdev.org/viewtopic.php?f=1&t=30485

论坛徽章:
16
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00黑曼巴
日期:2016-12-26 16:00:32每日论坛发贴之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:51程序设计版块每日发帖之星
日期:2016-06-03 06:20:00程序设计版块每日发帖之星
日期:2016-06-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-30 06:20:00程序设计版块每日发帖之星
日期:2016-03-19 06:20:00程序设计版块每日发帖之星
日期:2016-03-12 06:20:00
发表于 2016-07-07 18:34 |显示全部楼层
本帖最后由 nswcfd 于 2016-07-07 18:39 编辑

嗯,forum.osdev.org/viewtopic.php?f=1&t=30485,很有意思的讨论。

https://en.wikipedia.org/wiki/Bit_numbering
里面有一句话
The recommended style for Request for Comments documents is "MSB 0" bit numbering.[3][4]


[3]  Scott, Gregor (June 1998 ). "RFC 2360 - Guide for Internet Standards Writers". Internet Engineering Task Force (IETF). p. 11. Retrieved 2010-02-14. The preferred form for packet diagrams is a sequence of long words in network byte order, with each word horizontal on the page and bit numbering at the top
[4]  "RFC 1166 - INTERNET NUMBERS". Internet Engineering Task Force (IETF). July 1990. p. 1. Retrieved 2014-06-11. Whenever an octet represents a numeric quantity the left most bit in the diagram is the high order or most significant bit


论坛徽章:
16
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00黑曼巴
日期:2016-12-26 16:00:32每日论坛发贴之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:51程序设计版块每日发帖之星
日期:2016-06-03 06:20:00程序设计版块每日发帖之星
日期:2016-06-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-30 06:20:00程序设计版块每日发帖之星
日期:2016-03-19 06:20:00程序设计版块每日发帖之星
日期:2016-03-12 06:20:00
发表于 2016-07-07 19:10 |显示全部楼层
本帖最后由 nswcfd 于 2016-07-07 19:31 编辑

struct BYTE {
  char bit:1;
};

bitfield是C语言的概念,所以C编译器需要关心,BYTE.bit到底使用MSB还是使用LSB。
*选择LSB,BYTE.bit =1 对应 or 0x01;
*选择MSB,BYTE.bit = 1对应 or 0x80;
*选择其它bit应该也是可以的吧?

我的问题是,虽然x86上的gcc事实上选择了LSB(没说错吧?),
但是如果假设它选择了使用MSB,那有没有违反C标准的规定?或者会造成其它语义上的错误?

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2016-07-07 20:36 |显示全部楼层
回复 8# nswcfd

《程序员的自我修养》的附录A.1讲了byte order,不知道你看过没。
类似这样的句子,
Big-endian和little-endian的区别就是big-endian规定MSM在存储时放在低地址,在传输时MSB放在流的开始;LSB存储时放在高地址,在传输时放在流的末尾。little-endian则相反。
讲的很好。

但我几乎不关心LSB和MSB的概念,它只会让我困扰。
所以你的问题,都不在我的思维模式里,抱歉我一个答不上来。
   

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2016-07-07 20:48 |显示全部楼层
回复 4# mordorwww

对,像MIPS上,用bitfield访问就很自然。
这种东西,只要道理明白了,剩下的都事在人为。像我的内核(x86)里,照样的用bitfield访问:
struct iphdr{
        u32 len: 4;                                                /* header length */
        int version: 4;
        u8 ignore;
        u16 tot_len;                                        /* total length, header included */
        u16 msgid;                                                /* IP datagram identification */
        union{
                struct{
                        u16 me_offset: 13;                                /* the offset of this IP fragment */
                        int flag_mf: 1;                                        /* more fragments */
                        int flag_df: 1;                                        /* don't fragment */
                        int flag_reserved: 1;
                };
                u16 flag_off;
        };
        u8 ttl;
        u8 protocol;
        u16 chksum;
        u32 myip;
        u32 yourip;
};
每当接收到一个ip报文时,我先把flag_off成员字节翻转,然后就可以用bitfield访问了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP