Chế độ bảo vệ

Bách khoa toàn thư mở Wikipedia

Trong máy tính, chế độ bảo vệ, còn được gọi là chế độ địa chỉ ảo được bảo vệ,[1] 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.[2][3]

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 đó.[4] 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).[5]

Chế độ bảo vệ lần đầu tiên được thêm vào kiến trúc x86 năm 1982,[6] 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.[7] 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,[8] 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ử[sửa | sửa mã nguồn]

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ó.[9] Điều này cho phép bộ vi xử lý truy cập 220 bytes bộ nhớ, tương đương 1 megabyte[9]. Vào thời điểm đó, 1 megabyte được coi là một lượng bộ nhớ tương đối lớn,[10] 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.[11]

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.[11]

286[sửa | sửa mã nguồn]

Chế độ bảo vệ ban đầu, được phát hành với 286, không được sử dụng rộng rãi[11]; ví dụ, nó được sử dụng bởi Microsoft Xenix (khoảng năm 1984),[12] Coherent[13] và Minix.[14] 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.[15] 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[11]. 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[4]. 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.[9]

386[sửa | sửa mã nguồn]

Một bộ vi xử lý Intel 80386 

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.[16] 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[16]. 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.[17] 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.[18]

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,[19] 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.[20]

Các bổ sung của 386 vào chế độ được bảo vệ[sửa | sửa mã nguồn]

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ệ:[2]

  • 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.[21])
  • Đị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ệ[sửa | sửa mã nguồn]

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.[cần giải thích] 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[sửa | sửa mã nguồn]

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ợ.[22]

Cấp độ đặc quyền[sửa | sửa mã nguồn]

Ví dụ về việc sử dụng vòng đặc quyền trong một hệ điều hành sử dụng tất cả các vòng

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.[23] 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.[23]

Chú thích[sửa | sửa mã nguồn]

  1. ^ “Memory access control method and system for realizing the same”. US Patent 5483646. ngày 23 tháng 5 năm 1995. Bản gốc (Patent) lưu trữ ngày 26 tháng 9 năm 2007. Truy cập ngày 14 tháng 7 năm 2007. The memory access control system according to claim 4, wherein said first address mode is a real address mode, and said second address mode is a protected virtual address mode.
  2. ^ a b “2.1.3 The Intel 386 Processor (1985)”. Intel 64 and IA-32 Architectures Software Developer's Manual. Denver, Colorado: Intel. tháng 5 năm 2007. tr. 35.
  3. ^ root (ngày 14 tháng 7 năm 2007). “Guide: What does protected mode mean?” (Guide). Delorie Software. Truy cập ngày 14 tháng 7 năm 2007. The purpose of protected mode is not to protect your program. The purpose is to protect everyone else (including the operating system) from your program.
  4. ^ a b “3.2 Modes of Operation”. Intel 65 and IA-32 Architectures Software Developer's Manual. Denver, Colorado: Intel. tháng 5 năm 2005. tr. 59.
  5. ^ Collins, Robert (2007). “Protected Mode Basics” (PDF). ftp.utcluj.ro. Bản gốc (PDF) lưu trữ ngày 7 tháng 7 năm 2011. Truy cập ngày 31 tháng 7 năm 2009.
  6. ^ “2.1.2 The Intel 286 Processor (1982)”. Intel 64 and IA-32 Architectures Software Developer's Manual. Denver, Colorado: Intel. tháng 5 năm 2007. tr. 34.
  7. ^ “Intel Global Citizenship Report 2003”. Bản gốc (Timeline) lưu trữ ngày 22 tháng 3 năm 2008. Truy cập ngày 14 tháng 7 năm 2007. 1985 Intel launches Intel386 processor
  8. ^ “2.1 Brief History of the IA-32 Architecture”. Intel 64 and IA-32 Architectures Software Developer's Manual. Denver, Colorado: Intel. tháng 5 năm 2007. tr. 31.
  9. ^ a b c “A+ - Hardware” (Tutorial/Guide). PC Microprocessor Developments and Features Tutorials. BrainBell.com. Truy cập ngày 24 tháng 7 năm 2007.
  10. ^ Risley, David (ngày 23 tháng 3 năm 2001). “A CPU History”. PCMechanic. Bản gốc (Article) lưu trữ ngày 29 tháng 8 năm 2008. Truy cập ngày 24 tháng 7 năm 2007. What is interesting is that the designers of the time never suspected anyone would ever need more than 1 MB of RAM.
  11. ^ a b c d Kaplan, Yariv (1997). “Introduction to Protected-Mode”. Internals.com. Bản gốc (Article) lưu trữ ngày 22 tháng 6 năm 2007. Truy cập ngày 24 tháng 7 năm 2007.
  12. ^ “Microsoft XENIX 286 Press Release” (PDF) (Thông cáo báo chí). Microsoft. Bản gốc (PDF) lưu trữ ngày 21 tháng 10 năm 2014. Truy cập ngày 21 tháng 5 năm 2018.
  13. ^ “General Information FAQ for the Coherent Operating System”. ngày 23 tháng 1 năm 1993.
  14. ^ “MINIX Information Sheet”. Bản gốc lưu trữ ngày 7 tháng 1 năm 2014.
  15. ^ Mueller, Scott (ngày 24 tháng 3 năm 2006). “P2 (286) Second-Generation Processors”. Upgrading and Repairing PCs, 17th Edition (Book) (ấn bản 17). Que. ISBN 0-7897-3404-4. Truy cập ngày 11 tháng 7 năm 2017.
  16. ^ a b “2.1 Memory Organization and Segmentation”. 80386 Programmer's Reference Manual (PDF). Santa Clara, CA: Intel. 1986.[liên kết hỏng]
  17. ^ “3.1 Modes of Operation”. Intel 64 and IA-32 Architectures Software Developer's Manual. Denver, Colorado: Intel. tháng 5 năm 2007. tr. 55.
  18. ^ Hyde, Randall (tháng 11 năm 2004). “12.10. Protected Mode Operation and Device Drivers”. Write Great Code. O'Reilly. ISBN 1-59327-003-8.[liên kết hỏng]
  19. ^ Charles Petzold, Intel's 32-bit Wonder: The 80386 Microprocessor, PC Magazine, ngày 25 tháng 11 năm 1986, pp. 150-152
  20. ^ Tom Yager (ngày 6 tháng 11 năm 2004). “Sending software to do hardware's job”. InfoWorld. Truy cập ngày 24 tháng 11 năm 2014.
  21. ^ Shvets, Gennadiy (ngày 3 tháng 6 năm 2007). “Intel 80386 processor family” (Article). Truy cập ngày 24 tháng 7 năm 2007. 80386SX — low cost version of the 80386. This processor had 16 bit external data bus and 24-bit external address bus.
  22. ^ “7 Multitasking”. Intel 80386 Programmer's Reference Manual 1986 (Manual) |format= cần |url= (trợ giúp). Santa Clara, CA: Intel. 1986.
  23. ^ a b “6.3.5 Calls to Other Privilege Levels”. Intel 64 and IA-32 Architectures Software Developer's Manual. Denver, Colorado: Intel. tháng 5 năm 2007. tr. 162.