Chế độ thực

Chế độ thực, cũng được gọi là chế độ địa chỉ thực, là một chế độ hoạt động của tất cả các CPU tương thích x86. Chế độ thực được đặc trưng bởi không gian địa chỉ bộ nhớ phân đoạn 20 bit (cung cấp chính xác 1 MB bộ nhớ địa chỉ) và truy cập phần mềm trực tiếp không giới hạn vào tất cả bộ nhớ địa chỉ, địa chỉ I/O và phần cứng ngoại vi. Chế độ thực không cung cấp hỗ trợ cho mức độ bảo vệ bộ nhớ, đa nhiệm hoặc mức đặc quyền. Trước khi phát hành 80286, giới thiệu chế độ được bảo vệ, chế độ thực là chế độ duy nhất có sẵn cho CPU x86; và để duy trì khả năng tương thích ngược, tất cả CPU x86 bắt đầu ở chế độ thực khi đặt lại, mặc dù có thể mô phỏng chế độ thực trên các hệ thống khác khi bắt đầu trên các chế độ khác. Kiến trúc 286 đã giới thiệu chế độ bảo vệ, cho phép bảo vệ bộ nhớ ở mức phần cứng. Tuy nhiên, việc sử dụng các tính năng mới này yêu cầu một hệ điều hành mới được thiết kế đặc biệt cho chế độ được bảo vệ. Vì đặc điểm kỹ thuật thiết kế chính của bộ vi xử lý x86 là chúng hoàn toàn tương thích ngược với phần mềm được viết cho tất cả các chip x86 trước chúng, chip 286 được tạo ra để bắt đầu trong 'chế độ thực' - tức là, ở chế độ mà tắt các tính năng bảo vệ bộ nhớ mới Tính năng bảo vệ, để nó có thể chạy hệ điều hành được viết cho 8086 và 80186. Tính đến năm 2016, ngay cả những CPU x86 mới nhất (bao gồm CPU x86-64) bắt đầu ở chế độ thực ở chế độ bật nguồn và có thể chạy phần mềm được viết cho hầu như bất kỳ chip x86 trước đó. BIOS PC mà IBM giới thiệu hoạt động ở chế độ thực, cũng như các hệ điều hành DOS(MS-DOS, DR-DOS, v.v...) Các phiên bản đầu tiên của Microsoft Windows chạy ở chế độ thực. Windows/386 có thể thực hiện một số chế độ được bảo vệ, và điều này được thực hiện đầy đủ hơn trong Windows 3.0, có thể chạy ở chế độ thực hoặc sử dụng chế độ được bảo vệ theo cách của Windows / 386. Windows 3.0 thực sự có một số chế độ: "chế độ thực", "chế độ chuẩn" và "chế độ tăng cường 386", sau này yêu cầu một số tính năng ảo hóa của bộ vi xử lý 80386, và do đó sẽ không chạy trên 80286 cho chế độ thực, và nó là môi trường hoạt động chính thống đầu tiên đòi hỏi ít nhất một bộ xử lý 80286. Kiến trúc Windows 95 là sự phát triển của "chế độ 386 nâng cao" của Windows for Workgroups. Không có phiên bản nào trong số này có thể được coi là hệ điều hành x86 hiện đại, vì chúng chỉ chuyển sang chế độ bảo vệ cho một số chức năng nhất định. (Unix, Linux, OS/2, Windows NT 3.x và mới hơn, được coi là hệ điều hành hiện đại vì chúng chuyển CPU sang chế độ bảo vệ khi khởi động, không bao giờ trở về chế độ thực và cung cấp tất cả lợi ích của chế độ bảo vệ bất kỳ lúc nào.) Hệ điều hành 64 bit chỉ sử dụng hệ điều hành này như một bước đệm khác để chuyển sang chế độ dài. Điều đáng chú ý là chế độ bảo vệ của 80286 là nguyên thủy hơn nhiều so với chế độ được bảo vệ được cải tiến được giới thiệu với 80386; sau này đôi khi được gọi là chế độ bảo vệ 386 và là chế độ mà các hệ điều hành x86 32 bit hiện đại hoạt động trên đó. 8086, 8088 và 80186 có bus địa chỉ 20 bit, nhưng sơ đồ địa chỉ phân đoạn bất thường mà Intel đã chọn cho các bộ xử lý này thực sự tạo ra các địa chỉ hiệu quả có thể có 21 bit quan trọng. Lược đồ này thay đổi một số phân đoạn 16 bit còn lại bốn bit (tạo một số 20 bit với bốn số không quan trọng nhỏ nhất) trước khi thêm vào đó một bù đắp địa chỉ 16 bit; số tiền tối đa xảy ra khi cả phân đoạn và bù trừ là 0xFFFF, cho ra 0xFFFF0 + 0xFFFF = 0x10FFEF. Trên 8086, 8088 và 80186, kết quả của một địa chỉ hiệu quả làm tràn 20 bit là địa chỉ "quay vòng" đến đầu số không của dải địa chỉ, tức là nó được lấy hàm mũ 2^20 (2 ^ 20 = 1048576 = 0x100000). Tuy nhiên, 80286 có 24 bit địa chỉ và tính toán các địa chỉ hiệu quả đến 24 bit ngay cả trong chế độ thực. Do đó, đối với đoạn 0xFFFF và offset lớn hơn 0x000F, 80286 sẽ thực sự truy cập vào đầu bộ nhớ thứ hai của bộ nhớ, trong khi 80186 và trước đó sẽ truy cập địa chỉ bằng [offset] -0x10, tại bắt đầu của mebibyte đầu tiên. (Lưu ý rằng trên 80186 và trước đó, kibibyte đầu tiên của không gian địa chỉ, bắt đầu từ địa chỉ 0, là vị trí vĩnh viễn, bất động của bảng vectơ ngắt.) Vì vậy, số lượng bộ nhớ thực tế được địa chỉ bởi các CPU 80286 và sau đó x86 ở chế độ thực là  1 MiB + 64 KiB – 16 B = 1114096 B. Một số chương trình có trước 80286 được thiết kế để tận dụng lợi thế của hành vi giải quyết bộ nhớ vòng quanh (modulo), vì vậy 80286 đã trình bày một vấn đề về khả năng tương thích ngược. Buộc đường địa chỉ thứ 21 (dây tín hiệu logic thực tế xuất hiện từ chip) đến mức logic thấp, biểu thị bằng không, cho kết quả trong modulo-2^20 có hiệu lực để khớp với số học địa chỉ của bộ xử lý trước đó, nhưng 80286 không có nội bộ khả năng thực hiện chức năng này. Khi IBM sử dụng 80286 trong máy tính IBM/AT, họ đã giải quyết vấn đề này bằng cách bao gồm một cổng có thể cài đặt phần mềm để bật hoặc tắt (buộc bằng không) đường địa chỉ A20, giữa chân A20 trên 80286 và bus hệ thống; điều này được gọi là Gate-A20 (cổng A20), và nó vẫn được triển khai trong các chipset PC cho đến ngày nay. Hầu hết các phiên bản của trình điều khiển bộ nhớ mở rộng HIMEM.SYS cho IBM- / MS-DOS được hiển thị nổi bật khi tải một thông báo rằng chúng đã cài đặt "bộ xử lý A20", một phần mềm để điều khiển Gate-A20 và điều phối nó theo nhu cầu của chương trình. Ở chế độ được bảo vệ, dòng A20 cần được bật, nếu không sẽ xảy ra lỗi địa chỉ vật lý, có thể dẫn đến sự cố hệ thống. Intel đã giới thiệu chế độ bảo vệ cho gia đình x86 với ý định rằng các hệ điều hành sử dụng nó sẽ chạy hoàn toàn ở chế độ mới và tất cả các chương trình chạy dưới một hệ điều hành có chế độ bảo vệ sẽ chạy ở chế độ được bảo vệ. Do sự khác biệt đáng kể giữa chế độ thực và thậm chí là chế độ bảo vệ 286 bị hạn chế, các chương trình được viết cho chế độ thực không thể chạy trong chế độ được bảo vệ mà không phải viết lại. Do đó, với một số lượng lớn các ứng dụng chế độ thực hiện tại mà người dùng phụ thuộc vào, việc bỏ qua chế độ thực đã tạo ra các vấn đề ngành máy tính và các lập trình viên đã tìm cách chuyển đổi giữa các chế độ theo ý muốn. Tuy nhiên, Intel, tuân thủ theo ý định sử dụng bộ vi xử lý, cung cấp một cách dễ dàng để chuyển sang chế độ bảo vệ trên 80286 nhưng không có cách nào dễ dàng để chuyển ngược lại về chế độ thực. Trước 386, cách duy nhất để chuyển từ chế độ bảo vệ trở về chế độ thực là khởi động lại bộ xử lý; sau khi thiết lập lại nó luôn khởi động ở chế độ thực để tương thích với các CPU x86 trước đó gồm cả 8086. Việc khởi động lại bộ vi xử lý không thực hiện xóa RAM của hệ thống, vì vậy điều này, trong khi khó xử và không hiệu quả, là thực sự khả thi. Từ chế độ được bảo vệ, trạng thái của bộ xử lý được lưu trong bộ nhớ, sau đó bộ xử lý được đặt lại, khởi động lại ở chế độ thực và thực thi một số lệnh của chế độ thực để khôi phục trạng thái đã lưu từ bộ nhớ. Sau đó, nó có thể chạy mã chế độ thực khác cho đến khi chương trình sẵn sàng chuyển về chế độ được bảo vệ. Việc chuyển sang chế độ thực là tốn kém về mặt thời gian, nhưng kỹ thuật này cho phép các chương trình chế độ được bảo vệ sử dụng các dịch vụ như BIOS, chạy hoàn toàn ở chế độ thực (đã được thiết kế ban đầu cho kiểu máy tính cá nhân IBM 8088 (loại máy) 5150). Kỹ thuật chuyển đổi chế độ này cũng là kỹ thuật được sử dụng bởi DPMI (dưới dạng DOS thực, không phải dạng được mô phỏng) và các bộ mở rộng DOS như DOS/4GW để cho phép các chương trình chế độ được bảo vệ chạy dưới DOS; hệ thống DPMI hoặc DOS extender chuyển sang chế độ thực để gọi các cuộc gọi DOS hoặc BIOS, sau đó chuyển trở lại chương trình ứng dụng chạy trong chế độ được bảo vệ. Sự thay đổi hướng tới hạt nhân NT dẫn đến việc hệ điều hành không cần DOS để khởi động máy tính cũng như không thể sử dụng nó. Sự cần thiết phải khởi động lại máy tính trong chế độ thực MS-DOS bị từ chối sau Windows 3.1x cho đến khi điều này không còn được hỗ trợ trong Windows ME. Cách duy nhất để chạy các ứng dụng DOS yêu cầu chế độ thực từ các phiên bản Windows mới hơn là sử dụng các trình giả lập như DOSBox hoặc các phần mềm ảo hóa x86. ^ “A Brief x86 History”. Chourdakis, Michael (ngày 21 tháng 5 năm 2015). “The Real, Protected, Long mode assembly tutorial for PCs”. Code Project.