在驱动程序中,经常看到*(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之类的分配的,这样是允许的。