2012-12-03 29 views
5

Tôi làm việc với bo mạch PCIe yêu cầu kích thước tải trọng TLP 256 byte. Tôi có CPU hỗ trợ (Core i7-3930K) và bo mạch chủ Intel, DX79SR không cung cấp cài đặt kích thước tải trọng TLP trong BIOS. Theo mặc định, có tối đa 128 byte TLP tải trọng và tôi cần thay đổi nó thành 256 byte, không có BIOS. Tôi tìm thấy phần mềm PCIUtils hiển thị giá trị này trong Windows nhưng đó là một phần mềm di động đa mục đích và nó quá phức tạp để tìm thấy những gì tôi cần.Cách dễ dàng để truy cập sổ đăng ký I/O CPU Intel trong Windows

Tài liệu Intel describe what values Tôi cần đặt trong thanh ghi I/O CPU và có another document cho biết vị trí I/O là C8Fh và CFCh.

Đây là nơi tôi bị kẹt, tôi không biết bắt đầu từ đâu nếu tôi muốn đặt để đặt các thanh ghi này. Tôi là một nhà phát triển Windows S/W có kinh nghiệm nhưng tôi chưa bao giờ xử lý các trình điều khiển. Tôi có mã nguồn cho các trình điều khiển của bo mạch PCIe này mà tôi có thể sửa đổi, xây dựng và chạy nhưng tôi không biết cách ghi dữ liệu vào thanh ghi I/O của CPU Intel. Tôi đã thấy rằng các hàm _outp() không hoạt động trong chế độ người dùng.

Hãy chỉ cho tôi nơi bắt đầu, hoặc từ thực thi (dễ dàng hơn) hoặc trình điều khiển. Tôi nghĩ tất cả những gì tôi cần làm là đọc/ghi từ các cổng I/O C8Fh và CFCh, nếu tôi không nhầm. Đó là Windows XP 32 bit bây giờ, Win7 x64 sẽ sau này, Visual Studio 2010 C++ hoặc WDK.

Trả lời

2

Về cơ bản những gì bạn phải làm là sử dụng out, tương ứng in x86 hướng dẫn asm. Vấn đề là ở chế độ được bảo vệ, hai hướng dẫn này bị khóa để bạn không thể sử dụng chúng trong chế độ userland.

Nơi tốt nhất để bắt đầu là lấy WDK (bộ điều khiển cửa sổ) và xem các mẫu của chúng (bạn chỉ cần trình điều khiển phần mềm cho việc này). Nếu trình điều khiển cho bo mạch PCI là trình điều khiển chế độ lõi mặc dù bạn chỉ có thể thêm các cuộc gọi vào chức năng DriverEntry và được thực hiện với nó.

Nếu đó không phải là một tùy chọn, bạn sẽ phải xây dựng trình điều khiển chế độ lõi phần mềm của riêng bạn - here là một số mã mẫu đơn giản với các hướng dẫn về cách xây dựng và triển khai. Mã thực tế không đáng kể, vì bạn chỉ muốn thực hiện một số lệnh trong chế độ lõi.

+0

Cảm ơn. Tôi có WDK và tôi có thể biên dịch các trình điều khiển cho hội đồng này, mà sau đó hoạt động. Tôi chắc chắn có thể thấy mục nhập trình điều khiển nhưng tôi không thể biết liệu trình điều khiển có hoạt động ở chế độ hạt nhân hay chế độ người dùng hay không. Tôi không quen với tài xế. Vì vậy, bạn đang nói rằng trong chức năng chính của trình điều khiển, được gọi khi tải trình điều khiển, tôi có thể thử _inp(), đặt bit của tôi và sau đó chỉ _outp (0xC8F. Mydata) trong đó 0xC8F là vị trí từ tài liệu của Intel, phải không? – user1871691

+0

@ user1871691 Khá nhiều. Nếu mã của bạn có phương thức 'DriverEntry', nó sử dụng KMDF, phương thức này được gọi khác nhau cho trình điều khiển chế độ người dùng afaik (không bao giờ được sử dụng). Nên khá thẳng về phía trước để cập nhật mã. – Voo

+0

Cảm ơn rất nhiều. Điều đó hiệu quả. Tôi đặt 4 dòng như thế trong DriverEntry: _outpd (0xCF8, 0x80000098); Bí quyết duy nhất là tôi phải đặt thanh ghi cho hai thiết bị. Khe PCIe của tôi có địa chỉ Bus: 0 Device: 1 Function: 0, nhưng tôi cũng phải đặt kích thước TLP cho Bus: 0 Device: 0 Function: 0 (một số thiết bị chung, tôi đoán) – user1871691