Kysymys:
Osoitealueet PCIe: ssä
ronex dicapriyo
2015-09-03 09:23:07 UTC
view on stackexchange narkive permalink

PCI Express -ohjelmassa on neljä osoitetilaa:

  • Muisti yhdistetty
  • I / O-kartta
  • Määritystila
  • Viesti

Voiko kukaan selittää kunkin osoiteavaruuden merkityksen ja sen tarkoituksen lyhyesti?

Ymmärrykseni mukaan nämä kaikki välilyönnit on varattu RAM-muistiin (ts. Konfigurointitila on tilaa, joka on varattu yhteisille rekisteriryhmille (läsnä kaikissa PCIe-laitteissa). Onko tämä tila yhteinen kaikkien PCIe-laitteiden välillä? Ja kuinka se on hyödyllinen PCIe-toiminnassa?

Tämä tila sisältää BAR (perusosoiterekisteri). Onko tämä rekisteri tottunut määrittämään PCIe-päätepisteessä käytettävissä olevan osoitteen?

Olen uusi PCIe-käyttäjä ja yritän oppia sen. Viittaan Base-määritykseen, mutta luulen, että se on kirjoitettu lukijoille, joilla on jonkin verran ennakkotietoa PCI: stä ja PCIe: stä.

Katso myös joitain ilmaisia ​​online-viitteitä, jotka ovat hyödyllisiä perusspesifikaatioiden ymmärtämisen nopeuttamiseksi. Ymmärrän, että aina kun mikä tahansa PCIe-laite on liitetty juurikompleksiin, se määritetään tietylle muistialueelle.

üks vastaus:
Krunal Desai
2016-01-01 13:58:34 UTC
view on stackexchange narkive permalink

Tämän kysyttyä on ollut jonkin aikaa, mutta vihaan orpoja kysymyksiä :)

Yksinkertaistetaan ensin nykyaikainen x86 -alusta ja teeskennetään, että sillä on 32-bittinen osoitetila välillä 0x00000000 - 0xFFFFFFFF. Ohitamme kaikki erityiset / varatut alueet, TOLUD-aukot (alemman käyttökelpoisen DRAM-muistin yläreuna, Intel-kieliversio), jne. Kutsumme tätä järjestelmän muistikartaksi .

Toinen , PCI Express laajentaa PCI: tä. Ohjelmiston näkökulmasta ne ovat hyvin, hyvin samankaltaisia.

Siirry ensin sinun 3. - kokoonpanotilaan -. Konfigurointitilaan osoittavat osoitteet varataan järjestelmän muistikartasta . PCI-laitteessa oli 256 tavun kokoonpanotila - tämä laajennetaan 4 kt: iin PCI express -laitteelle. Tämä 4 kt: n tila vie muistin osoitteet järjestelmän muistikartalta, mutta todelliset arvot / bitit / sisältö toteutetaan yleensä oheislaitteen rekistereissä. Esimerkiksi kun luet toimittajan tunnusta tai laitetunnusta, kohdeoheislaite palauttaa tiedot, vaikka käytetty muistiosoite olisi järjestelmän muistikartalta.

Sanoit, että nämä on "varattu RAM-muistiin". "- ei ole totta, varsinaiset bitit / tilalliset elementit ovat oheislaitteessa. Ne on kuitenkin kartoitettu järjestelmän muistikarttaan. Seuraavaksi kysyit, oliko kyseessä yhteinen rekisteriryhmä kaikissa PCIe-laitteissa - kyllä ​​ja ei. Tapa, jolla PCI-määritystila toimii, on kunkin osion lopussa osoitin, joka osoittaa, onko lukemassa enemmän "juttuja". Kaikkien PCIe-laitteiden on toteutettava vähimmäisvaatimus, jonka jälkeen kehittyneemmät laitteet voivat toteuttaa enemmän. Mitä hyötyä siitä on toiminnalliselle toiminnalle, niin se on pakollinen ja sitä käytetään paljon. :)

Kysymyksesi BAR-tiedostoista (perusosoiterekisterit) on hyvä tila segmentoitavaksi muistitilaan ja I / O-tilaan. Koska määritys on jonkin verran x86-keskinen, se sallii tyypin lisäksi BAR-koon määrittelyn. Tämä sallii laitteen pyytää säännöllistä muistikartoitettua BAR-muistia tai IO-tilan BAR-tilaa, joka syö osan x86-koneen 4K I / O-tilasta. Huomaat, että PowerPC-koneissa I / O-avaruuspalkit ovat arvottomia.

BAR on periaatteessa laitteen tapa kertoa isännälle kuinka paljon muistia se tarvitsee ja minkä tyyppinen (keskusteltu yllä). Jos pyydän sanoa 1 Mt muistikartoitettua tilaa, BIOS voi antaa minulle osoitteen 0x10000000 - 0x10100000. Tämä ei kuluta fyysistä RAM-muistia, vain osoitetilaa (näetkö miksi 32-bittisissä järjestelmissä on ongelmia laajennuskorttien kanssa, kuten huippuluokan GPU: t, joissa on Gt RAM-muistia?). Nyt PCI Express -laitteelle lähetetään muistin kirjoitus- / luettu sanoen 0x10000004, ja se voi olla tavua kattava rekisteri, joka yhdistää LEDeihin. Joten jos kirjoitan 0xFF fyysiseen muistiosoitteeseen 0x10000004, se sytyttää 8 LEDiä. Tämä on muistikartoitetun I / O : n perusedellytys.

I / O-tila käyttäytyy samalla tavalla, paitsi että se toimii erillisessä muistitilassa, x86-I / O-tila. Osoite 0x3F8 (COM1) on olemassa sekä I / O- että muistitilassa ja se on kaksi eri asiaa.

Viimeinen kysymyksesi, viestit , viittaavat uudentyyppiseen keskeytysmekanismiin, sanomalla keskeytyneisiin keskeytyksiin tai lyhyeksi MSI: hen. Vanhoissa PCI-laitteissa oli neljä keskeytysnastaa, INTA, INTB, INTC, INTD. Nämä sekoitettiin yleensä lähtöpaikkojen välillä siten, että INTA meni INTA: lle lähtöpaikassa 0, sitten INTB paikassa 1, sitten INTC korttipaikassa 2, INTD korttipaikassa 3 ja sitten takaisin INTA: ssa korttipaikassa 4. Syynä tähän on se, että suurin osa PCI: stä laitteet, jotka on toteutettu vain INTA: ssa ja pyörittämällä sitä, sanomalla kolme laitetta, kullakin päätyisi omaan keskeytyssignaaliinsa keskeytysohjaimeen. MSI on yksinkertaisesti tapa antaa keskeytyksiä PCI Express -protokollakerroksen avulla, ja PCIe-juurikompleksi (isäntä) huolehtii suorittimen keskeyttämisestä.

Tämä vastaus saattaa olla liian myöhäistä auttaakseen sinua, mutta ehkä se auttaa joitain tulevia Googlerin / Bingerin jäseniä.

Lopuksi suosittelen lukemaan tämän Intelin kirjan, jotta saat hyvän ja yksityiskohtaisen esittelyn PCIe: stä, ennen kuin jatkat eteenpäin. Toinen viite olisi Linux Device Drivers, LWN: n online-e-kirja.

Posti oli varsin hyödyllinen.Olen hyvin uusi PCIe: ssä, jotta luettelointiprosessi (CO-määritystilan varaaminen ja kartoitus) tapahtuisi, tarvitsemmeko ohjaintukea, vai Os voi aloittaa sen.
Kiitos, iloinen siitä, että oli hyödyllistä!Yleensä x86-alustoilla BIOS-ohjelmisto jakaa jonkin verran muistia PCI-laitteilta jäsentämänsä kokoonpanotilan tietojen perusteella.Nykyaikaiset käyttöjärjestelmät hyväksyvät yleensä tämän muistikartan sellaisenaan, AFAIK, vaikka hekin käyvät läpi ja lukevat laitteet lataamaan sopivat ohjaimet.Muistan nähneeni mielenkiintoisia matalan tason juttuja Linuxissa, joiden avulla voit mahdollisesti muuttaa BIOS: n määrittelemää.
Huomaa, että * vain * ennalta haettavaksi merkitty muisti voi siirtää enemmän kuin yhden DWORD-sanan per tapahtuma;kaikki muut välilyönnit voivat siirtää * vain * yhden DWORD-tapahtuman.Purskeen koko on rajoitettu arvoon MAX_PAYLOAD_SIZE (löydetty luettelon aikana).
Hei.Olen uusi PCI: ssä ja haluaisin hieman selvennystä vastauksestasi.Olet ilmoittanut, että kokoonpanotilan 256b / 4k tavu on kartoitettu järjestelmämuistiin.Itseopetuksestani ajattelin, että pääsy konfigurointitilaan hoidetaan PCI-ohjaimen kautta, joka on staattisesti kartoitettu järjestelmän muistiin.Tämä ohjain tarjoaa muutaman rekisterin (laitteen / toiminnon tunnistamiseksi, osoitetilaan siirtymiseksi, tulososoitteeksi), jotka toimivat pienenä rajapintana konfigurointitilaan.Joten käytännössä PCI-ohjaimelle varataan staattisesti vain 5-10 tavua.Onko tämä oikein ???
Joten, kun isäntä (CPU) kirjoittaa rekisteriin osoitteessa 0x10000004 arvon 0xFF, PCI-juurikompleksi hakee nämä tiedot (ehkä se kysyi aina tietoja millä tahansa osoitteella välillä 0x10000000 - 0x10100000) ja kirjoittaa sen osoitteeseen0x04 päätepisteessä (PCIe-laite)?Onko tämä ymmärtäminen oikein?


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...