Linux.ChinaUnix.net
ChinaUnix | Linux首页 | 新闻 | 博客 | 文章 | 专栏 | 新手 | 方案 | 图书 | 下载 | 人才 | 手册 | wiki | 搜索     
Linux论坛
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


x86下dma映射以及页面锁页换页的问题
首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »  
[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]
duanius
精灵王



UID:471810
注册:2006-10-1
最后登录: 2008-05-11
帖子:290
精华:1

可用积分:290
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]


顶部
1楼 发表于 2008-4-29 10:44 
记不清是在哪个贴子里(找了我发的主题 但好像没有)印象中有位大牛好像说过这样的概念 就是在x86架构下  由于x86本身的特点 没有一致性dma和流式dma的区别  所有dma映射都是一致性的  即使是建立了流式映射 实质上也是一致性映射
我有2个问题   
1是我印象中的这段话 是否正确
2是如果1成立的话  我们可不可以把x86架构下的分配dma映射的函数全部换掉 用自己的一个函数来代替  而那个函数所做的也就是返回一个物理地址?

[ 本帖最后由 duanius 于 2008-5-7 21:11 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
4月书评获奖名单公布 | CU社区建设有奖大调查 | CU-2008奥运之春摄影比赛
版主 albcamus (百無一用書生)
版主-大法师
[ 願天速殞可憐生 ]



UID:140189
注册:2004-3-7
最后登录: 2008-05-11
帖子:10813
精华:19

可用积分:4194
信誉积分:100
专家积分:15 (本版)

来自:嫏嬛閣
状态:...保密...

[资料] [站内短信] [Blog]


顶部
2楼 发表于 2008-4-29 10:57 
1, 正确,就是表达不大准确。
2, 写driver最好考虑兼容

之所以内核提供consistent和streaming这2种映射,就是为了平台兼容的,何苦非要针对一个平台呢。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

欢迎投票:
http://bbs.chinaunix.net/thread-1043990-1-1.html
   平生自有千秋在,不向群兒問毀譽!


   
   爱国主义是群氓的道德安全套……



4月书评获奖名单公布 | CU社区建设有奖大调查 | CU-2008奥运之春摄影比赛
duanius
精灵王



UID:471810
注册:2006-10-1
最后登录: 2008-05-11
帖子:290
精华:1

可用积分:290
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]


顶部
3楼 发表于 2008-4-29 11:06 
以前在wing兄a版等诸位牛人的帮助下   发现了在x86上建立一致性映射的代码其实也就是做了分配内存和计算内存物理地址并返回这两件事   
但我现在面临一个问题  我现在是从用户态分配好了内存空间 然后传递给网卡模块 模块算出每页物理地址 填到网卡描述符的dma区中   以前的网卡驱动是通过对每个报文缓存建立流式映射完成的 我现在的内存是在用户态分配  只想在内核态完成地址转换和填充dma地址的事情 (而不对要dma的块进行dma映射 单纯把页物理地址送到网卡)  如果1楼是对的话  那应该这样可行吧  毕竟用一致性映射 map和unmap都很烦人。。。



您对本贴的看法:鲜花[0] 臭蛋[0]
4月书评获奖名单公布 | CU社区建设有奖大调查 | CU-2008奥运之春摄影比赛
duanius
精灵王



UID:471810
注册:2006-10-1
最后登录: 2008-05-11
帖子:290
精华:1

可用积分:290
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]


顶部
4楼 发表于 2008-4-29 11:12 


QUOTE:
原帖由 albcamus 于 2008-4-29 10:57 发表
1, 正确,就是表达不大准确。
2, 写driver最好考虑兼容

之所以内核提供consistent和streaming这2种映射,就是为了平台兼容的,何苦非要针对一个平台呢。

a版回复真快阿 ~~~  我目前只打算在x86平台上搞定它  因为想法比较特殊
是这样  如果用流式映射的话 很麻烦  每次读取数据都要有类似unmap的操作  也就是每次网卡有数据包都要进中断 或者软中断  处理 否则如果不在这里面unmap的话  用户态即使直接mmap了dma区也无法读数据    而我目前系统的想法就是在高负载的情况下尽量少产生中断  也就是少进内核态    如果对每个映射的报文缓存都用流式映射   那就必须要进中断或者软中断处理了 (我的一个思想就是在零拷贝系统上 数据处理不用软中断 中断也尽量少触发  把事情移到用户态做)



您对本贴的看法:鲜花[0] 臭蛋[0]
4月书评获奖名单公布 | CU社区建设有奖大调查 | CU-2008奥运之春摄影比赛
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-05-11
帖子:1507
精华:3

可用积分:1663
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
5楼 发表于 2008-4-29 13:45 


QUOTE:
原帖由 duanius 于 2008-4-29 11:06 发表
以前在wing兄a版等诸位牛人的帮助下   发现了在x86上建立一致性映射的代码其实也就是做了分配内存和计算内存物理地址并返回这两件事   
但我现在面临一个问题  我现在是从用户态分配好了内存空间 然后传递给网 ...

你不能在用户态分配一块内存给内核做DMA,因为在DMA的时候它可能swap出去。
应该在内核分配一块内存,让用户态可以访问。

如果在用户态分配内存,你沿着read() 一直看到generic_file_direct_IO(),看看内核directIO时如何处理用户态内存的。
看2.6.20以前的内核,后来的函数名字变了。我是没仔细看过,LZ可以慢慢研究一下。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
4月书评获奖名单公布 | CU社区建设有奖大调查 | CU-2008奥运之春摄影比赛
版主 albcamus (百無一用書生)
版主-大法师
[ 願天速殞可憐生 ]



UID:140189
注册:2004-3-7
最后登录: 2008-05-11
帖子:10813
精华:19

可用积分:4194
信誉积分:100
专家积分:15 (本版)

来自:嫏嬛閣
状态:...保密...

[资料] [站内短信] [Blog]


顶部
6楼 发表于 2008-4-29 13:51 


QUOTE:
原帖由 zx_wing 于 2008-4-29 13:45 发表

你不能在用户态分配一块内存给内核做DMA,因为在DMA的时候它可能swap出去。
应该在内核分配一块内存,让用户态可以访问。

如果在用户态分配内存,你沿着read() 一直看到generic_file_direct_IO(),看看内 ...

我觉得用户内存的最大问题还不是swap出去(那样,mlock(2)一下即可), 而是很可能物理地址不连续 - 这对DMA来说将是致命的。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

欢迎投票:
http://bbs.chinaunix.net/thread-1043990-1-1.html
   平生自有千秋在,不向群兒問毀譽!


   
   爱国主义是群氓的道德安全套……



4月书评获奖名单公布 | CU社区建设有奖大调查 | CU-2008奥运之春摄影比赛
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-05-11
帖子:1507
精华:3

可用积分:1663
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
7楼 发表于 2008-4-29 13:57 


QUOTE:
原帖由 albcamus 于 2008-4-29 13:51 发表


我觉得用户内存的最大问题还不是swap出去(那样,mlock(2)一下即可), 而是很可能物理地址不连续 - 这对DMA来说将是致命的。

哦,对,这个是更关键的问题!



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
4月书评获奖名单公布 | CU社区建设有奖大调查 | CU-2008奥运之春摄影比赛
duanius
精灵王



UID:471810
注册:2006-10-1
最后登录: 2008-05-11
帖子:290
精华:1

可用积分:290
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]


顶部
8楼 发表于 2008-4-29 14:45 
呃 事实上 我原本的打算就是采用内核分配内存的方法  即使不提性能 这种方法也比用户态分配要省很多事情 但一旦面临实际问题  难度就很大 最主要的是 内核能够分配的内存空间太小了 零拷贝系统上面跑的都是类似入侵检测防火墙这样的程序 每一个包的处理都要花很长的时间 这就意味着如果你的缓冲区不够大 就很有可能丢包  一般的说 都要分配50-100M的空间 才能确保每个包就足够长的生存期  我的机器是512的内存 用buddyinfo看一下能分配的空闲块  最大的也就一块2m的  而且即使够用  把内核里的大块全部分掉也不是很明智  所以我放弃了这个方法
我看到很多论文或者做出来的产品都是采用用户态分配的方法  具体方法就是通过一个在网卡中注册的字符设备的ioctl方法接收用户态程序传来的地址  通过pgd_offset等一系列操作对每个页求物理地址 并锁页 比如你用了1000页 那就循环1000次 求1000个物理地址并锁页 我想这应该能解决被换出的问题
至于物理地址不连续对dma有影响这个问题 我以前也是这样认为的 但后来觉得影响不大 因为你求出地址 然后把这个物理地址放到网卡的描述符里  网卡有数据的时候就会根据地址找到空间进行dma 即使不连续也没有什么关系 因为每个报文描述符都有个地址  并不需要连续   事实上 即使非零拷贝 现在我用的网卡里面的dma地址也是不连续的 因为随着skb的分配和释放 它的描述符里的地址也是不停在变的

我理解是这样 欢迎双巨头以及诸位看看可有想当然的地方(有时候想的挺好  做的时候才发现自己很傻很天真)



您对本贴的看法:鲜花[0] 臭蛋[0]
4月书评获奖名单公布 | CU社区建设有奖大调查 | CU-2008奥运之春摄影比赛
版主 albcamus (百無一用書生)
版主-大法师
[ 願天速殞可憐生 ]



UID:140189
注册:2004-3-7
最后登录: 2008-05-11
帖子:10813
精华:19

可用积分:4194
信誉积分:100
专家积分:15 (本版)

来自:嫏嬛閣
状态:...保密...

[资料] [站内短信] [Blog]


顶部
9楼 发表于 2008-4-29 14:52 
分配大内存可以用bootmem吧? google一下应该有,我没用过^_^



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

欢迎投票:
http://bbs.chinaunix.net/thread-1043990-1-1.html
   平生自有千秋在,不向群兒問毀譽!


   
   爱国主义是群氓的道德安全套……



4月书评获奖名单公布 | CU社区建设有奖大调查 | CU-2008奥运之春摄影比赛
duanius
精灵王



UID:471810
注册:2006-10-1
最后登录: 2008-05-11
帖子:290
精华:1

可用积分:290
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]


顶部
10楼 发表于 2008-4-29 14:53 
发一篇我最早接触零拷贝时看的一篇论文  这里面有一章是解释网卡如何用用户态的内存的 这篇文章应该算是国内最经典的一篇了 基本上所有搞零拷贝的都要拜读下   虽然一直不理解为啥它的同步机制要设计的那么烦琐 (哈工以后所有相关大小论文用的同步机制都是这个调调 我个人感觉没有必要)但总体而言还是写的很牛比的



2008-4-29 14:53
  下载次数: 72
A_零拷贝报文捕获平台的研究与实现.pdf (455.18 KB)
 


您对本贴的看法:鲜花[0] 臭蛋[0]
4月书评获奖名单公布 | CU社区建设有奖大调查 | CU-2008奥运之春摄影比赛

首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »

 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - Linux时代 - Archiver - WAP - TOP

Processed in 0.043555 second(s), 6 queries , Gzip enabled