sa1148260 发表于 2014-4-25 16:43:11

为什么会出现segmentation fault?

本帖最后由 sa1148260 于 2014-4-25 21:23 编辑

我在主机上写了一个简单的C程序
#include<stdio.h>
#define GPHCON (*(volatile unsigned *)0x56000070)
int main()
{
      GPHCON = 0x0;
      return 0;
}

我只是想配置GPHCON的工作模式而已
为什么用 arm-linux-gcc3.4.1 编译后在博创s3c2410开发板上运行总是出现 segmentation fault 一直想不明白!

0x56000070是端口H引脚配置寄存器GPHCON的地址, GPHCON = 0x0; 不管我给什么值都会出现segmentation fault
望大侠指点!

dawanpi 发表于 2014-4-25 18:32:30

如果尝试写入不可写的内存会导致那个错误,比如
char *s = "hello world";
*s = 'H';

sa1148260 发表于 2014-4-25 22:01:14

本帖最后由 sa1148260 于 2014-4-25 22:02 编辑

找到一个可能的原因:虚拟地址和物理地址问题
物理地址被操作系统屏蔽。
应用程序只能访问虚拟地址
如果一定要访问物理地址。
你必须把这些物理设备的操作,写成驱动
应用程序再跟驱动交互

不过还是不知道怎么访问虚拟地址。。再研究一下

NJ8888 发表于 2014-4-25 22:38:03

本帖最后由 NJ8888 于 2014-4-25 22:40 编辑

linux下不能直接这样操作地址的,要map,奶奶的,去年写了篇linux下高效访问物理地址的文章,投稿某期刊没被用,我直接在EEWORLD上贴出了

点雨落山岚 发表于 2014-4-26 10:34:38

我只是路过的,别在意我的出现,顺便学习学习。

Yaksa 发表于 2014-4-26 12:11:07

你是要写应用?写驱动?
写应用要配合驱动,不能直接控制GPHCON
写驱动要ioremap,如:
volatile unsigned long *gphcon = NULL;
gphcon = (volatile unsigned long *)ioremap(0x56000070, 16);
还要注册字符设备等,不能象裸奔一样直接控制的。

sa1148260 发表于 2014-4-26 12:29:01

本帖最后由 sa1148260 于 2014-4-26 12:59 编辑

Yaksa 发表于 2014-4-26 12:11
你是要写应用?写驱动?
写应用要配合驱动,不能直接控制GPHCON
写驱动要ioremap,如:


我应该要写应用程序吧(我发现自己竟然分不清楚应用程序和驱动的区别。。),只是从GPHCON端口中读数据。
我去找本相关的书看看,我发现不懂的东西太多了!
谢谢你!

咖啡可乐 发表于 2014-4-26 12:48:01

貌似linux下要用硬件设备,需要在驱动文件里使用ioremap函数映射,然后在应用程序里用read write ioctrl函数操作设备。

sa1148260 发表于 2014-4-26 13:04:04

咖啡可乐 发表于 2014-4-26 12:48
貌似linux下要用硬件设备,需要在驱动文件里使用ioremap函数映射,然后在应用程序里用read write ioctrl函 ...

非常有用的信息,谢谢!
页: [1]
查看完整版本: 为什么会出现segmentation fault?