Chế độ bảo vệ

Trong máy tính, chế độ bảo vệ, còn được gọi là chế độ địa chỉ ảo được bảo vệ, là một chế độ hoạt động của các đơn vị xử lý trung tâm tương thích x86 (CPU). Nó cho phép phần mềm hệ thống sử dụng các tính năng như bộ nhớ ảo, phân trang và đa tác vụ an toàn được thiết kế để tăng sự kiểm soát của hệ điều hành đối với phần mềm ứng dụng.

Khi một bộ xử lý hỗ trợ chế độ bảo vệ x86 được bật nguồn, nó bắt đầu thực hiện các lệnh trong chế độ thực, để duy trì khả năng tương thích ngược với các bộ xử lý x86 trước đó. Chế độ được bảo vệ chỉ có thể được nhập sau khi phần mềm hệ thống thiết lập một bảng mô tả và cho phép bit Bảo vệ Bật (PE) trong thanh ghi điều khiển 0 (CR0).

Chế độ bảo vệ lần đầu tiên được thêm vào kiến trúc x86 năm 1982, với việc phát hành bộ vi xử lý 80286 (286) của Intel, và sau đó được mở rộng với bản phát hành 80386 (386) vào năm 1985. Do các cải tiến được thêm vào bởi chế độ bảo vệ, nó đã trở thành được chấp nhận rộng rãi và đã trở thành nền tảng cho tất cả các cải tiến tiếp theo đối với kiến trúc x86, mặc dù nhiều cải tiến, như các lệnh bổ sung và thanh ghi mới, cũng mang lại lợi ích cho chế độ thực.

Lịch sử 
Intel 8086, tiền thân của 286, ban đầu được thiết kế với một địa chỉ bus 20 bit cho bộ nhớ của nó. Điều này cho phép bộ vi xử lý truy cập 220 bytes bộ nhớ, tương đương 1 megabyte. Vào thời điểm đó, 1 megabyte được coi là một lượng bộ nhớ tương đối lớn, do đó, các nhà thiết kế của IBM Personal Computer đã dành riêng 640 kilobytes đầu tiên cho các ứng dụng và hệ điều hành và 384 kilobytes còn lại cho BIOS (Basic Input/Output System) và bộ nhớ cho các thiết bị ngoại vi.

Khi chi phí của bộ nhớ giảm và sử dụng bộ nhớ tăng lên, giới hạn 1 MB trở thành một vấn đề đáng kể. Intel dự định để giải quyết hạn chế này cùng với những người khác với việc phát hành 286.

286 

Chế độ bảo vệ ban đầu, được phát hành với 286, không được sử dụng rộng rãi; ví dụ, nó được sử dụng bởi Microsoft Xenix (khoảng năm 1984), Coherent và Minix. Một số thiếu sót như không có khả năng truy cập vào các cuộc gọi BIOS hoặc DOS do không có khả năng chuyển về chế độ thực mà không cần thiết lập lại bộ xử lý đã làm cho nó khó được sử dụng rộng rãi. Thêm vào đó, việc bị cản trở bởi thực tế là chỉ cho phép truy cập bộ nhớ trong các phân đoạn 16 bit thông qua bốn thanh ghi phân đoạn, nghĩa là chỉ có 4*216 bytes, tương đương 256 kilobytes, có thể được truy cập tại một thời điểm. Bởi vì việc thay đổi đăng ký phân đoạn trong chế độ bảo vệ đã khiến bộ mô tả phân đoạn 6 byte được nạp vào CPU từ bộ nhớ, hướng dẫn tải đăng ký phân đoạn mất hàng chục chu trình xử lý, làm cho nó chậm hơn nhiều so với 8086; do đó, chiến lược của phân khúc máy tính địa chỉ nhanh chóng để truy cập các cấu trúc dữ liệu lớn hơn 128 kilobytes (kích thước kết hợp của hai đoạn dữ liệu) trở nên không thực tế, ngay cả đối với vài lập trình viên đã nắm vững nó trên 8086/8088.

286 duy trì khả năng tương thích ngược với tiền thân của nó 8086 bằng cách bước đầu vào chế độ thực khi khởi động. Chế độ thực có chức năng hầu như giống với 8086, cho phép phần lớn các phần mềm 8086 hiện có chạy không được sửa đổi trên 286 mới hơn. Chế độ thực cũng được sử dụng như một chế độ cơ bản hơn trong đó chế độ bảo vệ có thể được thiết lập, giải quyết vấn đề kinh điển gà-và-trứng. Để truy cập chức năng mở rộng của 286, hệ điều hành sẽ thiết lập một số bảng trong bộ nhớ kiểm soát truy cập bộ nhớ trong chế độ bảo vệ, thiết lập địa chỉ của các bảng đó thành một số thanh ghi đặc biệt của bộ xử lý, sau đó đặt bộ xử lý thành chế độ được bảo vệ. Điều này cho phép địa chỉ 24 bit, cho phép bộ xử lý truy cập 2^24 byte bộ nhớ, tương đương với 16 megabytes.

386 

Với việc phát hành 386 vào năm 1985, nhiều vấn đề ngăn cản việc áp dụng rộng rãi chế độ bảo vệ trước đó đã được giải quyết. 386 được phát hành với một kích thước bus địa chỉ 32 bit, cho phép truy cập bộ nhớ 232 bytes bộ nhớ, tương đương 4 gigabytes. Kích thước phân khúc cũng được tăng lên 32 bit, có nghĩa là không gian địa chỉ đầy đủ 4 GB có thể được truy cập mà không cần phải chuyển đổi giữa nhiều phân đoạn. Ngoài việc tăng kích thước của thanh ghi địa chỉ và thanh ghi địa chỉ, nhiều tính năng mới khác được thêm vào với mục đích tăng cường bảo mật và ổn định hoạt động. Chế độ bảo vệ hiện được sử dụng trong hầu hết các hệ điều hành hiện đại chạy trên kiến trúc x86, chẳng hạn như Microsoft Windows, Linux, và nhiều hệ điều hành khác.

Hơn nữa, học hỏi từ những thất bại của chế độ bảo vệ 286 để đáp ứng nhu cầu về DOS đa người dùng, Intel đã thêm một chế độ 8086 ảo riêng biệt, cho phép nhiều bộ vi xử lý ảo hóa 8086 được mô phỏng trên 386. Hỗ trợ phần cứng cần thiết để tự ảo hóa chế độ được bảo vệ, tuy nhiên, phải đợi thêm 20 năm nữa.

Các bổ sung của 386 vào chế độ được bảo vệ 
Với bản phát hành 386, các tính năng bổ sung sau đã được thêm vào chế độ được bảo vệ:

 Phân trang
 Không gian địa chỉ vật lý và ảo 32 bit (Không gian địa chỉ vật lý 32 bit không có trên 80386SX và các biến thể bộ vi xử lý 386 khác sử dụng bus 286 cũ hơn.)
 Địa chỉ đoạn 32 bit
 Khả năng chuyển về chế độ thực mà không cần cài đặt lại
 Chế độ 8086 ảo

Vào và thoát chế độ được bảo vệ 
Cho đến khi phát hành 386, chế độ được bảo vệ không cung cấp phương thức trực tiếp để chuyển về chế độ thực khi chế độ được bảo vệ được nhập vào. IBM đã đưa ra một giải pháp (thực hiện trong IBM AT) có liên quan đến việc thiết lập lại CPU thông qua bộ điều khiển bàn phím và lưu sổ đăng ký hệ thống, ngăn xếp con trỏ và thường là màn chắn ngắt trong RAM của chip đồng hồ thời gian thực. Điều này cho phép BIOS khôi phục CPU về trạng thái tương tự và bắt đầu thực thi mã trước khi reset. Sau đó, một lỗi kép ba được sử dụng để thiết lập lại CPU 286, nhanh hơn và sạch hơn nhiều so với phương pháp điều khiển bàn phím (và không phụ thuộc vào phần cứng tương thích với IBM AT, nhưng sẽ hoạt động trên bất kỳ CPU 80286 nào trong bất kỳ hệ thống nào).

Để vào chế độ được bảo vệ, Bảng mô tả toàn cục (Global Descriptor Table - GDT) đầu tiên phải được tạo với tối thiểu ba mục: một bộ mô tả null, một bộ mô tả đoạn mã và bộ mô tả phân đoạn dữ liệu. Trong một máy tương thích với IBM, dòng A20 (dòng địa chỉ 21) cũng phải được kích hoạt để cho phép sử dụng tất cả các dòng địa chỉ để CPU có thể truy cập vượt quá 1 megabyte bộ nhớ (Chỉ 20 đầu tiên được phép sử dụng sau power-up, để đảm bảo khả năng tương thích với các phần mềm cũ hơn được viết cho các máy tính IBM PC và XT / Intel 8088). Sau khi thực hiện hai bước này, bit PE phải được bật trong thanh ghi CR0 và phải thực hiện bước nhảy xa để xóa hàng đợi nhập sẵn.; set PE bit
mov eax, cr0
or eax, 1
mov cr0, eax

; far jump (cs = selector of code segment)
jmp cs:@pm

@pm:
; Now we are in PM.Với việc giải phóng 386, chế độ bảo vệ có thể được thoát bằng cách tải các thanh ghi phân đoạn với các giá trị chế độ thực, vô hiệu hóa dòng A20 và xóa bit PE trong thanh ghi CR0, mà không cần thực hiện các bước thiết lập ban đầu cần thiết với 286.

Tính năng 
Chế độ được bảo vệ có một số tính năng được thiết kế để nâng cao khả năng kiểm soát của hệ điều hành đối với phần mềm ứng dụng, nhằm tăng tính bảo mật và ổn định của hệ thống. Điều này cho phép hệ điều hành hoạt động theo một cách mà sẽ  khó khăn hơn hẳn hoặc thậm chí không thể nếu không có phần cứng thích hợp hỗ trợ.

Cấp độ đặc quyền 

Trong chế độ được bảo vệ, có bốn cấp độ đặc quyền hoặc các vòng, được đánh số từ 0 đến 3, với vòng 0 là đặc quyền nhất và 3 là ít nhất. Việc sử dụng các vòng cho phép phần mềm hệ thống hạn chế các tác vụ truy cập dữ liệu, gọi các cổng hoặc thực hiện các lệnh đặc quyền. Trong hầu hết các môi trường, hệ điều hành và một số trình điều khiển thiết bị chạy trong vòng 0 và các ứng dụng chạy trong vòng 3.

Chú thích 

Triển khai ngôn ngữ lập trình