linux mmap dev mem,为什么mmap/dev/mem返回不同的地址?

#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'映射。我认为是这样。对于普通地址,我知道它在虚拟地址空间中。 –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值