龙芯开源社区

 找回密码
 注册新用户(newuser)
12
返回列表 发新帖
楼主: Wiener

龙芯3A2000上,64位地址0x9000000000000000以后的地址如何访问?

[复制链接]
发表于 2016-6-17 10:54:18 | 显示全部楼层
请问楼主龙芯3a2000 你编译的是哪一个zloader.3axxx  
 楼主| 发表于 2016-6-17 17:40:45 | 显示全部楼层
offset=0x3ff0140a,   
value=0x11
这是设置串口中断向量的动作
 楼主| 发表于 2016-6-19 20:05:18 | 显示全部楼层
本帖最后由 Wiener 于 2016-6-19 20:06 编辑

@Ncience, 我没有编zloader.3axxx,是系统自带的pmon引导我编译的新软件。
我现在已经分析到是系统第一次调用malloc之后,就出问题了。方法如下:

写了一个测试函数:
int g_test_sb64_uart0 = 0;
void test_sb64_uart0(char * filename, int line)
{
g_test_sb64_uart0++;

    uart0_print("\033[32m[Test-%d][%s,%d]: MIPS_SB64 ...---------\033[m", g_test_sb64_uart0,
               filename,line);
    MIPS_SB64(0x3ff0140a,0x11); //由于这里出问题时板子挂死不动,所以后面的打印就没有了。
    uart0_print(" End Test! \r\n");
}

把这个test_sb64_uart0(__FILE__, __LINE__);在启动流程中各个地方加入进去。发现malloc之前,打印完全正常, malloc之后就挂死了。所以需要继续分析...
 楼主| 发表于 2016-6-20 10:15:59 | 显示全部楼层
      深入调查后还是无法解释这个现象。在malloc中会递归的查找内存空闲块。 这个操作是纯软件算法,不涉及到硬件操作。首次调用malloc,递归了大约20次,在最后一次递归逐级返回时,突然就不能执行test_sb64_uart0()了,死机了。
       然后在递归的入口加上一行打印,就通过了每次递归,malloc也能顺利执行,但是继续往下执行还是会遇到死机
       SR一直使能着KX位,硬件上允许64位访问。为何执行了一个递归函数,就不能访问64位地址了呢? cache一直是关的。协处理器弄坏了? gp、sp指针内容不对?
 楼主| 发表于 2016-6-24 16:30:57 | 显示全部楼层
经过不断地刻苦攻关,终于找到了原因!物理地址类型 phys_addr_t 用了默认的4字节,修改成8字节就好了。所有这些莫名其妙的问题,都没了!
两个周的全职工作量,就是改了两行代码,解决了此问题!
回复 支持 1 反对 0

使用道具 举报

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-7-17 18:28 , Processed in 0.180617 second(s), 16 queries .

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