#include
#include
#include
#include
#include
#include
#include
#include
long* mapmem(off_t offset)
{
int fd;
long *ret;
fd = open("/dev/mem", O_RDWR|O_SYNC);
if (fd == -1) {
perror("open");
return NULL;
}
printf("offset (pageaddr) is: %ld\n", offset);
ret = mmap(0, sizeof(long), PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset);
if (ret == MAP_FAILED) {
perror("mmap");
ret = NULL;
}
printf("Return address is: %p\n", ret);
if (close(fd) == -1)
perror("close");
return ret;
}
int main(int argc, char *argv[])
{
long *mem = 0;
volatile long *_mem = 0, dummy;
long long int addr, offset, pageaddr;
char *endpt;
if (argc != 2) {
fprintf(stderr, "Usage %s \n", argv[0]);
return 1;
}
addr = strtoll(argv[1], &endpt, 16);
offset = addr % sysconf(_SC_PAGE_SIZE);
pageaddr = addr - offset;
printf("addr is: %lld, offset: %lld, pageaddr: %lld\n", addr, offset, pageaddr);
mem = mapmem(pageaddr);
return 0;
}
为什么不同的mmaped物理地址来回回我们传入?还是地址返回的虚拟地址映射到相应的物理地址?
我运行上面的程序输出:
$ sudo ./test 0x12345
addr is: 74565, offset: 837, pageaddr: 73728
offset is: 73728
Return address is: 0x7f3081fc0000
2014-02-18
Amumu
+2
'man mem:mem是一个字符设备文件,它是计算机主内存的一个映像。“我猜这意味着你的程序要求OS将主内存的物理地址映射到虚拟内存中的某个地址你的过程的空间。 –
+0
为什么你认为虚拟地址应该与物理地址相同? –
+0
@BasileStarynkevitch我只想确认返回的地址是否在我当前正在运行的程序的虚拟地址空间中,即使从'/ dev/mem'映射。我认为是这样。对于普通地址,我知道它在虚拟地址空间中。 –