阅读:2076回复:4
一个问题!
这些日子看了一下linux下的网卡驱动程序,就是对驱动如何完成从网卡自身的fifo和系统内存间 的包传输问题不是很明白,我看源码中有pci_alloc_consistent分配一段内存,返回一个dma handle(我可能对dma机制不是很清楚),然后又用pci_map_single函数进行地址映射,我想问一下这里的地址映射是什么地址间的映射?另外驱动是怎样实现访问网卡自身的fifo中的内容的,fifo的地址跟网卡的io基地址是什么关系?
|
|
沙发#
发布于:2002-04-08 17:04
首先, 这两个函数是在linux kernel 2.4中出现的。
pci_alloc_consistent确实分配一段内存,并且返回的是分配的一段内存的物理地址(dma handle, 由卡使用)和虚拟地址(driver使用),pci_map_single函数进行地址映射实际上是一个空操作。网卡自身的fifo中的内容是不可以由driver访问的, 由卡将fifo中的内容通过dma机制移到内存中, 再由driver访问。 |
|
板凳#
发布于:2002-04-08 17:20
更正:
pci_alloc_consistent分配一段内存,返回一个dma handle,这段内存在driver的生存期间最好不要释放。一句话 pci_alloc_consistent适合于分配一段大的内存, 并且不是经常的释放和分配。 pci_map_single是将一块已经分配的内存作为参数, 得到这块内存的物理地址, 适合由于分配较小的内存, 并且经常的需要释放和重新分配的。 这两个函数不应该混合使用的。 |
|
地板#
发布于:2002-04-08 19:31
请问那个通过dma机制将卡中fifo的内容传入内存是在何处实现,driver中又在何处得以调用这部分的内容的呢?我好像在代码中没有看到这一部分的内容呀?还望大侠继续指教!
|
|
地下室#
发布于:2002-04-10 14:58
由硬件实现的, 不是由driver实现的, 当硬件将收到的packet移到memory后, 会发一个receive complete的中断, 这时调用driver的中断处理程序将收到的packet传给tcp/ip层 :)
|
|