【问题标题】:Writing to a particular Memory location in Embedded Programming写入嵌入式编程中的特定内存位置
【发布时间】:2022-12-29 01:39:29
【问题描述】:

假设对于一个嵌入式程序,硬件是这样设计的,如果内存地址0x8729被0xff填充,它就会执行一定的操作。 有没有办法访问内存地址 0x8729 并写入它?

【问题讨论】:

  • 搜索devmem2.c和/或 Busybox 中的 devmem 命令。顺便说一句,避免赤裸裸地使用“记忆" 除非上下文虚拟的要么身体的记忆是显而易见的。

标签: c++ c embedded-linux


【解决方案1】:

试试这个:

uint8_t * p_memory = (uint8_t *) 0x8729;
const uint8_t value_from_memory = *p_memory;
*p_memory = 0xff; // Writing to memory.

你可能不需要演员表,但我还是把它放在那里了。

解释:

  1. 声明一个uint8_t指针并分配给你的内存地址。
  2. 要写入,取消引用指针并分配您的值。
  3. 要读取,取消引用指针并将值分配给您的变量。

【讨论】:

  • 注意事项: 1) 地址必须是可写的。 2)您的程序需要访问内存位置的权限。
  • 我会在上面打volatile
  • 由于问题被标记为embedded linux,您应该期望用户空间程序在虚拟内存中执行。因此,写入“内存”地址 0x8729 将是映射到神秘设备不知道的某个未知物理页面的虚拟内存页面。
  • @sawdust:不一定。嵌入式 linux 有多种尺寸,其中一个特性是支持虚拟内存、防护和内核与用户空间。一切都取决于 OP 实现了哪些 linux 元素。较小的嵌入式系统没有标准 linux 实现的能力。
【解决方案2】:

我要说的是,如果没有关于特定 Linux 实现的更多信息,我们将不知道这是否是不支持用户空间应用程序内存虚拟化的“微型”Linux 实现的问题,或者这是否是“标准”Linux 实现,它确实从用户空间虚拟化物理内存地址。

我倾向于认为这是用户空间的虚拟化问题,在这种情况下,您可以使用this posting 提到的技术。它描述了如何使用 devmem 从命令行访问物理内存,以及如何在 C 程序中使用设备文件句柄 /dev/memmemmap

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多