当前位置: 技术问答>linux和unix
请教一下零拷贝的问题! 各位请进!
来源: 互联网 发布时间:2016-05-29
本文导语: 通过google得到的几种零拷贝方案: 1、通过DMA操作(需要处理器支持,不会,没试过) 2、使用sendfile(测试过,效率和__put_user等差不多,据说大量数据并发处理会体现出效率。。) 3、使用mmap /dev/mem的方法(测试过...
通过google得到的几种零拷贝方案:
1、通过DMA操作(需要处理器支持,不会,没试过)
2、使用sendfile(测试过,效率和__put_user等差不多,据说大量数据并发处理会体现出效率。。)
3、使用mmap /dev/mem的方法(测试过,根本不行,因为mmap得到的也是个影像而已)
我现在自己想到一种方法,各位看看是否可行。
在内核态可以得到用户态的task struct,这个结构中包含了任务运行的物理地址(是这样吧?),是否这样内核态就可以得到用户态的静态变量、动态变量、以及一些堆栈的地址了? 如果可以得到的话,直接对其读写不就可以实现零拷贝了?
1、通过DMA操作(需要处理器支持,不会,没试过)
2、使用sendfile(测试过,效率和__put_user等差不多,据说大量数据并发处理会体现出效率。。)
3、使用mmap /dev/mem的方法(测试过,根本不行,因为mmap得到的也是个影像而已)
我现在自己想到一种方法,各位看看是否可行。
在内核态可以得到用户态的task struct,这个结构中包含了任务运行的物理地址(是这样吧?),是否这样内核态就可以得到用户态的静态变量、动态变量、以及一些堆栈的地址了? 如果可以得到的话,直接对其读写不就可以实现零拷贝了?
|
好像主要的限制是缺页处理。核心可以处理用户空间的缺页,但是貌似不能处理核心本身的缺页。那么,你怎么在用户空间保证
它在核心处理时不会发生缺页。如果不发生缺页,貌似是可以做到的吧。
内核能够直接访问物理内存,而用户进程最终也是要映射到实际的物理内存,那么内核只要找到那块内存,两者不就能够交换数据了
它在核心处理时不会发生缺页。如果不发生缺页,貌似是可以做到的吧。