往具体地址写数据时遇到的问题

来源:互联网 发布:exe网络验证 编辑:程序博客网 时间:2024/04/30 03:54

   在驱动程序中,经常看到*(unsigned int *)0x56000000=0x12;

这样的直接给一个地址赋值的语句,这样的语句在应用程序中是不能直接用的,会出现段错误,LINUX系统不允许直接操作物理地址。

 

 

#include<stdio.h>

#define NFCONF *(volatile unsigned int *)0x0804a008

int main()

{

       NFCONF=0x11223344;

       return 0;

}

 

此程序编译时不会出错,但是在运行时会出现“段错误”!因为在系统下不允许直接访问内存,系统下访问内存要通过MMU和Cache。

下面程序是可以的:

#include <stdio.h>

int main()

{

      int *a;

      a=(int *)malloc(100);

      printf("%p/n",a);

      *a=0x11;

      return 0;

}

用GDB的 x/20 0xXXXXXXXX可以看到,printf显示的地址上确实写上了数据,该地址是系统通过MMU之类的分配的,这样是允许的。

原创粉丝点击