Address Spaces dalam PCIe

19

Ada empat ruang alamat di PCI express:

  • Memori Dipetakan
  • Saya / O dipetakan
  • Ruang Konfigurasi
  • Pesan

Adakah yang bisa menjelaskan pentingnya setiap ruang alamat, dan tujuannya singkat?

Sesuai pemahaman saya, semua ruang ini dialokasikan ke dalam RAM (yaitu memori prosesor). Ruang konfigurasi adalah ruang yang dialokasikan untuk set register yang umum (ada di semua perangkat PCIe). Apakah ruang ini umum di antara semua perangkat PCIe? Dan bagaimana ini berguna untuk operasi fungsional PCIe?

Ruang ini berisi BAR (register alamat dasar). Apakah register ini digunakan untuk menentukan alamat yang tersedia di titik akhir PCIe?

Saya baru mengenal PCIe, dan mencoba mempelajarinya. Saya merujuk spesifikasi Basis, Tapi saya pikir ini ditulis untuk pembaca yang memiliki pengetahuan sebelumnya tentang PCI dan PCIe.

Silakan juga merujuk beberapa referensi online gratis yang berguna untuk mempercepat pemahaman spesifikasi dasar. Saya mengerti bahwa setiap kali ada perangkat PCIe yang terhubung dengan root complex, itu akan ditetapkan dengan beberapa wilayah memori.

ronex dicapriyo
sumber

Jawaban:

31

Sudah beberapa saat sejak ditanya, tapi saya benci pertanyaan yatim :)

Pertama, mari kita terlalu menyederhanakan platform x86 modern dan berpura-pura memiliki ruang alamat 32-bit dari 0x00000000 hingga 0xFFFFFFFF. Kami akan mengabaikan semua area khusus / dicadangkan, lubang TOLUD (atas DRAM yang dapat digunakan lebih rendah, bahasa Intel), dll. Kami akan memanggil peta memori sistem ini .

Kedua, PCI Express memperluas PCI. Dari sudut pandang perangkat lunak, mereka sangat, sangat mirip.

Saya akan melompat ke yang ketiga - ruang konfigurasi - pertama. Setiap alamat yang mengarah ke ruang konfigurasi dialokasikan dari peta memori sistem . Perangkat PCI memiliki ruang konfigurasi 256 byte - ini diperluas hingga 4KB untuk PCI express. Ruang 4KB ini mengkonsumsi alamat memori dari peta memori sistem, tetapi nilai aktual / bit / konten umumnya diimplementasikan dalam register pada perangkat periferal. Misalnya, ketika Anda membaca Vendor ID atau Device ID, perangkat periferal target akan mengembalikan data meskipun alamat memori yang digunakan berasal dari peta memori sistem.

Anda menyatakan ini "dialokasikan ke dalam RAM" - tidak benar, bit aktual / elemen stateful ada di perangkat periferal. Namun, mereka dipetakan ke dalam peta memori sistem. Selanjutnya, Anda bertanya apakah itu set register yang umum di semua perangkat PCIe - ya dan tidak. Cara PCI config space bekerja, ada pointer di akhir setiap bagian yang menunjukkan jika ada lebih banyak "barang" untuk dibaca. Ada minimum yang harus diterapkan oleh semua perangkat PCIe, dan kemudian perangkat yang lebih maju dapat menerapkan lebih banyak. Adapun seberapa bermanfaat itu untuk operasi fungsional, yah, itu wajib dan banyak digunakan. :)

Sekarang, pertanyaan Anda tentang BAR (register alamat dasar) adalah ruang yang baik untuk memisahkan ke dalam ruang memori dan ruang I / O. Menjadi agak x86 sentris, spesifikasi memungkinkan spesifikasi ukuran BAR, selain jenisnya. Hal ini memungkinkan perangkat untuk meminta BAR yang dipetakan dengan memori biasa, atau BAR ruang IO, yang memakan sebagian dari 4K ruang I / O yang dimiliki oleh mesin x86. Anda akan melihat bahwa pada mesin PowerPC, I / O space BARs tidak berharga.

BAR pada dasarnya adalah cara perangkat untuk memberi tahu host berapa banyak memori yang dibutuhkan, dan dari jenis apa (dibahas di atas). Jika saya meminta katakan 1MB ruang yang dipetakan memori, BIOS dapat menetapkan saya alamat 0x10000000 hingga 0x10100000. Ini tidak memakan RAM fisik, hanya mengatasi ruang (apakah Anda tahu sekarang mengapa sistem 32-bit mengalami masalah dengan kartu ekspansi seperti GPU kelas atas yang memiliki RAM GB?). Sekarang memori tulis / baca untuk mengatakan 0x10000004 akan dikirim ke perangkat PCI Express, dan itu mungkin register byte-lebar yang terhubung ke LED. Jadi jika saya menulis 0xFF ke alamat memori fisik 0x10000004, itu akan menyala 8 LED. Ini adalah premis dasar dari memori I / O yang dipetakan .

Ruang I / O berperilaku serupa, kecuali beroperasi di ruang memori terpisah, ruang I / O x86. Alamat 0x3F8 (COM1) ada di ruang I / O dan ruang memori dan merupakan dua hal yang berbeda.

Pertanyaan terakhir Anda, pesan merujuk pada jenis baru mekanisme interupsi, pesan yang diberi sinyal interupsi atau MSI. Perangkat PCI lawas memiliki empat pin interupsi, INTA, INTB, INTC, INTD. Ini umumnya melesat di antara slot sehingga INTA pergi ke INTA pada Slot 0, kemudian INTB pada Slot 1, kemudian INTC pada Slot 2, INTD pada Slot 3, dan kemudian kembali ke INTA pada Slot 4. Alasan untuk ini adalah bahwa sebagian besar PCI perangkat hanya menerapkan INTA dan dengan mengocoknya, setelah mengatakan tiga perangkat, masing-masing akan berakhir dengan sinyal interupsi mereka sendiri ke pengendali interupsi. MSI hanyalah cara pensinyalan interupsi menggunakan lapisan protokol PCI Express, dan kompleks akar PCIe (host) menangani gangguan CPU.

Jawaban ini mungkin sudah terlambat untuk membantu Anda, tetapi mungkin itu akan membantu beberapa Googler / Binger di masa depan.

Akhirnya, saya sarankan membaca buku ini dari Intel untuk mendapatkan pengantar PCIe yang baik dan terperinci sebelum Anda melangkah lebih jauh. Referensi lain adalah Linux Device Drivers, sebuah ebook online dari LWN .

Krunal Desai
sumber
Posting itu cukup membantu. Saya sangat baru untuk PCIe, Untuk proses Enumerasi terjadi (alokasi ruang COnfiguration dan pemetaan) kita memerlukan dukungan driver, atau dapat diprakarsai oleh Os.
kamlendra
Terima kasih, senang itu membantu! Secara umum, pada platform x86, perangkat lunak BIOS melakukan sejumlah alokasi memori berdasarkan informasi ruang konfigurasi yang diurai dari perangkat PCI. OS modern umumnya menerima peta memori apa adanya, AFAIK, meskipun mereka juga akan melalui dan menghitung perangkat untuk memuat driver yang sesuai. Saya ingat melihat beberapa hal tingkat rendah yang menarik di Linux yang dapat membuat Anda berpotensi mengubah apa yang ditugaskan oleh BIOS.
Krunal Desai
Perhatikan bahwa hanya memori yang ditandai sebagai yang dapat diambil sebelumnya yang dapat mentransfer lebih dari satu DWORD per transaksi; semua ruang lain hanya dapat mentransfer satu DWORD per transaksi. Ukuran burst terbatas hingga MAX_PAYLOAD_SIZE (ditemukan saat enumerasi).
Peter Smith
Halo. Saya baru mengenal PCI dan akan membutuhkan sedikit klarifikasi atas jawaban Anda. Anda menyatakan bahwa 256b / 4k byte ruang konfigurasi dipetakan ke dalam memori sistem. Dari bimbingan pribadi saya, saya pikir akses ke ruang konfigurasi ditangani melalui pengontrol PCI yang secara statis dipetakan ke dalam memori sistem. Pengontrol ini menyediakan beberapa register (untuk identifikasi perangkat / fungsi, offset ke ruang alamat, alamat hasil) yang berfungsi sebagai antarmuka kecil ke dalam ruang konfigurasi. Jadi efeknya, hanya sekitar 5 - 10 byte yang disediakan secara statis untuk kontroler PCI. Apakah ini benar ???
Cerezo
Jadi, ketika host (CPU) menulis ke register di alamat 0x10000004 nilai 0xFF, kompleks akar PCI akan mengambil data ini (mungkin itu selalu polling untuk data di alamat mana pun dari 0x10000000 hingga 0x10100000) dan akan menulisnya di alamat 0x04 di titik akhir (perangkat PCIe)? Apakah pemahaman ini benar?
AlphaGoku