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 .