Khi tìm hiểu thêm về cách hệ điều hành và phần cứng chúng chạy hoạt động và tương tác với nhau, bạn có thể ngạc nhiên khi thấy những gì có vẻ kỳ quặc hoặc sử dụng kém "tài nguyên" đang xảy ra. Tại sao vậy? Bài đăng Hỏi và Đáp của SuperUser hôm nay có câu trả lời cho câu hỏi tò mò của một độc giả.
Phiên Hỏi & Đáp hôm nay đến với chúng tôi với sự hỗ trợ của SuperUser — một phần của Stack Exchange, một nhóm các trang web Hỏi & Đáp do cộng đồng điều hành.
Ảnh lịch sự của Lemsipmatt (Flickr) .
Câu hỏi
Trình đọc SuperUser AdHominem muốn biết lý do tại sao CPU x86 chỉ sử dụng hai trong số bốn vòng:
Hệ thống x86 dựa trên Linux và Windows chỉ sử dụng Đổ chuông 0 cho chế độ hạt nhân và Vòng 3 cho chế độ người dùng. Tại sao các bộ xử lý thậm chí còn phân biệt được bốn vòng khác nhau nếu tất cả chúng đều chỉ sử dụng hai trong số chúng? Điều này có thay đổi với kiến trúc AMD64 không?
Tại sao CPU x86 chỉ sử dụng hai trong số bốn vòng?
Câu trả lời
Cộng tác viên SuperUser Jamie Hanrahan có câu trả lời cho chúng tôi:
Có hai lý do chính.
Đầu tiên là, mặc dù các CPU x86 cung cấp 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ỉ ở mức mỗi phân đoạn. Có nghĩa là, mỗi phân đoạn có thể được đặt thành một vòng cụ thể (mức đặc quyền) cùng với các biện pháp bảo vệ khác như ngăn ghi. Nhưng không có nhiều bộ mô tả phân đoạn có sẵn. Hầu hết các hệ điều hành đều muốn có mức độ bảo vệ bộ nhớ tốt hơn nhiều, chẳng hạn như… cho các trang riêng lẻ.
Vì vậy, hãy nhập bảo vệ dựa trên bảng trang. Hầu hết, nếu không phải là tất cả, các hệ điều hành x86 hiện đại ít nhiều bỏ qua cơ chế phân đoạn (càng nhiều càng tốt) và dựa vào sự bảo vệ có sẵn từ các bit bậc thấp trong các mục nhập bảng trang. Một trong số này được gọi là bit “đặc quyền”. Bit này kiểm soát việc bộ xử lý có phải ở một trong các mức “đặc quyền” để truy cập trang hay không. Các cấp độ "đặc quyền" là PL 0, 1 và 2 . Nhưng nó chỉ là một bit, vì vậy ở cấp độ bảo vệ từng trang, số lượng “chế độ” khả dụng liên quan đến bảo vệ bộ nhớ chỉ là hai: Có thể truy cập trang từ chế độ không đặc quyền hoặc không. Do đó, chỉ có hai chiếc nhẫn. Để có bốn vòng có thể có cho mỗi trang, chúng 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ể có (giống như các bộ mô tả phân đoạn). Tuy nhiên, họ không.
Lý do khác là mong muốn về tính di động của hệ điều hành. Nó không chỉ là về x86; Unix đã dạy chúng ta 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ằng cách không phụ thuộc vào nhiều vòng trong kiến trúc, những người triển khai hệ điều hành đã làm cho hệ điều hành trở nên linh hoạt hơn.
Có một lý do thứ ba dành riêng cho sự phát triển Windows NT. Các nhà thiết kế của NT (David Cutler và nhóm của anh ấy, những người được Microsoft thuê từ DEC Western Region Labs) đã có nhiều kinh nghiệm trước đây về VMS; trên thực tế, Cutler và một số người khác là những nhà thiết kế ban đầu của VMS. Và bộ xử lý VAX mà VMS được thiết kế có bốn vòng (VMS sử dụng bốn vòng).
Nhưng các thành phần chạy trong VMS’s Nhẫn 1 và 2 (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 không thực sự là về bảo mật hệ điều hành, mà là về việc duy trì 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 không có khái niệm đó; CLI chạy như một quy trình bình thường. Đối với VMS’s Vòng 1 , mã RMS trong Vòng 1 đã phải gọi vào Đổ chuông 0 khá thường xuyên, và việc chuyển đổi vòng là tốn kém. Hóa ra sẽ hiệu quả hơn nhiều nếu chỉ đi đến Đổ chuông 0 và được thực hiện với nó hơn là có nhiều Đổ chuông 0 chuyển tiếp trong Vòng 1 mã (một lần nữa, không phải NT có bất cứ điều gì giống như RMS dù sao).
Về lý do tại sao x86 thực hiện bốn vòng trong khi hệ điều hành không sử dụng chúng, bạn đang nói về hệ điều hành 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ừ rất lâu trước khi các hạt nhân NT hoặc Unix-ish thực sự được triển khai trên nó, và họ không thực sự biết hệ điều hành sẽ sử dụng những gì. Chỉ cho đến khi chúng tôi phân trang trên x86, chúng tôi mới có thể triển khai các hạt nhân giống Unix-ish hoặc VMS thực sự.
Các hệ điều hành x86 hiện đại không chỉ bỏ qua việc phân đoạn (chúng chỉ thiết lập các phân đoạn C, D và S với địa chỉ cơ sở là 0 và kích thước là 4 GB; các 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 ), họ cũng phần lớn bỏ qua những thứ như "phân đoạn trạng thái nhiệm vụ". Cơ chế TSS rõ ràng được thiết kế để chuyển đổi ngữ cảnh luồng, nhưng hóa ra nó có quá nhiều tác dụng phụ, vì vậy các hệ điều hành x86 hiện đại làm điều đó “bằng tay”. 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, chẳng hạn như ngoại lệ lỗi kép.
Về kiến trúc x64, rất nhiều tính năng không được sử dụng đã bị loại bỏ. Để ghi nhận công lao của họ, AMD đã thực sự nói chuyện với các nhóm nhân hệ điều hành và hỏi họ cần gì từ x86, họ không cần hoặc không muốn điều gì và họ muốn thêm gì. Các phân đoạn trên x64 chỉ tồn tại ở dạng có thể được gọi là dạng tiền nghiệm, chuyển đổi trạng thái tác vụ không tồn tại, v.v. và hệ điều hành tiếp tục chỉ sử dụng hai vòng.
Có điều gì đó để thêm vào lời giải thích? Tắt âm thanh trong các ý kiến. Bạn muốn đọc thêm câu trả lời từ những người dùng Stack Exchange am hiểu công nghệ khác? Kiểm tra toàn bộ chuỗi thảo luận tại đây .