我试图映射物理内存的某个区域,然后将其放入struct中。映射正常,分配正常。 (我想是的,因为没有分段错误。)问题是当我尝试从结构中读取一些值时。
我的结构是这样的:
struct some_struct {
unsigned long a;
unsigned long b;
unsigned long c;
unsigned long d;
unsigned long e;
unsigned long f;
};
然后我映射了内存:
void *pc = (void *) mmap(0, PageSize * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr_start);
不要过分关注参数。我100%肯定这很好用。之后我这样做:
struct some_struct *ptr = ((struct some_struct *)(pc + some_offset));
然后我尝试:
printf("DDR[%p] -> 0x%x\n", &(ptr->a));
我得到了会员的地址。它指向内存中的物理地址。但以下让我分割错误:
printf("DDR[%p] -> 0x%x\n", &(ptr->a), ptr->a);
我不确定在分配结构时是否必须使用物理虚拟地址。或者我错过了一些非常明显的东西。
答案 0 :(得分:1)
您的代码不足以提供全面的帮助。
我只能提供您的代码中可能存在的问题:
来自man mmap
:
1)如果您想要读写,您的代码中应该有open("./file.txt", O_RDWR);
。
The prot argument describes the desired memory protection of the mapping
(and must not conflict with the open mode of the file).
2)您将must
偏移为k*sysconf(_SC_PAGE_SIZE)
例如,在我的系统上,页面大小为4096
。因此,addr_start
必须与4*4096
类似,但不能与12
或任意数字相同。
offset must be a multiple of the page size as returned by sysconf(_SC_PAGE_SIZE)
3)在启用所有警告的情况下编译代码,并查看编译器将写入的内容。如果您使用gcc
,请添加-Wall
标记。您已经在printf
语句中有一个未定义的行为(这已在评论中提到过),并且-Wall
编译器会告诉您它。
4)如果您仍然希望编译时没有-Wall
标志,那么请确保您的程序中包含所有必需的标头。我已经包括:
//mmap
#include <sys/mman.h>
//printf
#include <stdio.h>
//open
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
//sysconf
#include <unistd.h>
希望这会有所帮助。
P.S。在我写完这篇文章之后,我已经看到你已经解决了你的问题(但我仍然不明白你的问题)。所以我只是留下这个以防任何其他填充有类似的行为,但不同的问题。