免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
41 [报告]
发表于 2009-04-16 17:07 |只看该作者

回复 #40 eexplorer 的帖子

觉得自己有点像唐僧了,喋喋不休。。。

论坛徽章:
0
42 [报告]
发表于 2009-04-16 17:46 |只看该作者
原帖由 eexplorer 于 2009-4-16 17:06 发表
对于copy_from_user(), 注释里说了"user context only", 所以copy_from/to_user 一般是用于system call, 所以kernel使用process page table 应给是没有问题,并通过user address 来access user space memory是可以的。



就要兄弟这句话。

这种访问,当然必须在进程上下文,否则如果在中断上下文, 拿到一个用户指针, 却不知道该查那个进程的页表。

论坛徽章:
0
43 [报告]
发表于 2009-04-16 18:04 |只看该作者
原帖由 albcamus 于 2009-4-16 17:46 发表


就要兄弟这句话。

这种访问,当然必须在进程上下文,否则如果在中断上下文, 拿到一个用户指针, 却不知道该查那个进程的页表。


没看出来这和kernel有没有把0-896M物理内存map到kernel空间有什么关系?

论坛徽章:
0
44 [报告]
发表于 2009-04-16 18:16 |只看该作者
原帖由 eexplorer 于 2009-4-16 18:04 发表


没看出来这和kernel有没有把0-896M物理内存map到kernel空间有什么关系?



我认为, 这个帖子之所以我们会争起来, 全在于你一直说“把0-896M物理内存map到kernel空间”。

而我的理解是这样的:

1) 这部分物理内存, 若要映射到内核, 必是加上一个PAGE_OFFSET这么简单的映射;
2) 但是, 内核并一开始就为所有这样的物理内存永久的建立了这种映射。


这就好比, 你说: 人是死的。  而我认为, 虽然人都是要死的, 但是世上并非只有死人 -- 还有没死的。  0~896物理内存也是, 还有没映射的。

论坛徽章:
0
45 [报告]
发表于 2009-04-16 20:13 |只看该作者

回复 #44 albcamus 的帖子

> 1) 这部分物理内存, 若要映射到内核, 必是加上一个PAGE_OFFSET这么简单的映射;
> 2) 但是, 内核并一开始就为所有这样的物理内存永久的建立了这种映射。

那请问,kernel什么时候会建立这样映射?加上一个PAGE_OFFSET这么简单的映射,还是要通过修给page table实现的。

我已经指出了在kernel_physical_mapping_init()中,kernel会在初始化的时候为所有的low memory (0-896M)建立映射。请问你看过了吗?

论坛徽章:
0
46 [报告]
发表于 2009-04-16 20:19 |只看该作者
我只看到初始化时确实是 映射了0-896M,其他没看到有操作的地方。感觉上内核一次性映射这部分内存是为了方便管理和访问物理内存,这并不影响用户空间来映射这部分内存 呵呵 不知道有没有高人解答一下
2 内核系统页表在swapper_pg_dir中,每次新建进程的时候都会把其中3G-4G的pgtable拷贝给新的进程。
同时会保持跟新kernel 页表

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

回复 #44 albcamus 的帖子

还有为什么i386会有high memory和low memory之分?

论坛徽章:
0
48 [报告]
发表于 2009-04-16 20:27 |只看该作者
原帖由 javacool 于 2009-4-16 20:19 发表
我只看到初始化时确实是 映射了0-896M,其他没看到有操作的地方。感觉上内核一次性映射这部分内存是为了方便管理和访问物理内存,这并不影响用户空间来映射这部分内存 呵呵 不知道有没有高人解答一下
2 内核系 ...


kernel这么做就是为了能方便访问物理内存,如果每分配一个物理页,kernel还需要在3G-4G的内核空间先分配一段虚拟空间,然后才能访问这段物理内存,那效率也太低下了。

论坛徽章:
0
49 [报告]
发表于 2009-04-16 21:12 |只看该作者
原帖由 eexplorer 于 2009-4-16 17:06 发表

上面说了在system call里,copy_from_user一般用于读取user space传进来的参数。但是在一些aio操作中,kernel想要access user space memory的话,就必须通过get_user_pages()现得到所对应的struct page,在通过kmap_atomic()得到这个page所对应的kernel virtual address.
因为这是已经不是在原来的user process context中了。 ...


今天下午碰巧也看了Solaris的这部分代码,基本道理和Linux完全一样。

论坛徽章:
0
50 [报告]
发表于 2009-04-16 21:15 |只看该作者
原帖由 eexplorer 于 2009-4-16 20:27 发表


kernel这么做就是为了能方便访问物理内存,如果每分配一个物理页,kernel还需要在3G-4G的内核空间先分配一段虚拟空间,然后才能访问这段物理内存,那效率也太低下了。


这点可以通过查看内核内存分配函数kmalloc的实现来确定,谁能讲一下。

最近神游太厉害,手头工作忙不过来了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP