紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 3675|回复: 4

x64 结构内存对齐计算

[复制链接]

8

主题

77

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3279
发表于 2015-4-29 22:46:21 | 显示全部楼层 |阅读模式
本帖最后由 陌路人 于 2015-4-30 10:27 编辑

原以为 x64的结构体是以8字节对齐的
当计算结构大小的时候 不够8字节的补齐,比如
结构大小 0x2c  sizeof的时候 会显示0x30 补齐8字节

可是后来, 反汇编时 发现这么行不通
反汇编的时候 操作的都是+?h 的偏移
所以 判断成员的大小很有必要 ,所以又做了一个实验
  1. typedef struct SIZEOF {
  2.         ULONG Count;
  3.         PVOID Ower;
  4.         ULONG A;
  5.         KEVENT Event;
  6.         ULONG Irql;
  7. } SIZEOF;
  8. DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
  9. DbgPrint("KEVENT=0x%x\n", sizeof(KEVENT));
  10. DbgPrint("PVOID=0x%x\n", sizeof(PVOID));
  11. DbgPrint("ULONG=0x%x\n", sizeof(ULONG));
  12. 打印结果:
  13.                         SIZEOF=0x38
  14.                         KEVENT=0x18
  15.                         PVOID=0x8
  16.                         ULONG=0x4
复制代码

看到打印结构发现了什么 ?
3个ULONG =C;
C+8+0x18= 2c; 可是这与结构完全不同
哦,想了想 原来分配内存的时候
把 不是8字节的 变量 都以8字节对齐
4*8=0x20; 然后 0x20+0x18=0x38;  

哦,原来如此, 挺高兴的,
但是 如果真的这么认为 就大错特错了

当时我是这么认为的, 可是后来又在看汇编代码的时候
发现又发现了问题,按照前面对结构理解的思路
汇编代码中的结构体 对不上号了;
这让我恼火了很长时间,最后发现就是出现在结构上的时候
决定重新 研究下 这个结构什么时候 到底多大;
又实验:
  1.         typedef struct SIZEOF {
  2.                 ULONG Count;
  3.                 PVOID Ower;
  4.                 ULONG A;
  5.                 //KEVENT Event;
  6.                 ULONG Irql;
  7.         } SIZEOF;
  8.         DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
  9. SIZEOF=0x18
复制代码

显然 0x18+KEVENT(0x18)=0x30; 跟上边的 0x38 显然是不一样的

然后就想难道以 结构中最大 值来决定的?
或者 ````再多的猜想也没用, 实验吧;
经过了N次 实验后 发现问题了  原来是我对内存对齐的概念没有搞清楚
  1.         typedef struct SIZEOF {
  2.                 UCHAR A;
  3.                 ULONG64 B;
  4.                 UCHAR C;
  5.                 ULONG64 D;
  6.                 UCHAR E;
  7.                 ULONG64 F;
  8.                 ULONG G;
  9.                 ULONG64 K;
  10.         } SIZEOF;
  11.         DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
  12.         SIZEOF=0x40
复制代码

       
        结果是0x40 因为是8字节对齐方式
        比如第一个成员 uchar 1个字节
        但是下一个是8个字节的 要对齐
        所以这就成0x10个字节了
       
        同样 我把 成员变量的位置换 一下
        马上就变了
  1.                 typedef struct SIZEOF {
  2.                 UCHAR A;
  3.                 UCHAR C;
  4.                 UCHAR E;
  5.                 ULONG64 B;
  6.                 ULONG64 D;
  7.                 ULONG64 F;
  8.                 ULONG G;
  9.                 ULONG64 K;
  10.         } SIZEOF;
  11.         SIZEOF=0x30
复制代码

因为 少了2个8字节对齐 所以少了0x10
第一个8字节 能存放下 3个uchar 类型
现在 我把ulong 放到上边,一定会又少8个字节
  1.         typedef struct SIZEOF {
  2.                 UCHAR A;
  3.                 UCHAR C;
  4.                 UCHAR E;
  5.                 ULONG G;
  6.                 ULONG64 B;
  7.                 ULONG64 D;
  8.                 ULONG64 F;       
  9.                 ULONG64 K;
  10.         } SIZEOF;
  11.         DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
  12. SIZEOF=0x28
复制代码


注意这 上边是以8字节为准的 ,如果没有 8字节的变量呢
所以 这样实验下        
  1.         typedef struct SIZEOF {
  2.                 UCHAR A;
  3.                 UCHAR C;
  4.                 UCHAR E;
  5.                 ULONG G;
  6.                 ULONG B;
  7.         } SIZEOF;
  8.         DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
  9. SIZEOF=0xc
复制代码

现在是以4字节对齐的了,
这么看来 如果一个结构中最大的不超过8字节
将不会以8字节为准 以最大的字节 比如这样
  1.         typedef struct SIZEOF {
  2.                 UCHAR E;
  3.                 USHORT a;
  4.         } SIZEOF;
  5.         DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
  6. SIZEOF=0x4
复制代码

评分

参与人数 1水晶币 +60 收起 理由
Tesla.Angela + 60 赞一个!

查看全部评分

0

主题

15

帖子

0

精华

铜牌会员

小白

Rank: 2Rank: 2

积分
62
发表于 2015-4-30 00:20:54 | 显示全部楼层
飘过帮顶,楼下解答!!
到后来才发现爱你是一种习惯

854

主题

3481

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2015-5-2 00:32:29 | 显示全部楼层
忘记是8还是16字节了。

反正如果不爽的话可以设置1字节对齐。

8

主题

77

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3279
 楼主| 发表于 2015-5-2 14:41:47 | 显示全部楼层
Tesla.Angela 发表于 2015-5-2 00:32
忘记是8还是16字节了。

反正如果不爽的话可以设置1字节对齐。

对结构 这个对齐的理解, 主要用在 反汇编时
判断 结构中的成员变量的大小,
以及对结构的成员 大概心里有个数

0

主题

111

帖子

0

精华

银牌会员

Rank: 3Rank: 3Rank: 3

积分
340
发表于 2017-11-30 14:34:43 | 显示全部楼层
谢谢分享~~ 学习下
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-26 16:10 , Processed in 0.025655 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表