> Existuje sice i rozíení PCI pro 64bitové adresování,
> nicmén to je jednak pomalejí
Pokud myslite DAC (dual address cycle) tak to skutecne
pomalejsi je (o jeden adresni cyklus, coz je dokonale
zanedbatelne). 64bitova PCI samozrejme umi 64bitove
adresy nativne.
> Na PCI neexistuje ádný DMA adi podobn, jako teba na
> ISA; na PCI si kadé zaízení dlá adresaci pamti samo.
> Tato technika se nazývá Bus-master.
Ne. Bus mastering znamena ze zarizeni muze aktivne
prevzit kontrolu nad sbernici (na nekterych
sbernicich dokonce preemptovat probihajici
transakci). Tohle je detail.
> FreeBSD 5 má tyto nedostatky odstranny ovladae
> zaízení mají sjednocený pístup k DMA pomocí funkcí
> bus_dmamap_load a bus_dmamap_unload. Synchronizaci
> s cachemi procesoru musí speciáln provádt pomocí
> funkce bus_dmamap_sync.
Doplnil bych ze rozhrani bus_dma(9) bylo na FreeBSD5
preneseno z NetBSD, kde se objevilo ve verzi 1.3.
Vas popis je dosti neuplny, zajemcum doporucuji
manualove stranky na {free,net}bsd.org
> Nutno upozornit na celkem závaný problém, který
> tento pístup má zatímco na Linuxu jsou struktury
> jádra alokovány vdy v ásti pamti pístupné pro DMA,
> na FreeBSD tomu tak nemusí být me tedy docházet k
> výraznému zpomalování zpsobenému kopírováním dat
> do bounce-buffer napíklad pi prací se síovými
> packety, pokud struktura popisující packet není
> náhodou alokována v dolních 4G. Na architekturách
> s IOMMU tento problém nenastane.
Neznam implementaci ve FreeBSD, na NetBSD a v
principu ani na FreeBSD to ale neni pravda. Veskera
pamet u ktere se ocekava DMA prenos (jako sitove
pakety) by mela byt alokovana pomoci bus_dmamem_alloc. Tato funkce provede alokaci v
souladu s podmikami diktovanymi typem sbernice
(tj. dma tagem).
Poslední připomínka ohledně alokace síťových packetů --- tato alokace je dělána v m_get, odsud se dostane do mb_pop_cont, odsud do kmem_alloc a odtud do vm_page_alloc (FreeBSD 5.2-BETA). Takže se alokuje úplně normálně pomocí běžného alokátoru stránek a na alokaci v dolní části paměti se nebere zřetel. Nebo je to jinak?
Jinak si ani dost dobře nedokážu představit, jak by se měla v době syscallu write na socketu alokovat paměť pomocí bus_dmamem_alloc, když například vůbec není jasné, na kterou síťovou kartu ten packet půjde.