如何修复分段故障?

时间:2012-09-11 20:25:31

标签: kernel arm embedded-linux vala mmu

我需要在自定义硬件上的嵌入式Linux环境中使用AEMIF读取异步外部存储器接口(TMS320DM368)。 我实际上还没有硬件,所以我在Leopardboard 368上测试vala代码(如下)。 引导加载程序使用第一个AEMIF来读取nand flash。 我的代码试图使用第二个AEMIF读取不在Leopardboard上但将在自定义HW上的SRAM。 我怀疑分段错误是由我试图访问受保护的内存引起的。 实际的自定义硬件将需要读取几个M的SRAM,但我试图让这个测试代码读取256字节。 如何修复下面的测试代码导致的分段错误? 我需要在内核中添加驱动程序吗? 如果可能的话,我宁可不要乱用内核。 是否有嵌入式linux方法来配置或声明某些地址范围为不受保护的?

uint8 * source = (uint8 *)0x04000000; // AEMIF Data (CE1)
uint32 * pA2CR = (uint32 *)0x01D10014; // AEMIF 2 Config Reg (CS3 space)
const uint32 READ_SETUP = 1; // Read setup: EMIF clock cycles - 1
*pA2CR = (READ_SETUP << 13);
const size_t size = 256;
var dest = new uint8[size];
memset(dest, 0, size);
memcpy(dest, source, size);

1 个答案:

答案 0 :(得分:2)

我不熟悉DM386,但我曾经在使用DM6446。在DM6446中,我希望它在DM368上也是一样的,物理地址会被重新映射。

我不知道您的情况,但我认为您可以使用miscdevice编写驱动程序,并为您的用户空间程序提供读写操作支持。

在我的内核模块中,我使用IO_ADDRESS宏来重新映射并访问寄存器。举个例子:

#define REG_PINMUX1     (*((volatile unsigned long *) (IO_ADDRESS(PINMUX1))))

然后在代码中我有像

这样的命令
REG_PINMUX0 &= ~(0x01000000);

所以我认为你得到了段错误,因为你的指针错了。并且尝试从没有内核模块的用户空间程序访问hw寄存器不是一个好的策略。