Điều gì thực sự xảy ra trên phần cứng PC hiện đại đã khởi động ở chế độ MBR BIOS 16 bit khi bạn lưu trữ một byte như '1'
(0x31) vào bộ đệm khung văn bản VGA (chế độ 03) tại địa chỉ tuyến tính vật lý B8000
? Làm thế nào chậm là một mov [es:di], eax
cửa hàng với MTRR cho khu vực đó được đặt thành UC? ( Experimental thử nghiệm trên một máy tính xách tay Kaby Hồ iGPU chỉ ra rằng clflushopt vào WC là xấp xỉ tốc độ tương tự như UC cho bộ nhớ VGA. Nhưng mà không clflushopt, mov
cửa hàng để nhớ WC không bao giờ rời khỏi CPU và không cập nhật màn hình ở tất cả, chạy siêu nhanh .)
Nếu đó không phải là SMI cho mọi cửa hàng, có cách nào để ước tính chi phí này trên một phần bộ nhớ WB trong không gian người dùng, cho các thử nghiệm hiệu suất mà không thực sự khởi động lại vào chế độ thực không? (ví dụ: sử dụng trang BSS làm bộ đệm khung giả vờ không thực sự hiển thị ở bất cứ đâu).
Glyph phông chữ tương ứng xuất hiện trên màn hình trong lần làm mới tiếp theo, nhưng liệu quét phần cứng có thực sự đọc được ASCII char từ VRAM (hoặc DRAM cho iGPU) và ánh xạ sang glyphs phông chữ bitmap không? Hoặc có một số phần mềm chặn trên mỗi cửa hàng hoặc một lần cho mỗi vblank để phần cứng thực sự chỉ phải xử lý bộ đệm khung bitmap?
Khởi động BIOS kế thừa được biết đến là sử dụng Chế độ quản lý hệ thống (SMM) để mô phỏng USB kbd / mouse dưới dạng thiết bị PS / 2. Tôi tự hỏi nếu nó cũng được sử dụng cho bộ đệm khung chế độ văn bản VGA. Tôi giả sử nó được sử dụng cho các cổng I / O VGA để cài đặt chế độ nhưng thật hợp lý khi bộ đệm khung văn bản có thể được hỗ trợ bởi phần cứng. Tuy nhiên, hầu hết các máy tính dành toàn bộ thời gian của chúng ở chế độ đồ họa, do đó, việc bỏ hỗ trợ CTNH cho chế độ văn bản có vẻ như là điều mà các nhà cung cấp có thể muốn làm. (OTOH blog này gợi ý rằng bộ điều khiển VGA vereb homebrew có thể thực hiện chế độ văn bản khá đơn giản.)
Tôi đặc biệt quan tâm đến các hệ thống sử dụng iGPU trong Intel Skylake, nhưng sẽ quan tâm đến các iGPU trước / sau của Intel và AMD, và các GPU rời mới hoặc cũ.
. có thể làm cho các cửa hàng chỉ là một giao dịch PCI thay vì SMI.)
Máy tính để bàn của riêng tôi là i7-6700k trong mobo Asus Z170 Pro Gaming, không có thẻ bổ trợ chỉ iGPU với màn hình 1920x1200 trên đầu ra DVI-D. Tôi không biết chi tiết về hệ thống Kaby Lake i5-7300HQ @Eldan đang thử nghiệm, chỉ có mô hình CPU.
Tôi đã tìm thấy bằng sáng chế US20120159520 của Phoenix BIOS từ năm 2011 ,
mô phỏng video kế thừa bằng uefi . Thay vì yêu cầu các nhà cung cấp phần cứng video cung cấp cả trình điều khiển ROM tùy chọn chế độ thực 16 bit và UEFI , họ đề xuất trình điều khiển VGA chế độ thực ( int 10h
chức năng, v.v.) gọi trình điều khiển video UEFI do nhà cung cấp cung cấp thông qua các móc SMM.
Tóm tắt
[...] ROM tùy chọn video chung ROM thông báo cho trình điều khiển SMM video chung về yêu cầu dịch vụ video. Thông báo như vậy có thể được thực hiện bằng cách sử dụng ngắt quản lý hệ thống phần mềm (SMI). Sau khi thông báo, trình điều khiển SMM video chung thông báo cho trình điều khiển video UEFI của bên thứ ba về yêu cầu dịch vụ video. Trình điều khiển video của bên thứ ba cung cấp các dịch vụ video được yêu cầu cho hệ điều hành. Theo cách này, trình điều khiển đồ họa UEFI của bên thứ ba có thể hỗ trợ nhiều hệ điều hành khác nhau, ngay cả những trình điều khiển không hỗ trợ các giao thức hiển thị UEFI.
Phần lớn mô tả bao gồm xử lý int 10h
các cuộc gọi và những thứ tương tự như đã rõ ràng bẫy IVT, do đó có thể dễ dàng chạy mã tùy chỉnh kích hoạt SMI trên mục đích. Phần có liên quan là những gì họ mô tả cho các cửa hàng trực tiếp vào bộ đệm khung chế độ văn bản cần hoạt động ngay cả đối với mã không kích hoạt bất kỳ ngắt phần mềm hoặc phần cứng nào. (Khác với CTNH kích hoạt SMI trên các cửa hàng như vậy, họ nói rằng họ có thể sử dụng nếu được hỗ trợ.)
Hỗ trợ bộ đệm văn bản
[0066] Trong các phương án nhất định, các ứng dụng có thể thao tác trực tiếp bộ đệm văn bản của VGA . Trong một phương án như vậy, trình điều khiển SMM video chung 130 hỗ trợ điều này theo một trong hai cách, tùy thuộc vào việc phần cứng có cung cấp bẫy SMI khi truy cập đọc / ghi vào vùng nhớ 740 KB-768 KB (nơi đặt bộ đệm văn bản) hay không.
[0067] Khi bẫy SMI khả dụng, phần cứng sẽ tạo SMI trên mỗi lần truy cập đọc hoặc ghi. Sử dụng địa chỉ bẫy của bẫy SMI, cột và hàng văn bản chính xác có thể được tính và hàng và cột tương ứng trong màn hình văn bản ảo được truy cập.
Cách khác, bộ nhớ bình thường được bật cho vùng này và, bằng cách sử dụng SMI, trình điều khiển SMM video chung định kỳ 130 để quét các thay đổi trong bộ đệm văn bản phần cứng mô phỏng và cập nhật màn hình văn bản ảo tương ứng được duy trì bởi trình điều khiển video. Trong cả hai trường hợp, khi phát hiện thay đổi, ký tự được vẽ lại trên màn hình văn bản ảo.
Đây chỉ là một bằng sáng chế của nhà cung cấp BIOS và không cho chúng tôi biết phần lớn phần cứng thực sự hoạt động như thế nào, hoặc nếu các nhà cung cấp khác làm những việc khác nhau. Về cơ bản, nó xác nhận rằng một số phần cứng tồn tại có thể bẫy trên các cửa hàng trong phạm vi đó. (Trừ khi đó chỉ là một khả năng giả định mà họ quyết định đưa vào bằng sáng chế của họ.)
Đối với trường hợp sử dụng mà tôi có, bẫy chỉ khi làm mới màn hình sẽ nhanh hơn rất nhiều so với bẫy trên mọi cửa hàng nên tôi tò mò phần cứng / phần sụn nào hoạt động theo cách nào.
Động lực cho câu hỏi này
Tối ưu hóa bộ đếm thập phân ASCII tăng dần trong RAM video trên Intel Core thế hệ thứ 7 - liên tục lưu trữ các chữ số mới cho bộ đếm văn bản ASCII vào cùng một vài byte RAM video.
Tôi đã thử nghiệm phiên bản mã trong không gian người dùng 32 bit trong Linux, trên bộ nhớ WB, hy vọng sẽ tính gần đúng tình huống movnti
và các cách khác nhau để CPU đồng bộ hóa bộ đệm WC của nó với RAM video sau mỗi cửa hàng (hoặc có thể thỉnh thoảng trong một ngắt hẹn giờ). Nhưng điều này không thực tế nếu tình huống bộ tải khởi động ở chế độ thực không chỉ lưu trữ vào DRAM, mà thay vào đó kích hoạt SMI.
Trên bộ nhớ WB, movnti
các cửa hàng xả bằng một lock xor byte [esp], 0
phần nhanh hơn so với xả bằng clflushopt
. Nhưng @Eldan báo cáo không cải thiện tốc độ cho những người có bộ nhớ VGA sau khi lập trình MTRR để biến nó thành WC. (Và tốc độ tương tự như đối với bản gốc làm cửa hàng bình thường, chỉ ra rằng theo mặc định framebuffer VGA là UC. Một số BIOS cũ đã có một tùy chọn để làm cho bộ nhớ VGA WC , mà họ gọi là USWC = Uncached Viết đầu cơ kết hợp.)
Đây không phải là vấn đề trong thế giới thực nên tôi không tìm cách giải quyết thực tế ; mặc dù sẽ rất thú vị nếu biết việc lưu trữ thủ công byte pixel vào chế độ đồ họa VGA có thể nhanh hơn nhiều hay không.
Tóm lược
- Có bất kỳ / tất cả các hệ thống hiện đại thực sự kích hoạt SMI trên mỗi cửa hàng cho bộ đệm khung chế độ văn bản không?
- Nếu không, chúng ta có thể tính gần đúng một cửa hàng WC + clflush cho bộ đệm khung, bằng cách sử dụng một cuộn giấy + thứ gì đó trong không gian người dùng trên bộ nhớ WB không? Vì vậy, chúng ta có thể dễ dàng hồ sơ với
perf
các quầy hiệu suất. - Nếu các BIOS và / hoặc phần cứng khác nhau sử dụng các chiến lược khác nhau, các chiến lược đó là gì? (Tôi không muốn biết chi tiết, chỉ là một mức độ cao như "SMI mỗi vblank để đồng bộ bộ đệm khung VGA với bộ đệm khung phần cứng thực tế")
- Liệu một thẻ video PCIe hoặc PCI với mã văn bản VGA phần cứng sẽ nhanh hơn bất kỳ GPU tích hợp nào thực sự làm gì? Tôi đoán một giao dịch ghi PCIe thực tế sẽ chậm hơn so với việc chờ đợi một cửa hàng đạt DRAM, nhưng việc ghi PCIe sẽ rẻ hơn SMI trên mỗi cửa hàng. Một sân bóng / thứ tự so sánh cường độ sẽ rất thú vị.
Những câu hỏi này đều có liên quan cao, nhưng tôi có thể chia nhỏ câu hỏi này nếu không có nhiều sự trùng lặp như tôi mong đợi.
perf
vì Linux chưa được khởi động. Đánh giá độ trễ SMI (Ngắt quản lý hệ thống) trên máy Linux-CentOS / Intel có một số chi tiết về cách bạn có thể đếm SMI.
MSR_SMI_COUNT=0x34
không phải lập trình bộ đếm trước.