在32位系统上写到/ dev / mem

问题描述 投票:0回答:1

我目前正在研究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=0b01111111111111111111111111111111v_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的地址访问存储器?

c linux file memory-management file-handling
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.