- 论坛徽章:
- 0
|
原帖由 思一克 于 2006-4-14 12:30 发表
to obrire,
我看了你的做法,觉得不错。
比如,在用户空间malloc()了32M虚拟地址,如何在用户空间知道其物理开始地址并且打开/dev/mem线性操作相应的地址?
首先,你要得到用户空间地址在内核空间的入口, 用逻辑地址并减去PAGE_OFFSET才能得到物理地址.
与高端内存的关系,你要看看你当前版本的源定义,不一而足
如果纯粹在用户空间用malloc, 并不能保证你能得到性线物理地址.
因此才有我说的,先在内核模块中规划, 然后在用户空间自由使用
所以在用户空间用malloc是无法保证性能和线性的.在VMA中可以保证你看起来是线性的.
但内核实现, 完全可以采用relayfs(2.6.14以后加入)方式,用多组不同大小的页面组来完成映射(list),
只是你在用户空间感觉不到.
如果你想这样使用, 建议你也先在内核空间划出一块来, 然后在用户空间操作.
我是因为我的PCI总线的上设备要求在相关Register置入物理地址, 并要求在块线性空间,才不得不这样呀.
主要是方便DMA传送. 如果全在内核模块中做,有些功能不方便,不如用户空间编程方便,所以行此法.
只是这方面你的代码千万不能越界,如果打开/dev/mem以后,在其它区间写入了数据,
会让系统变得不可思议了.
我所讲的无非三点
1. 方便在用户空间直接操作物理内存
2. 线性读写/块传输
3. 内核模块中实现了DMA传输完成IRQ响应,用户程序完全可以while(1)直接操作
使得编程接口简单高效, 就像实时preview高速视频一样.其它线程编码不受影响
至于同步问题, 用什么机制, 尊重你自己的选择,别让work_queue锁死了.如果有硬时钟就好了
应用层可以多路POOLING,内核层采用中断 |
|