在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4405|回复: 4

OpenRisc搭建SoC时地址越界的问题

[复制链接]
发表于 2013-7-26 23:04:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
大家好,我在使用OpenRisc1200处理器搭建SoC时,发现我使用or32-elf-gcc(带有newlib库,按照http://opencores.org/or1k/OpenRI ... hain_.28or1k-elf.29上的说明编译安装)编译的代码在执行过程中访问了地址0x007FFFFC.但是该地址并不在我的RAM的范围之内(我使用了FPGA上的BRam,总共开的RAM资源为8MB)。
我检查反汇编后发现,产生越界内存访问的代码是__impure_init函数,该函数位于.text段。这个函数应该是工具链在链接过程中自动加上去的。由于对编译过程和内存分配不熟悉,不知道这个函数为什么要访问0x007FFFFC这个地址,它是访问堆栈么?
我通过readelf查看了elf文件的头部,发现里面的各段都是在8MB RAM内的。但是我没有找到堆栈段。
另外:我不知道如何告诉or32的编译器,我现在所使用的内存大小是多大。如何告诉编译器当前使用的内存大小呢?
发表于 2013-7-27 15:31:15 | 显示全部楼层
楼主再描述详细一点
 楼主| 发表于 2013-7-28 12:17:15 | 显示全部楼层
我在使用OpenRisc的工具链时遇到的问题,我给SoC分配了32KB的内存,这32KB的RAM地址是0x0-0x7FFF.但是我测试过程中发现编译的程序运行过程中对内存地址0x007FFFFC这个地址进行了访问,而这个地址并不在我的RAM空间中。
我的程序很简单:
int main()
{
  volatile int a;
  while(1){
    a++;
  }
  return 0;
}
编译所使用的命令是:or1k-elf-gcc simple_test.c -Wl,--gc-sections -O3 -Wl,--relax  -o simple_test.elf
产生越界的函数是在一个叫__impure_init的函数中(通过反汇编看到的),这个函数应该是连接过程中链接器加上去的。我认为很可能是函数传递参数或者传递返回值时在访问堆栈。
由于编译过程中我并没有指定内存的大小,因此堆栈很可能被map到了内存的0xFFFFFFFF位置(或者其它高地址的位置)。而在运行过程中,我的SoC上没有运行操作系统,因此所有的地址都是实地址。这样就导致了访存越界了。
我想知道如何告诉编译器将程序的所有段map到我申请的RAM中去。但是我发现修改连接脚本也没有解决上述越界的问题。
发表于 2013-7-31 10:36:30 | 显示全部楼层
编写和使用LD文件来定义软件的内存分配,例如TEXT的地址,内存大小等等
发表于 2013-7-31 21:35:32 | 显示全部楼层
我编译楼主的程序,得到的__impure_init函数地址是0x00003bb8

楼主使用or32-elf-ld -verbose可以输出默认的链接脚本文件,看看满不满足要求

从楼主的编译语句似乎是or1k-elf-ld -verbose得到默认的链接脚本文件

都试试吧,然后可以贴出来看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-24 09:00 , Processed in 0.019350 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表