Zhangxian9 发表于 2015-08-14 15:00

关于内存映射的问题

问题是这样的,我通过程序技术出了一个进程某个变量的物理地址,以及该物理地址的struct *page变量,然后再起一个进程,如何将该页通过映射到第2个进程的虚拟地址中,使得第2个进程能够访问到第一个进程变量的值。

夕阳下的孤影 发表于 2015-08-15 00:47

拿到了struct page,就可以通过page_to_phys获得该page对应的物理地址,然后可以在用户层的进程2中使用mmap映射该物理地址,得到一个虚拟地址,操作该虚拟地址即可。

Zhangxian9 发表于 2015-08-16 21:55

mmap可以通过直接操作物理地址映射到虚拟地址吗?有具体的例子吗?回复 2# 夕阳下的孤影


   

夕阳下的孤影 发表于 2015-08-16 22:05

回复 3# Zhangxian9

可以参考/dev/mem
一般要先拿到一个/dev/mem的句柄:fd=open("/dev/mem", O_RDWR|O_SYNC)
然后使用mmap:virt = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, phy_addr);
   

Zhangxian9 发表于 2015-08-18 11:43

尝试过了的确可以,但是需要创建字符设备,然后使用mmap映射到设备下,可以不创建字符设备而直接映射内存页面吗,回复 4# 夕阳下的孤影


   

夕阳下的孤影 发表于 2015-08-19 22:48

回复 5# Zhangxian9

应该没有别的方法吧,至少目前我不知道


   

Zhangxian9 发表于 2015-08-20 09:13

好的,谢谢了!回复 6# 夕阳下的孤影


   

Buddy_Zhang1 发表于 2015-12-23 22:31

接住代码!!!!!!


struct page *page = /* 已知的 page 结构体 */
struct task_struct *task;
struct vm_area_struct *vma;
struct file *file;
unsigned long pfn;
unsigned long addr;


task = /* 另外一个 task 的结构体 */
mm = task->mm;
vma = mm->mmap;
file = vma->vm_file;

pfn = page_to_pfn(page);
addr = pfn << PAGE_SHIFT;

do_mmap(file,addr,PAGE_SIZE,0,file->f_flags,0);
页: [1]
查看完整版本: 关于内存映射的问题