阅读:1338回复:8
有关分页内存的访问,请指教,20!
win2k, kernel streaming minidriver for a PCI Video Card
我的思路是: [1] 当收到数据读的srb时将它排入链表 [2] 启动传输时看看链表中是否有srb,若有则用srb中的buffer初始化dma(没什么可说的)若没有则初始化一块缓冲区,然后用该缓冲区初始化dma。 [3] 当dma结束时引发isr,在isr中看看链表中是否有srb,没有则丢弃数据,重新初始化dma。若有则看看当前所用的dma缓冲是否为srb所带,是则直接完成srb取下一个srb,若为自己初始化的缓冲区(问题来了)我想把缓冲区中的数据复制到srb的缓冲区中,结果发现此时irql为dispatch level,不能使用srb的虚拟内存,我该怎么办呢,清高手指教,谢谢! |
|
沙发#
发布于:2002-07-17 16:51
不合理呀,我怎么知道后面有没有人再回答问题.
问题没有解决, 大哥们都是怎么做的呀 :( |
|
板凳#
发布于:2002-07-17 13:51
没有给完就自己留下罗。
|
|
地板#
发布于:2002-07-17 11:45
给分之能给一次吗, 没给完怎么办
|
|
地下室#
发布于:2002-07-17 11:41
多谢多谢!
我的卡是master dma且支持scatter/gather,由于direct show给出的srb包中的缓冲就是分页的,可能用物理地址复制会很麻烦,所以我使用的是转换后的虚拟地址(你说的线性地址是指虚拟地址吗?有何区别?),就是用的RtlCopyMemory. 我好像听说dpc就是用来做数据复制的,可是为何我在dpc中获得的irql和我在isr中获得的都是2, 即dispatch level,我这块很糊涂, 请行家指正. |
|
5楼#
发布于:2002-07-17 11:06
这里好象有个问题,你做DMA操作的时候,一般应该是master dma,不知道你是不是用了scatter/gather,你的缓冲区地址应该是物理地址吧,而你复制数据时用的是虚拟地址,会不会是用的复制函数有问题呢?
如果用RtlCopyMemery就得将物理地址先转化为线形地址。 如果都用物理地址那就用物理地址为参数的函数,函数名太长了,而且好象只能拷贝连续物理内存区。 希望能有所帮助。好运! |
|
|
6楼#
发布于:2002-07-17 09:46
可是dpc同样也是dispatch level啊,我也试过的,还是我弄错了
|
|
7楼#
发布于:2002-07-15 10:16
在dpc中做,不要在isr中做
|
|
|
8楼#
发布于:2002-07-15 07:28
还有,srb所带的缓冲本身就是为dma使用的应该是锁定在内存中的,为什么在isr中无法使用呢?
|
|