如何在 Debian 中使用 C++ 读取/写入 SD 卡中的特定内存地址?

问题描述

我正在开发一个运行 Debian GNU/Linux 10 (buster) 的嵌入式应用程序,我想直接访问(即读取和写入)SD 卡中特定内存地址的可用内容

举个例子,假设 SD 卡通过路径 /dev/mmcblk0p1/ 可见。

通过“直接访问”我的意思是我不想读取或写入文件到 SD 卡,而是读取/写入字节值到 SD 卡起始内存地址的偏移量,无论文件系统如何(例如 fat32、NFTS 等)。

首先,有没有办法这样做?如果是这种情况,我该怎么办?

目前,我设法将 SD 卡作为文件打开并获取其大小(在调试器中观察到正确值),但我不知道如何获取指向闪存开头的指针(地址)记忆。

这是我目前所拥有的:

#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <unistd.h>
#include <cstdint> 

int main(){
    uint64_t size;
    int fd = open("/dev/mmcblk0p1",O_RDWR);
    ioctl(fd,BLKGETSIZE64,&size);

    int f_closed = close(fd);

    return 0;
}

解决方法

您可以使用mmap

#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <unistd.h>
#include <cstdint>
#include <sys/mman.h>

int main(){
    uint64_t size;
    int fd = open("/dev/mmcblk0p1",O_RDWR);
    ioctl(fd,BLKGETSIZE64,&size);

    void* data = mmap(NULL,size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
    if (data == MAP_FAILED)
        return 1;
    ((char*)data)[0x2137] = 42;

    int f_closed = close(fd);

    return 0;
}

您可以在 man mmap 中找到更多信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...