C/Embedded Linux中的内存映射设备访问

C/Embedded Linux中的内存映射设备访问,c,linux,embedded-linux,C,Linux,Embedded Linux,我有一个运行嵌入式Linux的pxa270处理器套件,它有内存映射设备 如何在这些设备的外部内存中存储值(如果我知道它们的物理地址)?您只需声明所需类型的指针并为其分配内存位置即可。然后将值设置为正常值 int *pointer_to_memory = (int *)address_of_external_memory; *pointer_to_memory = value; 由于您已经标记了这个“嵌入式linux”,我将假设您要做的是写入内存映射设备的内存 我可以想到几种方法,但我不确定第一种

我有一个运行嵌入式Linux的pxa270处理器套件,它有内存映射设备


如何在这些设备的外部内存中存储值(如果我知道它们的物理地址)?

您只需声明所需类型的指针并为其分配内存位置即可。然后将值设置为正常值

int *pointer_to_memory = (int *)address_of_external_memory;
*pointer_to_memory = value;
由于您已经标记了这个“嵌入式linux”,我将假设您要做的是写入内存映射设备的内存

我可以想到几种方法,但我不确定第一种方法在Linux中是否可行:

  • 使用系统调用将设备的物理内存空间映射到正在运行的进程的虚拟内存空间

  • 写入虚拟文件
    /dev/mem

  • 创建一个用于处理设备内存的块设备驱动程序,然后在
    /dev
    中对其条目执行(文件)操作


  • (实际上#1和#2可以一起工作,使用
    mmap()
    来对抗
    /dev/mem
    ,这样您就可以使用正常的内存读写操作而不是文件操作了)。

    您所说的外部内存是什么意思。。你能写更长的问题吗?例如:
    *(int*)(外部存储器)=42
    memcpy(外部存储器,“foobar”,6)我已根据OP添加的注释扩展了问题。请重新打开。仅供参考,内存映射设备是控制硬件的一种特定方式,通过在物理地址空间中提供其控制寄存器地址。因此,这个问题实际上是关于如何将物理地址空间映射到进程的虚拟地址空间,以便您可以对其进行写入。这当然只会相对于当前进程的内存空间写入该地址,这是一个很好的观点。对于通常访问整个内存空间的嵌入式设备来说,上述方法是可行的。我想mmap在多进程操作环境中更有用。好的,但编译器如何知道这个内存属于外部编译器不知道,是O/s将地址从虚拟空间映射到物理空间。好的,在我的问题中,外部内存(在pxa270处理器套件中)假设说0x40a00080是那个地址。现在您是如何执行RD/WR操作的呢