关于内存映射的问题
问题是这样的,我通过程序技术出了一个进程某个变量的物理地址,以及该物理地址的struct *page变量,然后再起一个进程,如何将该页通过映射到第2个进程的虚拟地址中,使得第2个进程能够访问到第一个进程变量的值。 拿到了struct page,就可以通过page_to_phys获得该page对应的物理地址,然后可以在用户层的进程2中使用mmap映射该物理地址,得到一个虚拟地址,操作该虚拟地址即可。 mmap可以通过直接操作物理地址映射到虚拟地址吗?有具体的例子吗?回复 2# 夕阳下的孤影回复 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);
尝试过了的确可以,但是需要创建字符设备,然后使用mmap映射到设备下,可以不创建字符设备而直接映射内存页面吗,回复 4# 夕阳下的孤影
回复 5# Zhangxian9
应该没有别的方法吧,至少目前我不知道
好的,谢谢了!回复 6# 夕阳下的孤影
接住代码!!!!!!
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]