微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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 中找到更多信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。