热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

堆栈指针指向保留的内存

如何解决《堆栈指针指向保留的内存》经验,为你挑选了1个好方法。

我正在调试英飞凌Tricore TC275上的加密实现代码(参考汇编语言).

PMI_PSPR (wx!p): org = 0xC0000000, len = 24K  /*Scratch-Pad RAM (PSPR)*/ 
DMI_DSPR (w!xp): org = 0xD0000000, len = 112K  /*Local Data RAM (DSPR)*/ 

在调用mac函数后,堆栈指针a [10]始终指向保留的存储区域.

###### typedefs ######
typedef uint16_t limb_t;
typedef limb_t gf_t[DIGITS]; //DIGITS=312
typedef int32_t dslimb_t;
################################

/**Multiply and accumulate c += a*b*/
void mac(gf_t c, const gf_t a, const gf_t b)
1: 0xC0000812:   D9 AA 40 9F   LEA     a10,[a10]-0x9C0 //Load eff. addr.
       /*Reference non-Karatsuba MAC */
       dslimb_t accum[2*DIGITS] = {0};
2: 0xC0000816:   40 A2         MOV.AA  a2,a10
3: 0xC0000818:   D2 02         MOV     e2,0x0 //move 0x0 to d2 and d3
4: 0xC000081A:   C5 03 37 40   LEA     a3,0x137 // 0.5*length of accum
5: 0xC000081E:   89 22 48 01   ST.D    [a2+]0x8,e2 //<= fails here
6: 0xC0000822:   FC 3E         LOOP    a3,0xC000081E 
7: 0xC0000824:   40 AF         MOV.AA  a15,a10

###contents of relevant registers###
                 before        after
1: a[10]         D000 0600     CFFF FC40 (not definend in memory map?)
2: a[2]          D000 0A06     CFFF FC40
3: d[2]          0000 0002     0000 0000
3: d[3]          0000 0000     0000 0000 (would have been set to zero too)
4: a[3]          0000 0186     0000 0137 (#of iterations in loop)
5: a[2]          CFFF FC40     (store failed here)
value@CFFF FC40  ???? ????     ???? ???? (write is not allowed I guess)

0x9C0 = 2496 (base10)并且数组的长度为624,每个元素包含一个int32_t.这样624*4 = 2496 Bytes得到分配还是什么?

但是在内存中的这个地址,只要我理解为链接器提供的内存映射,就不允许写入...但生成的汇编代码试图在第5行中执行?

有谁知道我在这里做错了什么?我也尝试使用calloc在堆上分配内存(而不是像上面代码那样的堆栈吗?)但程序仍然崩溃.

我还将该行复制dslimb_t accum[2*DIGITS] = {0}到程序的开头,执行它没有错误.

非常感谢您的帮助!

编辑

像这样调用mac,统一采样一些统一的随机数

gf_t sk_expanded[DIM],b,c;
for (unsigned i=0; i

这段代码在我的主机上运行,​​但是在我的tricore微控制器上,它在第一次mac()函数调用中失败了.



1> Ped7g..:

由于"堆栈指针" a100xD0000600之前和堆栈在这个平台上向下生长,并分配给该区域内存芯片开始于0xD0000000=>你们有当地人和其他函数调用只有0x600字节的栈内存(和他们的本地人!) .

有谁知道我在这里做错了什么?

但您要分配0x9C0字节(加上一些更多的bc,除非在寄存器的结束,优化器是足够聪明,不分配他们的堆栈空间),从而导致去设计的存储区域之外,和第一次写入然后指示会崩溃.实际上,如果你要求更多的字节,你可能会意外地从Scratch-pad RAM内部开始(结果地址非常接近0xC0000000),一旦它离开了便笺簿区域,代码将在清除阵列时崩溃.

但生成的汇编代码试图在第5行?

生成的代码不检查C中的内存可用性,与此类问题有关C是"不安全"的编程语言,程序员+维护者/操作员负责构建代码并在堆栈这样的环境中运行它有足够的空间.或者将检查添加到动态的代码中,以至于无法在开发期间评估堆栈使用情况,并且代码应该优雅地处理满堆栈情况.

我也尝试使用calloc在堆上分配内存(而不是像上面代码那样的堆栈吗?)但程序仍然崩溃.

看起来像是不同的问题,或者你也有完整的堆(来自评论"堆应该是4k" - 听起来像非常小的堆,也许你已经用其他动态分配已经用尽了,也碎片可能会阻止你的内存分配器返回连续有效的3k阻止您的阵列).堆分配器倾向于NULL在池耗尽时返回,但可能您的平台非常有限,内存分配器在实现中缺少这样的安全代码,以使其更小.

我还将dslimb_t accum [2*DIGITS] = {0}行复制到程序的开头,执行它没有错误.

然后它是全局变量,它被置于.data类似的段中,该段被放置在足够大的存储区域中.

是的,624 32位整数需要至少2496(624*4)字节的内存(在C语言中,你通常支付零价格进行抽象,所以在这种情况下任何一块2496字节长的内存,根据你的平台要求对齐,这足以使这成为可能,在像Java这样的其他语言中,这种阵列的总成本要高得多,因为还有GC管理和阵列管理数据,所以你可以在这样的平台上计算大约3000-3500字节).


通常当一个人在如此多的约束系统上发展时(要求本地人的3k堆栈空间声音在桌面/网络编程世界中完全可以忽略不计,但在小型嵌入式系统或旧的8/16位计算机上可能是大量的内存),它可能有助于以"数据驱动"的方式设计代码和算法,即你完全规划你的内存使用,包括代码所在的位置(以及它有多大),本地/全局变量所在的位置,以及请注意,运行代码的所有状态所需的最大堆栈是多少.

您可以首先检查堆栈为何如此低 - "本地数据RAM"似乎大约110k,所以也许你有足够的空间,并且在构建期间有一些选项可以调整堆栈大小(或者链接器脚本可以被调整).

实际上你应该检查你的整个内存消耗设计,即你真正需要在内存中的数据,它在哪里,哪些是临时的,它们是什么生命周期等等(至少在粗略的千字节估计),并检查对芯片上的物理可用内存,因此您可以了解编写代码的粗心大意,或者最终是否已经为您的特定任务内存不足,甚至在开始实施之前.(您可以首先检查链接器映射文件,查看生成了多少代码,以及.data/.bss/.rodata/etc各部分中的固定变量有多大,然后检查所有局部变量和堆分配)

然后可能在某种结构中分配所需的内存.你甚至需要动态分配吗?难道你不能简单地.data在代码中设计整个段作为少数全局struct变量,通过它们所属的抽象对各种数据进行分组,并在其他代码中使用那些全局变量而不进行任何动态分配?

此外,如果您正在编写某种类型的库/支持功能,请确保不要耗尽平台的所有资源,否则不清楚如何将您的功能与实际任务结合使用.:)


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 如何在跨函数中使用内存?
    本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
author-avatar
大佬銘銘銘銘銘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有