Tại sao CPU x86 chỉ sử dụng 2 trong số 4 vòng?


12

Vì vậy, các hệ thống x86 dựa trên Linux hoặc Windows chỉ sử dụng vòng 0 cho chế độ kernel và vòng 3 cho chế độ người dùng. Tại sao các bộ xử lý thậm chí phân biệt bốn vòng khác nhau nếu tất cả cuối cùng chỉ sử dụng hai trong số chúng? Và điều này đã thay đổi trên kiến ​​trúc AMD64?


Nhân tiện, tôi đề nghị thay đổi tiêu đề câu hỏi thành "Tại sao hệ điều hành x86 chỉ sử dụng 2 trong số 4 vòng?" hoặc có thể "Tại sao chỉ có hệ điều hành trên CPU x86 ...". CPU chỉ làm những gì HĐH bảo nó làm.
Jamie Hanrahan

Câu trả lời:


14

Có hai lý do chính.

Lý do đầu tiên là, mặc dù các CPU x86 có bốn vòng bảo vệ bộ nhớ, nhưng mức độ chi tiết của bảo vệ được cung cấp do đó chỉ ở cấp độ trên mỗi phân khúc. Nghĩa là, mỗi phân đoạn có thể được đặt thành một vòng cụ thể ("cấp đặc quyền") từ 0 đến 3, cùng với các biện pháp bảo vệ khác như vô hiệu hóa ghi. Nhưng không có nhiều mô tả phân khúc có sẵn. Hầu hết các hệ điều hành đều muốn có độ chi tiết bảo vệ bộ nhớ tốt hơn nhiều. Giống như ... cho các trang cá nhân.

Vì vậy, nhập bảo vệ dựa trên các mục trong bảng trang (PTEs). Hầu hết nếu không phải tất cả các hệ điều hành x86 hiện đại ít nhiều đều bỏ qua cơ chế phân đoạn (càng nhiều càng tốt) và dựa vào bảo vệ dựa trên PTE. Điều này được xác định bởi các bit cờ là 12 bit thấp hơn trong mỗi PTE - cộng với bit 63 trên các CPU hỗ trợ không thực thi. Có một PTE cho mỗi trang, thường là 4K.

Một trong những bit cờ đó được gọi là bit "đặc quyền". Bit này kiểm soát xem bộ xử lý có phải thuộc một trong các mức "đặc quyền" để truy cập trang hay không. Các mức "đặc quyền" là PL 0, 1 và 2. Nhưng đó chỉ là một bit, do đó, ở cấp độ bảo vệ từng trang, số lượng "chế độ" có sẵn khi có liên quan đến bảo vệ bộ nhớ có thể được truy cập từ chế độ không đặc quyền, hoặc không. Do đó chỉ cần hai vòng.

Để có bốn vòng có thể có cho mỗi trang, họ sẽ phải có hai bit bảo vệ trong mỗi mục nhập bảng trang, để mã hóa một trong bốn số vòng có thể (giống như mô tả phân đoạn). Họ không.

Lý do thứ hai là mục tiêu của tính di động của hệ điều hành. Nó không chỉ là về x86; Unix đã dạy chúng tôi rằng một hệ điều hành có thể tương đối di động với nhiều kiến ​​trúc bộ xử lý và đó là một điều tốt. Và một số bộ xử lý chỉ hỗ trợ hai vòng. Bởi không phụ thuộc vào nhiều vòng trong kiến ​​trúc, những người triển khai HĐH đã làm cho các HĐH trở nên linh hoạt hơn.

Có một lý do thứ ba đó là đặc trưng cho sự phát triển của Windows NT. Các nhà thiết kế của NT (David Cutler và nhóm của anh ấy, người mà Microsoft đã thuê từ DEC Western Region Labs) đã có nhiều kinh nghiệm trước đây về VMS; thực tế, Cutler và một vài người khác là một trong những nhà thiết kế ban đầu của VMS. Và bộ xử lý VAX mà VMS được thiết kế (và ngược lại) có bốn vòng. VMS sử dụng bốn vòng. (Trên thực tế, VAX có bốn bit bảo vệ trong PTE, cho phép các kết hợp như "chỉ đọc từ chế độ người dùng, nhưng có thể ghi từ vòng 2 và bên trong." Nhưng tôi lạc đề.)

Nhưng các thành phần chạy trong vòng 1 và 2 của VMS (Dịch vụ quản lý hồ sơ và CLI, tương ứng) đã bị loại khỏi thiết kế NT. Vòng 2 trong VMS thực sự không phải là về bảo mật hệ điều hành mà là bảo vệ môi trường CLI của người dùng từ chương trình này sang chương trình tiếp theo và Windows NT không có khái niệm đó; CLI chạy như một quy trình thông thường. Đối với vòng 1 của VMS, mã RMS ở vòng 1 phải gọi vào vòng 0 khá thường xuyên và chuyển đổi vòng rất tốn kém. Hóa ra là hiệu quả hơn nhiều khi chỉ đi đến vòng 0 và được thực hiện với nó chứ không phải có nhiều chuyển đổi vòng 0 trong mã vòng 1. (Một lần nữa - không phải là NT có bất cứ thứ gì như RMS.)

Nhưng tại sao họ lại ở đó? Về lý do tại sao x86 triển khai bốn vòng trong khi các HĐH không sử dụng chúng - bạn đang nói về các HĐH có thiết kế gần đây hơn x86. Rất nhiều tính năng "lập trình hệ thống" của x86 đã được thiết kế từ lâu trước khi các hạt nhân Unix hoặc ish thực sự được triển khai trên nó và họ không thực sự biết HĐH sẽ sử dụng cái gì. (Đó là cho đến khi chúng tôi phân trang trên x86 - không xuất hiện cho đến năm 80386 - rằng chúng tôi có thể triển khai các nhân giống như Unix-ish hoặc VMS thực sự mà không cần xem xét lại việc quản lý bộ nhớ từ đầu.)

Các hệ điều hành x86 hiện đại không chỉ bỏ qua phân đoạn (họ chỉ thiết lập các phân đoạn C, D và S với địa chỉ cơ sở 0 và kích thước 4 GB; phân đoạn F và G đôi khi được sử dụng để trỏ đến các cấu trúc dữ liệu chính của hệ điều hành) phần lớn bỏ qua những thứ như "phân đoạn trạng thái nhiệm vụ". Cơ chế TSS được thiết kế rõ ràng để chuyển đổi ngữ cảnh luồng nhưng hóa ra có quá nhiều tác dụng phụ, vì vậy các hệ điều hành x86 hiện đại thực hiện "bằng tay". Ví dụ, lần duy nhất x86 NT thay đổi các tác vụ phần cứng là đối với một số điều kiện thực sự đặc biệt, như ngoại lệ lỗi kép.

Re x64, rất nhiều tính năng không sử dụng đã bị bỏ lại. . được gọi là hình thức tiền đình, chuyển đổi trạng thái nhiệm vụ không tồn tại, vv Và các hệ điều hành tiếp tục sử dụng chỉ hai vòng.


1
Cảm ơn! (Nếu bạn không thể nói, tôi đã dành hơn một chút thời gian xung quanh nhân VMS ...)
Jamie Hanrahan

Vâng, tôi có ấn tượng này ... :-) Tôi thích khi một người như bạn có kiến ​​thức sâu sắc về điều gì đó viết loại câu trả lời này, đó là lịch sử của CNTT và tôi thích biết điều đó. Câu trả lời của bạn đã nhớ đến tôi khi tôi còn là một chàng trai ở trường, 20 năm trước và tôi đã mua "Hướng dẫn tham khảo lập trình viên Intel 80268" và sau đó là hướng dẫn tham khảo 386. Tôi đã đọc rất nhiều về các vòng bảo vệ ... nhưng thực sự chưa bao giờ làm gì với chúng. Chỉ cần một số lập trình trình biên dịch x86 đơn giản ... rồi Turbo Pascal, rồi C / C ++, Java ... và cuối cùng .Net trong 13 năm qua :-)
Max
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.