当前位置:  技术问答>linux和unix

内存对齐的问题,会的请进

    来源: 互联网  发布时间:2016-09-21

    本文导语:    在调裸机的USB驱动的时候,发现在端点描述符中的MaxPacketSize这个变量占的是两个字节,在U-BOOT中将它定义为unsigned short型的占两个字符,其中端点描述符总共是7个字节,在MaxPacketSize的前面和后面还有几个是定...

  在调裸机的USB驱动的时候,发现在端点描述符中的MaxPacketSize这个变量占的是两个字节,在U-BOOT中将它定义为unsigned short型的占两个字符,其中端点描述符总共是7个字节,在MaxPacketSize的前面和后面还有几个是定义为unsigned char型的变量,现在问题来了。在调试的过程中发现,当MaxPacketSize处于奇地址的时候,使用这个变量的时候程序会死掉。应该是内存对齐的问题,因为我前一个端点打印出来的时候,MaxPacketSize是处于偶地址的。于是我将MaxPacketSize放到了端点描述符结构体的开头,调试后还是不行。于是我将MaxPacketSize改为了两个unsigned char的变量,在使用的时候使用位移就行了。
  请问除了这个方法,还有别的解决内存对齐的问题吗?

其中在结构体的定义的时候,在后面加了个__attribute__((packet)),查资料得知是GCC的对齐方式,这里强制以模1对齐,结构体如下:
C/C++ code
struct usb_endpoint_descriptor {
    unsigned char  bLength;
    unsigned char  bDescriptorType;
    unsigned char  bEndpointAddress;
    unsigned char  bmAttributes;
    //unsigned char  wMaxPacketSizeL;
    //unsigned char  wMaxPacketSizeH;
    unsigned short  wMaxPacketSize;
    unsigned char  bInterval;
    unsigned char  bRefresh;
    unsigned char  bSynchAddress;

//} __attribute__ ((packed));
};


当不加__attribute__ ((packed))得出的结构体大小是10个字节,在使用的时候就不知道出现程序死掉的现象了。当不加__attribute__ ((packed))的时候,得出的大小是9个字节,如果使用的时候就会出现程序死掉的情况。

加入__attribute__ ((packed))这一行是设定编译器取消在编译过程中的内存对齐方式,如果是这样的化,比如像上面的一样,在一串char中间有short,int的变量,而且它们刚好在奇地址上要怎么访问呢? 
 

|
只需要注意大小,长短就可以了。不需要具体的地址吧。
理论上搞不清楚,就用sizeof()来统计核对。

|
两种方法,一种pack,一种手动加pad。

|
内存不对齐,可能导致代码core掉。

搞清为何要内存对齐,就可以解释你的问题了。
http://www.fish888.com/-t149534

http://bigwhite.blogbus.com/logs/1347304.html

1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

|
我觉得首先要搞清楚的问题是为什么不对齐程序就会死掉,而不是如何去对齐。

|
觉得从现象上来看也不一定就是内存对齐问题,建议仔细看看逻辑,不要先入为主的好。

    
 
 

您可能感兴趣的文章:

  • unix下内存边界对齐问题!
  • unix下,如何使得结构按1字节进行内存对齐?
  • struct 结构内存对齐问题.
  • 教你5分钟轻松搞定内存字节对齐
  • 求助:unix下内存对齐问题的解决
  • 内存对齐的问题
  • VC++中内存对齐实例教程
  • 浅析内存对齐与ANSI C中struct型数据的内存布局
  • 深入内存对齐的详解
  • 深入理解c/c++ 内存对齐
  • C语言内存对齐实例详解
  • C语言、C++内存对齐问题详解
  • 关于C++内存中字节对齐问题的详细介绍
  • 深入理解C语言内存对齐
  • 解析内存对齐 Data alignment: Straighten up and fly right的详解
  • c/c++服务器程序内存泄露问题分析及解决
  • 一个问题,关于kmalloc分配的内存和编译器自动分配的内存的问题(堆和栈)
  • 请教一个关于内存分配的问题(系统和DMA共享一块物理内存空间)
  • [跪求解答]关于虚拟内存中页目录与页表在物理内存中加载的问题
  • 遇到奇怪的内存泄露问题,应用程序杀死内存无法释放!
  • 请教关于linux内存管理问题,如何给定义的变量指定固定内存段
  • 【求助】AIX下进程内存分配问题,无法分配超过256M的内存
  • Solaris上内存释放问题
  • vsftpd占用内存的问题
  • linux虚拟内存的问题!急!!!
  • 请教几个虚拟内存的问题!谢谢
  • 有关系统内存的概念问题
  • 共享内存问题,高手们请进!!!
  • ubuntu的问题。查看内存使用情况的问题
  • dos内存问题,请帮助
  • 问个LINUX内存分配的问题。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Vectors 成员 get_allocator():返回vector的内存分配器
  • 我的机器内存128 ,安装redhat9 后,可用内存很少了,如何节省内存呢?
  • C++ Vectors 成员 capacity():返回vector所能容纳的元素数量(在不重新分配内存的情况下)
  • 奇闻:Apache+Apache JServ 1.1.1+1G内存居然报内存不够,那位高友知道参数设置,把俺的1G内存都利用起来,感激不尽啊
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 怎样读取指定内存地址处指定长度的内存数据???(
  • C/C++内存池实现介绍及基本要求
  • 【操作系统虚拟内存和物理内存疑惑】
  • linux下free命令显示的内存使用情况分析
  • Solaris下如何获得物理内存和虚拟内存的大小?
  • c/c++内存堆分配和栈分配理解
  • 程序需要共享内存相当大,但是系统的内存有限
  • Ubuntu查看内存,进程相关命令介绍
  • 关于大于2G内存的使用.....按32位编译的进程怎么使用大于2G的内存?
  • Linux 共享内存介绍及实现代码
  • redhat9内存使用率高达73%,怎么查看内存具体使用情况
  • Linux内存文件系统(ramdisk)的三种实现方式
  • 多个进程对系统V共享内存进行读写,怎样实现对共享内存部分进行加解锁?
  • Microsoft IE MSHTML内存破坏远程代码执行漏洞
  • redhat7.1 p4,700多m内存,经常耗了400m内存,为什么?
  • Microsoft Internet Explorer内存破坏漏洞(CNVD-2013-13096)
  • 哪位前辈给解释下linux下虚拟内存和物理内存的关系!


  • 站内导航:


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

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

    浙ICP备11055608号-3