Я работаю со встроенным Linux на плате Zynq Ultrascale+ под управлением Linux 4.14.
Я выполняю некоторые передачи DMA с логической стороны FPGA на систему обработки (PS), поэтому я выделил раздел оперативной памяти, чтобы ядро не использовало его...
Я добавил это в дерево устройств.
Код: Выделить всё
memory@0 {
device_type = "memory";
reg = , ;
};
reserved-memory {
compatible = "xlnx,reserved-memory";
#address-cells = ;
#size-cells = ;
ranges;
reserved: buffer@800000000 {
no-map;
reg = ;
};
};
Когда я написал код my.c для использования этой зарезервированной памяти, он работал правильно, за исключением использования функция memset...
Если я попытаюсь использовать 'memset(ram_vaddress, 0, size);', я получу следующее:
Код: Выделить всё
[ 2386.395781] test[3691]: unhandled alignment fault (7) at 0x7f9cb88080, esr 0x92000061, in libc-2.27.so[7f9c926000+13b000]
...
Bus error (core dumped)
Я у меня не очень много опыта в управлении памятью и т. д. Так что, возможно, я упускаю какую-то концепцию или делаю что-то неправильно.
Похоже, что выделенная виртуальная память не является непрерывной или выровненной, но я не могу определить почему. Отлаживая физический адрес, я могу прочитать то, что на нем пишу, что указывает на то, что работает та часть, которая подключается к физическому адресу.
Вот код ниже.
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include "parameters.h"
// Allocate memory
int configure_memory_allocation(size_t size, unsigned int** virtual_addr, uint64_t physical_address) {
// Open /dev/mem which represents the whole physical memory
int memory_handle = open("/dev/mem", O_RDWR | O_SYNC);
if (memory_handle < 0) {
perror("open");
return 1;
}
*virtual_addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, memory_handle, physical_address); // Memory map source address
if (*virtual_addr == MAP_FAILED) {
perror("mmap");
close(memory_handle);
return 1;
}
close(memory_handle);
return 0;
}
int main(){
// Variables
size_t size = 4096;
uint64_t physical_address = 0x800000000;
// Mapped devices
unsigned int* ram_vaddress = NULL;
if (configure_memory_allocation(size, &ram_vaddress, physical_address) != 0) {
// Handle error
fprintf(stderr, "Failed to configure memory allocation.\n");
return 1;
}else{
printf("configure_memory_allocation successfully\n");
}
for(int i = 0; i < size/4; i++){
ram_vaddress[i] = i;
}
for(int i = 0; i < 10; i++){
printf("%08x ram_vaddress[%d] = %d\n", &ram_vaddress[i], i, ram_vaddress[i]);
}
printf("\n\n");
// Use memset to clear the memory
memset(ram_vaddress, 0, size);
munmap(ram_vaddress, size);
}
Подробнее здесь: https://stackoverflow.com/questions/788 ... ault-error
Мобильная версия