免费注册 查看新帖 |

Chinaunix

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

[原创] 写一个块设备驱动 [复制链接]

论坛徽章:
0
81 [报告]
发表于 2008-12-29 23:04 |只看该作者
期待楼主的下一篇!
好像期待火影和死神一样!
真是非常非常感谢楼主分享经验!

论坛徽章:
0
82 [报告]
发表于 2008-12-30 09:40 |只看该作者
楼主辛苦了,写的真不错!
感谢分享!

论坛徽章:
0
83 [报告]
发表于 2008-12-31 09:23 |只看该作者
写的很不错!

论坛徽章:
0
84 [报告]
发表于 2008-12-31 14:11 |只看该作者
kmap(..)函数在高端建立永久内核映射,但是如果在pkmap_count中没有找到可用的空计数器,map_new_virtual()函数就会阻塞当前进程,加入到等待队列,等下次调度时继续建立映射关系,但是当重新被唤醒时,会判断是否另一个进程已经映射了该页,如果已经映射,在map_new_virtual()函数里有这句话
   if (page_address(page))
             return (unsigned long)page_address(page);
      就是如果该页已经被映射了就返回这页的对应的线性地址。如果没有继续映射关系的请求。
这样你程序中如果在调用kmap(bvec->bv_page)建立永久内核映射中出现了阻塞,并且在下次回来时该页已经被其他进程映射,那里这时返回的是其他进程对应的映射页,而非本进程,这样继续操作的话无非是引用或更改其他进程的页,必然导致其他进程或本进程的panic.我想问你在这里是怎么解决的?
    这个好比本来你在追一个女的,但是你还没追到。在你调整进攻战略的时候。另一个男生把她搞定了,而且怀孕了。这时你继续追,就算你追到手了,但是肚子里的孩子还是他的。你还是会很痛苦。

   对了,这里的调用顺序是 kmap->kmap_high->map_new_virtual. 针对的内核是2.6.28。

[ 本帖最后由 pigcrying 于 2008-12-31 14:34 编辑 ]

论坛徽章:
0
85 [报告]
发表于 2008-12-31 16:42 |只看该作者
这个页面已经分配给这个进程了,其它的进程还能分配到这个页面吗?

论坛徽章:
0
86 [报告]
发表于 2008-12-31 20:32 |只看该作者
原帖由 younglovej 于 2008-12-17 15:54 发表

更新了!

谢谢支持!

论坛徽章:
0
87 [报告]
发表于 2008-12-31 20:35 |只看该作者
原帖由 hb12112 于 2008-12-17 16:46 发表

如果alloc_pages用的是GFP_HIGHME标志分配的话,是否可以通过page->virtual得到地址,那么他的页表映射是在哪建立的?

原帖由 fishswimming 于 2008-12-17 20:58 发表

page结构的virtual域仅为定义了WANT_PAGE_VIRTUAL宏的少数平台设置:
#if defined(WANT_PAGE_VIRTUAL)
        void *virtual;                        /* Kernel virtual address (NULL if
                                           not kmapped, ie. highmem) */
#en ...

原帖由 hb12112 于 2008-12-18 09:59 发表
映射关系是在哪建立的呢?是不是所有的page都会在这个hash里面。还是说有了映射关系的页表才会加入这个hash?谢谢!

原帖由 fishswimming 于 2008-12-18 12:19 发表

通过alloc_pages()获得的高端物理内存,如果你想直接访问它,要首先将page映射到非线性地址空间中,方法有:
1. kmap(),该函数返回page对应的虚拟地址,如果page属于HIGH_MEM且未曾映射,那么kmap()会调用m ...

原帖由 hb12112 于 2008-12-18 13:44 发表
明白了,谢谢!


谢谢fishswimming回答这个问题,我完全赞同。

论坛徽章:
0
88 [报告]
发表于 2008-12-31 20:41 |只看该作者
原帖由 fishswimming 于 2008-12-17 20:44 发表

恩,明白了,thx
还请再详细说说,为什么64位上庞大的非线性映射区域可以有效减少碎片的产生?

我指的在非线性映射区充足的时候,即使物理页面全是碎片,也可以通过vmap或vmalloc分配到虚拟地址连续的内存。
本质上,物理内存的碎片是无法通过64位体系避免的,但64位体系却提供了一个淡化这个问题的方法。
而i386上的非线性映射区域就很紧张,除了模块需要占用以外,其他的一些功能,比如relay的缓冲区会争抢这有限的空间。
上次我准备把relay建得稍微大一些,就遇到了这个问题。

谢谢支持!

论坛徽章:
0
89 [报告]
发表于 2008-12-31 20:42 |只看该作者
原帖由 hb12112 于 2008-12-23 15:37 发表
顶!

谢谢支持!

论坛徽章:
0
90 [报告]
发表于 2008-12-31 20:43 |只看该作者
原帖由 lonelyair 于 2008-12-24 09:18 发表
等待中。。。

谢谢支持!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP