มันไม่นานมานี้ตั้งแต่ถูกถาม แต่ฉันเกลียดคำถามกำพร้า :)
อันดับแรกให้ลดความซับซ้อนของแพลตฟอร์ม x86 ที่ทันสมัยและแสร้งทำเป็นว่ามีพื้นที่ที่อยู่ 32 บิตจาก 0x00000000 ถึง 0xFFFFFFFF เราจะเพิกเฉยต่อพื้นที่พิเศษ / ที่สงวนไว้ทั้งหมด TOLUD (ด้านบนของ DRAM ที่ใช้งานได้ต่ำกว่า, Intel parlance) รูเป็นต้นเราจะเรียกแผนที่หน่วยความจำระบบนี้
ประการที่สอง PCI Express ขยาย PCI จากมุมมองของซอฟต์แวร์พวกเขาคล้ายกันมาก
ฉันจะข้ามไปยังหมายเลขที่ 3 ของคุณ - พื้นที่การกำหนดค่า - ก่อน ที่อยู่ใด ๆ ที่ชี้ไปยังพื้นที่กำหนดค่าจะถูกจัดสรรจากแผนที่หน่วยความจำระบบแผนที่หน่วยความจำระบบอุปกรณ์ PCI มีพื้นที่กำหนดค่า 256 ไบต์ - ซึ่งขยายเป็น 4KB สำหรับ PCI Express พื้นที่ 4KB นี้ใช้ที่อยู่หน่วยความจำจากแผนที่หน่วยความจำระบบ แต่โดยทั่วไปค่า / บิต / เนื้อหาที่แท้จริงจะถูกนำไปใช้ในการลงทะเบียนบนอุปกรณ์ต่อพ่วง ตัวอย่างเช่นเมื่อคุณอ่าน ID ผู้ขายหรือ ID อุปกรณ์อุปกรณ์ต่อพ่วงเป้าหมายจะส่งคืนข้อมูลแม้ว่าที่อยู่หน่วยความจำที่ใช้จะมาจากแผนที่หน่วยความจำระบบ
คุณระบุว่าสิ่งเหล่านี้ "จัดสรรเป็น RAM" - ไม่จริงองค์ประกอบบิต / สถานะที่แท้จริงอยู่ในอุปกรณ์ต่อพ่วง อย่างไรก็ตามพวกเขาจะถูกแมปลงในแผนที่หน่วยความจำระบบ ถัดไปคุณถามว่าเป็นชุดทะเบียนทั่วไปในอุปกรณ์ PCIe ทั้งหมดหรือไม่ - ใช่และไม่ใช่ วิธีการทำงานของพื้นที่ปรับแต่ง PCI นั้นจะมีตัวชี้ที่ส่วนท้ายของแต่ละส่วนที่ระบุว่ามี "สิ่ง" ให้อ่านเพิ่มเติมหรือไม่ มีขั้นต่ำเปล่าที่อุปกรณ์ PCIe ทั้งหมดต้องใช้งานและจากนั้นอุปกรณ์ขั้นสูงสามารถใช้งานได้มากขึ้น สำหรับประโยชน์ที่ได้รับสำหรับการใช้งานได้ดีและจำเป็นอย่างมาก :)
ตอนนี้คำถามของคุณเกี่ยวกับ BARs (การลงทะเบียนที่อยู่พื้นฐาน) เป็นพื้นที่ที่ดีในการแบ่งพื้นที่หน่วยความจำและพื้นที่ I / O สเปคช่วยให้สเปคของขนาดบาร์นอกเหนือไปจากประเภทนี้ สิ่งนี้อนุญาตให้อุปกรณ์ร้องขอ BAR ที่แมปหน่วยความจำปกติหรือ IO space BAR ซึ่งกินพื้นที่ I / O 4K จำนวนหนึ่งที่เครื่อง x86 มี คุณจะสังเกตเห็นว่าในเครื่อง PowerPC แถบพื้นที่ I / O นั้นไม่มีค่า
บาร์นั้นเป็นวิธีที่อุปกรณ์บอกโฮสต์ว่าต้องการหน่วยความจำเท่าใดและเป็นประเภทใด ถ้าฉันถามว่าพื้นที่หน่วยความจำแมป 1MB, BIOS อาจกำหนดฉันที่อยู่ 0x10000000 ถึง 0x10100000 นี่ไม่ใช่การใช้ RAM จริงเพียงแค่กำหนดพื้นที่ (คุณเห็นไหมว่าทำไมระบบ 32- บิตจึงมีปัญหาเกี่ยวกับการ์ดเอ็กซ์แพนชันเช่น GPU ระดับสูงที่มี RAM ขนาด GB?) ขณะนี้หน่วยความจำเขียน / อ่านเพื่อบอกว่า 0x10000004 จะถูกส่งไปยังอุปกรณ์ PCI Express และนั่นอาจเป็นการลงทะเบียนแบบไบท์ที่เชื่อมต่อกับไฟ LED ดังนั้นถ้าฉันเขียน 0xFF ไปยังที่อยู่หน่วยความจำกายภาพ 0x10000004 นั่นจะเปิด 8 LEDs นี่คือขั้นพื้นฐานของหน่วยความจำที่แมป I / O
พื้นที่ I / Oทำงานในทำนองเดียวกันยกเว้นว่าทำงานในพื้นที่หน่วยความจำแยกต่างหากคือพื้นที่ x86 I / O ที่อยู่ 0x3F8 (COM1) มีอยู่ทั้งในพื้นที่ I / O และพื้นที่หน่วยความจำและมีสองสิ่งที่แตกต่างกัน
คำถามสุดท้ายของคุณข้อความหมายถึงกลไกการขัดจังหวะแบบใหม่การขัดจังหวะการส่งสัญญาณข้อความหรือ MSI สั้น ๆ อุปกรณ์ PCI แบบดั้งเดิมมีหมุดขัดจังหวะสี่อัน INTA, INTB, INTC, INTD โดยทั่วไปแล้วสิ่งเหล่านี้เกิดขึ้นอย่างรวดเร็วในหมู่สล็อตเช่นที่ INTA ไปที่ INTA บนสล็อต 0 จากนั้น INTB ในสล็อต 1 จากนั้น INTC บนสล็อต 2, INTD บนสล็อต 3 และจากนั้นกลับไปที่ INTA บนสล็อต 4 เหตุผลสำหรับสิ่งนี้คือ PCI ส่วนใหญ่ อุปกรณ์ที่นำมาใช้เท่านั้น INTA และโดยการ swizzling มันมีสามอุปกรณ์แต่ละตัวจะจบลงด้วยสัญญาณขัดจังหวะของตัวเองเพื่อควบคุมขัดจังหวะ MSI เป็นวิธีการส่งสัญญาณการขัดจังหวะโดยใช้เลเยอร์โปรโตคอล PCI Express และ PCIe root complex (โฮสต์) ดูแลการขัดจังหวะ CPU
คำตอบนี้อาจจะสายเกินไปที่จะช่วยคุณ แต่บางทีมันอาจจะช่วยให้ Googler / Binger ในอนาคต
ในที่สุดฉันขอแนะนำให้อ่านหนังสือเล่มนี้จาก Intelเพื่อรับการแนะนำที่ดีและมีรายละเอียดเกี่ยวกับ PCIe ก่อนที่คุณจะไปต่อ อ้างอิงอีกจะเป็นไดรเวอร์ของอุปกรณ์ Linux เป็น ebook ออนไลน์จาก LWN