Địa chỉ không gian trong PCIe


19

Có bốn không gian địa chỉ trong PCI express:

  • Bộ nhớ đã ánh xạ
  • Ánh xạ I / O
  • Không gian cấu hình
  • Thông điệp

Bất cứ ai cũng có thể giải thích ý nghĩa của từng không gian địa chỉ và mục đích của nó là ngắn gọn?

Theo hiểu biết của tôi, tất cả các không gian này được phân bổ vào RAM (tức là bộ nhớ của bộ xử lý). Không gian cấu hình là không gian được phân bổ cho bộ thanh ghi chung (có trong tất cả các thiết bị PCIe). Là không gian này là phổ biến giữa tất cả các thiết bị PCIe? Và nó hữu ích như thế nào đối với hoạt động chức năng của PCIe?

Không gian này chứa BAR (thanh ghi địa chỉ cơ sở). Là thanh ghi này được sử dụng để chỉ định địa chỉ có sẵn trong điểm cuối PCIe?

Tôi chưa quen với PCIe và đang cố gắng học nó. Tôi đang đề cập đến đặc tả cơ sở, nhưng tôi nghĩ nó được viết cho những độc giả có một số kiến ​​thức trước đây về PCI và PCIe.

Ngoài ra xin vui lòng tham khảo một số tài liệu tham khảo trực tuyến miễn phí hữu ích để tăng tốc độ hiểu biết về đặc điểm kỹ thuật cơ sở. Tôi hiểu rằng bất cứ khi nào bất kỳ thiết bị PCIe nào được gắn với phức hợp gốc, nó sẽ được gán với một số vùng nhớ.

Câu trả lời:


31

Đã được một lúc kể từ khi điều này được hỏi, nhưng tôi ghét những câu hỏi mồ côi :)

Trước tiên, hãy đơn giản hóa quá mức một nền tảng x86 hiện đại và giả vờ nó có 32 bit không gian địa chỉ từ 0x00000000 đến 0xFFFFFFFF. Chúng tôi sẽ bỏ qua tất cả các khu vực đặc biệt / dành riêng, các lỗ TOLUD (trên cùng của các lỗ DRAM có thể sử dụng thấp hơn, theo cách nói của Intel), v.v. Chúng tôi sẽ gọi bản đồ bộ nhớ hệ thống này .

Thứ hai, PCI Express mở rộng PCI. Từ quan điểm phần mềm, chúng rất, rất giống nhau.

Tôi sẽ nhảy đến cái thứ 3 của bạn - không gian cấu hình - đầu tiên. Bất kỳ địa chỉ nào trỏ đến không gian cấu hình đều được phân bổ từ bản đồ bộ nhớ hệ thống . Một thiết bị PCI có không gian cấu hình 256 byte - điều này được mở rộng lên 4KB cho PCI express. Không gian 4KB này tiêu thụ địa chỉ bộ nhớ từ bản đồ bộ nhớ hệ thống, nhưng các giá trị / bit / nội dung thực tế thường được thực hiện trong các thanh ghi trên thiết bị ngoại vi. Chẳng hạn, khi bạn đọc ID nhà cung cấp hoặc ID thiết bị, thiết bị ngoại vi đích sẽ trả về dữ liệu mặc dù địa chỉ bộ nhớ đang được sử dụng là từ bản đồ bộ nhớ hệ thống.

Bạn đã nói rằng đây là "được phân bổ vào RAM" - không đúng sự thật, các bit / phần tử trạng thái thực tế nằm trong thiết bị ngoại vi. Tuy nhiên, chúng được ánh xạ vào bản đồ bộ nhớ hệ thống. Tiếp theo, bạn hỏi liệu đó có phải là một bộ thanh ghi chung trên tất cả các thiết bị PCIe không - có và không. Cách thức hoạt động của không gian cấu hình PCI, có một con trỏ ở cuối mỗi phần cho biết liệu có nhiều "nội dung" cần đọc hay không. Có một mức tối thiểu mà tất cả các thiết bị PCIe phải thực hiện, và sau đó các thiết bị tiên tiến hơn có thể thực hiện nhiều hơn. Về việc nó hữu ích như thế nào đối với hoạt động chức năng, tốt, nó bắt buộc và được sử dụng nhiều. :)

Bây giờ, câu hỏi của bạn về BAR (thanh ghi địa chỉ cơ sở) là một không gian tốt để phân tách thành không gian bộ nhớ và không gian I / O. Là một phần trung tâm x86, đặc điểm kỹ thuật cho phép đặc điểm kỹ thuật của kích thước BAR, ngoài loại. Điều này cho phép một thiết bị yêu cầu một BAR ánh xạ bộ nhớ thông thường hoặc một BAR không gian IO, ăn một số không gian 4K của I / O mà máy x86 có. Bạn sẽ nhận thấy rằng trên các máy PowerPC, các thanh không gian I / O là vô dụng.

Một BAR về cơ bản là cách của thiết bị để báo cho chủ nhà biết nó cần bao nhiêu bộ nhớ và loại nào (đã thảo luận ở trên). Nếu tôi yêu cầu nói 1MB dung lượng ánh xạ bộ nhớ, BIOS có thể gán cho tôi địa chỉ 0x10000000 đến 0x10100000. Điều này không tiêu tốn RAM vật lý, chỉ là không gian địa chỉ (bạn có thấy tại sao hệ thống 32 bit gặp sự cố với thẻ mở rộng như GPU cao cấp có GB RAM không?). Bây giờ, một bộ nhớ ghi / đọc để nói 0x10000004 sẽ được gửi đến thiết bị PCI Express và đó có thể là một thanh ghi rộng byte kết nối với đèn LED. Vì vậy, nếu tôi ghi 0xFF vào địa chỉ bộ nhớ vật lý 0x10000004, nó sẽ bật 8 đèn LED. Đây là tiền đề cơ bản của I / O được ánh xạ bộ nhớ .

Không gian I / O hoạt động tương tự, ngoại trừ nó hoạt động trong một không gian bộ nhớ riêng, không gian I / O x86. Địa chỉ 0x3F8 (COM1) tồn tại cả trong không gian I / O và không gian bộ nhớ và là hai thứ khác nhau.

Câu hỏi cuối cùng của bạn, tin nhắn đề cập đến một loại cơ chế ngắt mới, viết tắt là tin nhắn bị gián đoạn hoặc MSI. Các thiết bị PCI kế thừa có bốn chân ngắt, INTA, INTB, INTC, INTD. Chúng thường bị xáo trộn giữa các vị trí như INTA đã chuyển sang INTA trên Slot 0, sau đó là INTB trên Slot 1, sau đó INTC trên Slot 2, INTD trên Slot 3, sau đó quay lại INTA trên Slot 4. Lý do cho điều này là vì hầu hết PCI các thiết bị chỉ triển khai INTA và bằng cách làm mờ nó, có ba thiết bị, mỗi thiết bị sẽ kết thúc với tín hiệu ngắt riêng của chúng đến bộ điều khiển ngắt. MSI chỉ đơn giản là một cách báo hiệu ngắt bằng cách sử dụng lớp giao thức PCI Express và tổ hợp gốc PCIe (máy chủ) đảm nhiệm việc ngắt CPU.

Câu trả lời này có thể là quá muộn để giúp bạn, nhưng có lẽ nó sẽ giúp một số Googler / Binger trong tương lai.

Cuối cùng, tôi khuyên bạn nên đọc cuốn sách này từ Intel để có phần giới thiệu chi tiết, tốt về PCIe trước khi bạn tiến xa hơn. Một tài liệu tham khảo khác sẽ là Trình điều khiển thiết bị Linux, một ebook trực tuyến từ LWN .


Bài viết khá hữu ích. Tôi còn rất mới với PCIe, vì quá trình liệt kê sẽ xảy ra (phân bổ và ánh xạ không gian COnfiguration) chúng tôi yêu cầu hỗ trợ trình điều khiển, hoặc nó có thể được bắt đầu bởi Os.
kamlendra

Cảm ơn, rất vui vì nó hữu ích! Nói chung, trên các nền tảng x86, phần mềm BIOS thực hiện một số lượng phân bổ bộ nhớ dựa trên thông tin không gian cấu hình mà nó phân tích cú pháp từ các thiết bị PCI. Các hệ điều hành hiện đại thường chấp nhận bản đồ bộ nhớ này, AFAIK, mặc dù chúng cũng sẽ đi qua và liệt kê các thiết bị để tải các trình điều khiển thích hợp. Tôi nhớ đã thấy một số nội dung cấp thấp thú vị trong Linux có thể cho phép bạn có khả năng thay đổi những gì BIOS đã gán.
Krunal Desai

Lưu ý rằng chỉ bộ nhớ được đánh dấu là có thể tải trước mới có thể chuyển nhiều hơn một DWORD cho mỗi giao dịch; tất cả các không gian khác có thể chuyển chỉ một DWORD duy nhất cho mỗi giao dịch. Kích thước của cụm được giới hạn ở MAX_PAYLOAD_SIZE (được phát hiện trong quá trình liệt kê).
Peter Smith

Xin chào. Tôi chưa quen với PCI và sẽ muốn làm rõ một chút về câu trả lời của bạn. Bạn đã nói rằng không gian cấu hình 256b / 4k được ánh xạ vào bộ nhớ hệ thống. Từ việc tự dạy kèm, tôi nghĩ rằng việc truy cập vào không gian cấu hình được xử lý thông qua bộ điều khiển PCI được ánh xạ tĩnh vào bộ nhớ hệ thống. Bộ điều khiển này cung cấp một vài thanh ghi (để nhận dạng thiết bị / chức năng, bù vào không gian địa chỉ, địa chỉ kết quả) hoạt động như một giao diện nhỏ vào không gian cấu hình. Vì vậy, trong thực tế, chỉ có khoảng 5 - 10 byte được dành riêng cho bộ điều khiển PCI. Thê nay đung không ???
Cerezo

Vì vậy, khi máy chủ (CPU) ghi vào một thanh ghi tại địa chỉ 0x10000004 một giá trị 0xFF, phức hợp gốc PCI sẽ lấy dữ liệu này (có thể nó luôn bỏ phiếu cho dữ liệu tại bất kỳ địa chỉ nào từ 0x10000000 đến 0x10100000) và sẽ ghi nó vào địa chỉ 0x04 tại điểm cuối (thiết bị PCIe)? Sự hiểu biết này có đúng không?
AlphaGoku
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.