Запись в / dev / mem в 32-битной системе - PullRequest
3 голосов
/ 16 января 2020

В настоящее время я работаю над платой Xilinx So C -FPGA с 32-разрядной архитектурой. Небольшая C -программа должна записывать некоторые данные в конкретную c область физической памяти, начиная с адреса 0x80000000. Для доступа к физической памяти используется /dev/mem. Программа открывает файл устройства и устанавливает индикатор положения на требуемый адрес (в этой системе наименьшая адресуемая единица памяти составляет один байт).

В качестве примера предположим, что я хочу записать слово 0xAB в адрес памяти 0x80000000:

#include<stdio.h>
#include<stdlib.h>

int main() {        
    FILE *fp;
    char word[1] = {0xAB};
    unsigned long v_offset= 0x80000000;

    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 ) ожидает длинный знак со знаком для параметра смещения. Поэтому 0x7FFFFFFF=0b01111111111111111111111111111111 является последним значением для v_offset, которое не приведет к переполнению параметра offset.

Редактировать: Область памяти, начинающаяся с 0x80000000, доступна, и я могу читать и записывать данные с помощью devmem2 .

...