c - 写入 Linux on ARM 中的物理地址

标签 c linux memory arm memory-address

我想在使用 ARM 平台的 Linux 机器上将一个整数(只是一个值,也可以是其他类型)写入特定寄存器(例如:0x60006666)。

有很多使用 mmap(2) 的示例,但不清楚如何使用 mmap() 将一个值写入特定地址。 查看 mmap() 手册,它没有指定要写入特定寄存器的值:http://man7.org/linux/man-pages/man2/mmap.2.html

函数如下:

void *mmap(void *addr, size_t length, int prot, int flags,
              int fd, off_t offset);

很明显*addr是地址,但是我们往哪里插入值写入这个地址呢?

在我的例子中,我想将一个 int 写入一个特定的地址,mmap 会是什么样子?

#define _WRITE_ADDR       0x60006666 //address where to write 
unsigned int value_addr = 0x00000080 //value to be written to the address

我想将上述值写入指定地址。它应该是微不足道的,但不是很清楚,因为自从我处理这类问题以来已经有一段时间了,希望有人能提供一些提示。谢谢!

类似问题:
WRITE and READ registers in Linux on ARM

最佳答案

其实很简单。基于RPI的例子

首先你需要:

mem_fd = open("/dev/mem", O_RDWR | O_SYNC);

然后为 map 分配内存。例如,对于一个 BCM RPi 外围设备,它将是 4K + 4K

periph_mem = malloc( 8*1024 - 1);

然后确保它是 4k 对齐的并且 mmap 它:

gpio_map = (unsigned char *)mmap((caddr_t)poriph_mem, BLOCK_SIZE,PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, mem_fd, PERIPH_BASE    );

其中 PERIPH_BASE 是外设的基地址(例如 GPIO 0x20000000(BCM 外设基址)+ 0x200000)

然后您可以像普通指针一样访问它们(但请记住它们必须volatile)

*(volatile uint32_t *)(periph_mem + OFFSET) = VALUE;

关于c - 写入 Linux on ARM 中的物理地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53885127/

相关文章:

linux - 如何在 Perl 中处理来自连续流程管道的更新

linux - Mongodb - 如何重启你刚刚在 Linux 中杀死的 mongodb?

php - 在 Sh/Bash 和 php 中解析配置参数的最佳/最简单方法

c - 需要帮助在 Borland C++ 3.0 上分配远指针

java - 导入类和使用具有完整类名的引用之间是否有任何性能或内存改进?

Java 8 流与集合存储

c - C 中的舍入函数

c - 使用 fputc() 在文件中存储整数会更改整数格式

c - 如何在执行过程中向文本文件添加信息? C

c - malloc.c :3074 + Valgrind output