gpt4 book ai didi

c - 内存访问段错误

转载 作者:行者123 更新时间:2023-11-30 14:47:07 25 4
gpt4 key购买 nike

我已将基地址 0x40000000 映射到虚拟内存地址。但是当我尝试读取 0x40100000 位置上的寄存器值时,出现段错误。 mmap() 函数中使用的页面大小为 4K,其中文件描述符的值为 3

从 main 调用 init() 函数来初始化内存:这里,UWord8unsigned charUWord32unsigned int

UWord8 init()
{
UWord8 error;
printf("Initializing Devices in Zynq...\n\r\n\r");
error = initMemory();

if(error)
{
printf("PL:\tAccess Denied\n\r");
return 1;
}

if(!error)
{
error = initFpga();
if(error)
{
printf("Access Denied to mmap...\n\r");
return 1;
}
}
}

UWord8 initMemory(void)
{
UWord8 error = 0;

//Initializing /dev/mem
fd = open(MEMORY_ACCESS, READ_WRITE);

if(fd < 1)
{
error = 1;
#if DEBUG_MODE
printf("Could not open /dev/mem for access\n");
#endif
}
else
{
printf("Value of fd is %u\n", fd);
page_size = sysconf(_SC_PAGESIZE);
printf("The page size is %u\n", page_size);
#if DEBUG_MODE
printf("Successfully opened /dev/mem for access\n");
#endif
}

//Opening text file for writing pointer data
fp = fopen("/home/pointer_data.txt", "a");

if(fp == NULL)
{
error = 1;
#if DEBUG_MODE
printf("Could not open text file for writing.\n\r");
#endif
}
else
{
#if DEBUG_MODE
printf("Successfully opened text file for writing.\n\r");
#endif
}
return error;
}

UWord8 initFpga(void)
{
UWord8 error = 0;
unsigned page_addr, device_addr;

device_addr = BASE_ADDRESS;
page_addr = (device_addr & (~(page_size-1)));
fpga_pageOffset = device_addr - page_addr;
fpga_ptr = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, page_addr); //mmap the device into memory

if(fpga_ptr == NULL)
{
printf("Memory mapping to Base address 0x%08x failed...\n\r",BASE_ADDRESS);
error = 1;
}
return error;
}

下面是函数读取特定地址处的值,发送到函数的地址是距基地址的偏移量:

UWord32 _getWord(UWord32 address)
{
UWord32 data = *((unsigned *)(fpga_ptr + fpga_pageOffset + address));
printf("peek 0x%08x =0x%08x\n\r", BASE_ADDRESS + address, data);
return data;
}

这一行没有错误:

_getWord(0x000ffff8)

但是我遇到了段错误:

_getWord(0x00100000)

最佳答案

当您创建内存映射时,您为其指定的大小等于您的页面大小 - 4kb。

fpga_ptr = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, page_addr); //mmap the device into memory

这会转换为 0x1000 字节,但是您尝试在映射开始之后访问数据 0x100000 字节,这会引发段错误。要解决此问题,请映射更大的内存区域。例如:

fpga_ptr = mmap(NULL, 0x1000 * page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, page_addr);

这将允许您访问内存映射开始后的下一个 0x1000000 字节。

关于c - 内存访问段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51587894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com