В настоящее время я работаю над платой 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 .