我目前正在研究32位架构的Xilinx SoC-FPGA板。一个小的C程序必须将一些数据写入从地址0x80000000
开始的特定物理存储区中。要访问物理内存,请使用/dev/mem
。程序将打开设备文件,并将位置指示器设置为所需的地址(在该系统上,最小的可寻址存储单元为一个字节)。
作为示例,假设我想将单词0xAB
写到内存地址0x80000001
。
#include<stdio.h>
#include<stdlib.h>
int main() {
FILE *fp;
char word[1] = {0xAB};
unsigned long v_offset= 0x80000001;
fp = fopen("/dev/mem", "r+b");
if (fp == NULL) {
// error handling
} else {
fseek(fp, v_offset, SEEK_SET); // set position indicator
fwrite(word , sizeof(char), sizeof(word), fp);
fclose(fp);
}
return 0;
}
上面的程序无法工作:int fseek(FILE *stream, long offset, int whence)
(man page)期望offset参数的符号长。 0x7FFFFFFF=0b01111111111111111111111111111111
是v_offset
的最后一个值,不会导致参数offset
溢出。
我想到了将位置指示器依次设置到所需地址的想法。令我惊讶的是,这也不起作用:
unsigned long v_offset= 0x40000000;
fseek(fp, v_offset, SEEK_SET); //set to 0x40000000
fseek(fp, v_offset+1, SEEK_CUR); //set to 0x80000001
当这是0x7FFFFFFF
可以处理的最大偏移量时,如何在超过fseek
的地址访问存储器?