问题描述
我正在开发一个运行 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
中找到更多信息。