免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: javacool
打印 上一主题 下一主题

kernel 中如何访问管理pci memory [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-04-15 10:42 |只看该作者
原帖由 Solaris12 于 2009-4-15 00:31 发表


对于32位x86来说,每个用户进程独立的页表里应该都包含内核内存的映射,也就是说所有用户进程4G地址空间里,3G-4G是共享内核的地址空间。假设一个机器只有896M内存,如果内核一上来就把他们都映射到3G-4G之 ...


本版精华贴:
http://linux.chinaunix.net/bbs/viewthread.php?tid=690010

论坛徽章:
0
22 [报告]
发表于 2009-04-15 11:56 |只看该作者
原帖由 javacool 于 2009-4-15 09:55 发表
而这种映射并不妨碍用户空间映射相同的地址。只要内核不会写已经被用户空间映射的物理内存就好了 ...


哈哈,我终于明白自己的问题在哪里了。

我对内存映射的理解有个严重的错误就是没有意识到 va ->pa的影射是多对一的,我以前的潜意识认为是一对一的。

所以这896M映射给kernel并不影响其中任意一块儿内存再影射到用户空间。

唉,这个错误概念真得害死人啊。

论坛徽章:
0
23 [报告]
发表于 2009-04-15 12:01 |只看该作者
原帖由 albcamus 于 2009-4-15 10:42 发表


本版精华贴:
http://linux.chinaunix.net/bbs/viewthread.php?tid=690010


谢谢你这个帖子,不过我的问题和这个帖子关系不大。

我以前不理解的是在0-896M物理内存为什么既可以影射到3-4G的内核虚拟地址空间,又可以影射到0-3G的虚拟用户地址空间。

现在终于明白了,只不过是在页表里有多条不同va到相同pa的记录罢了,一个低级错误却困扰我这么長时间,见笑了。

论坛徽章:
0
24 [报告]
发表于 2009-04-15 13:06 |只看该作者
> 而这种映射并不妨碍用户空间映射相同的地址。只要内核不会写已经被用户空间映射的物理内存就好了 ...

多个va对应一个pa的情况, 有例子吗?  我没看到内核里有这样的代码。

论坛徽章:
0
25 [报告]
发表于 2009-04-15 13:55 |只看该作者
原帖由 albcamus 于 2009-4-15 13:06 发表
> 而这种映射并不妨碍用户空间映射相同的地址。只要内核不会写已经被用户空间映射的物理内存就好了 ...

多个va对应一个pa的情况, 有例子吗?  我没看到内核里有这样的代码。


Solaris里面的例子就是bp_mapin, 允许把在0-3G的用户空间的地址影射到内存空间。

例如你dd 数据到磁盘设备,实际上ioctl下来就需要调用这个。

Linux的情况应该类似吧。

另外,之前说了,一个只有512M物理内存的系统,影射到3G-4G的内核空间后,当用户进程分配内存时,又需要使用其中一部分物理内存把它们影射入用户地址空间(0-3G), 这时内核中的一个页表就维护了两条影射。

另外多进程之间,不同进程共享库的情况,其实也是多个VA到一个PA,只不过这些记录是在各自进程的页表里,所以更容易理解罢了。

[ 本帖最后由 Solaris12 于 2009-4-15 13:56 编辑 ]

论坛徽章:
0
26 [报告]
发表于 2009-04-15 17:00 |只看该作者
> 一个只有512M物理内存的系统,影射到3G-4G的内核空间后

内核只有在需要的时候才去映射, 且必是1:1映射。  不需要的时候, 空闲的物理地址就是空闲的,不对应内核页表里的entry

论坛徽章:
0
27 [报告]
发表于 2009-04-15 21:31 |只看该作者
原帖由 albcamus 于 2009-4-15 17:00 发表
> 一个只有512M物理内存的系统,影射到3G-4G的内核空间后

内核只有在需要的时候才去映射, 且必是1:1映射。  不需要的时候, 空闲的物理地址就是空闲的,不对应内核页表里的entry


1. 恩,这个说法和前面几个人的说法不同啊,究竟哪个是正确的,有人可以证实一下吗?

2. 不过不论那种说法,其实也不矛盾,当内核需要访问用户空间的内存时,必然要建立一条新的影射,这样就页表就有两个记录,一个是用户VA到PA的,一个是内核VA到PA的。

论坛徽章:
0
28 [报告]
发表于 2009-04-16 09:54 |只看该作者
原帖由 albcamus 于 2009-4-15 17:00 发表
> 一个只有512M物理内存的系统,影射到3G-4G的内核空间后

内核只有在需要的时候才去映射, 且必是1:1映射。  不需要的时候, 空闲的物理地址就是空闲的,不对应内核页表里的entry


内核在初始化的时候是会把512M的物理内存全部映射到3G~4G的内核空间的(see kernel_physical_mapping_init() for details).

这样通过buddy system分配出来的物理页,kernel可以很简单的把phy_addr+PAGE_OFFSET得到virtual addr,进行访问。

论坛徽章:
0
29 [报告]
发表于 2009-04-16 10:12 |只看该作者

回复 #26 albcamus 的帖子

用户虚拟空间才是在需要的时候作映射

page fault -> if legal access, alloc page from buddy system and setup page table entry.

论坛徽章:
0
30 [报告]
发表于 2009-04-16 10:33 |只看该作者
原帖由 Solaris12 于 2009-4-15 21:31 发表


1. 恩,这个说法和前面几个人的说法不同啊,究竟哪个是正确的,有人可以证实一下吗?

2. 不过不论那种说法,其实也不矛盾,当内核需要访问用户空间的内存时,必然要建立一条新的影射,这样就页表就有两个 ...



我坚信自己是对的(虽然我是mm盲惭愧惭愧),除非有人从代码上反驳我。 因为从道理上讲, kernel为什么那么蠢, 一上来就把可用内存全给映射了? 没必要嘛。


至于2, 内核和应用使用的是同一个页表(每个进程的 > PAGE_OFFSET的虚拟地址区间, 其页表都是一样的, 也就是所谓的“内核页表”。 ) 这就是为什么内核可以直接访问用户空间, 而不需要重新映射它们对应的物理页到内核地址。

试想, 内核得到用户传来的, void *p,需要访问它,难道:

1) 查页表,知道物理page;
2) map 这个page到kernel的某个地址
3) 用新map的kernel地址去访问

我觉得这太蠢了,任何一个OS都不会这样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP