Đầu tiên, điều này không liên quan gì đến RAM, thực sự. Chúng ta đang nói về không gian địa chỉ ở đây - ngay cả khi bạn chỉ có 16 MiB bộ nhớ, bạn vẫn có đủ 32 bit không gian địa chỉ trên CPU 32 bit.
Điều này đã trả lời câu hỏi đầu tiên của bạn, thực sự - tại thời điểm này được thiết kế, các PC trong thế giới thực không có gần 4 GiB bộ nhớ; chúng có nhiều hơn trong phạm vi 1-16 MiB của bộ nhớ. Không gian địa chỉ là, cho tất cả ý định và mục đích, miễn phí.
Bây giờ, tại sao 0xFFFFFFF0 chính xác? CPU không biết có bao nhiêu BIOS. Một số BIOS có thể chỉ mất vài kilobyte, trong khi một số khác có thể chiếm hết megabyte bộ nhớ - và tôi thậm chí không nhận được nhiều RAM tùy chọn khác nhau. CPU phải được kết nối với một số địa chỉ để bắt đầu - không có gì để cấu hình CPU. Nhưng đây chỉ là ánh xạ không gian địa chỉ - địa chỉ được ánh xạ trực tiếp vào chip ROM BIOS (vâng, điều này có nghĩa là bạn không có quyền truy cập vào toàn bộ 4 GiB RAM vào thời điểm này nếu bạn có nhiều - nhưng điều đó không có gì đặc biệt, nhiều thiết bị yêu cầu phạm vi riêng trong không gian địa chỉ). Trên CPU 32 bit, địa chỉ này cung cấp cho bạn 16 byte đầy đủ để thực hiện khởi tạo rất cơ bản - đủ để thiết lập các phân đoạn của bạn và, nếu cần, chế độ địa chỉ (hãy nhớ,khởi động "thủ tục" thực sự . Tại thời điểm này, bạn hoàn toàn không sử dụng RAM - tất cả chỉ là bản đồ ROM. Trên thực tế, RAM thậm chí chưa sẵn sàng để được sử dụng tại thời điểm này - đó là một trong những công việc của BIOS POST! Bây giờ, bạn có thể nghĩ - chế độ thực 16 bit truy cập địa chỉ 0xFFFFFFF0 như thế nào? Chắc chắn, có các phân đoạn, vì vậy bạn có không gian địa chỉ 20 bit, nhưng điều đó vẫn chưa đủ. Chà, có một mẹo đối với nó - 12 bit cao của địa chỉ được đặt cho đến khi bạn thực hiện bước nhảy dài đầu tiên, cho phép bạn truy cập vào không gian địa chỉ cao (trong khi từ chối quyền truy cập vào bất cứ thứ gì thấp hơn 0xFFF00000 - cho đến khi bạn thực hiện bước nhảy dài) .
Tất cả điều này là những điều chủ yếu được ẩn từ các lập trình viên (không đề cập đến người dùng) trên các hệ điều hành hiện đại. Bạn thường không có quyền truy cập vào bất cứ thứ gì ở mức độ thấp - một số thứ đã vượt quá khả năng cứu hộ (bạn không thể chuyển đổi chế độ CPU willy-nilly), một số được xử lý độc quyền bởi nhân hệ điều hành.
Vì vậy, một cái nhìn đẹp hơn đến từ mã hóa trường học cũ trên MS DOS. Một ví dụ điển hình khác về bộ nhớ thiết bị được ánh xạ trực tiếp vào không gian địa chỉ là truy cập trực tiếp vào bộ nhớ video. Ví dụ: nếu bạn muốn viết văn bản lên màn hình nhanh, bạn đã viết trực tiếp vào địa chỉ B800:0000
(cộng với offset - ở chế độ văn bản 80x25, điều này có nghĩa là (y * 80 + x) * 2
nếu bộ nhớ của tôi phục vụ tôi đúng - hai byte cho mỗi ký tự, theo từng dòng). Nếu bạn muốn vẽ từng pixel theo pixel, bạn đã sử dụng chế độ đồ họa và địa chỉ bắt đầu A000:0000
(thông thường, 320x200 với 8 bit mỗi pixel). Làm bất cứ điều gì hiệu suất cao thường có nghĩa là đi sâu vào hướng dẫn sử dụng thiết bị, để tìm ra cách truy cập chúng trực tiếp.
Điều này tồn tại cho đến ngày nay - nó chỉ bị ẩn. Trên Windows, bạn có thể thấy các địa chỉ bộ nhớ được ánh xạ tới các thiết bị trong Trình quản lý thiết bị - chỉ cần mở các thuộc tính của một cái gì đó như thẻ mạng của bạn, đi đến tab Tài nguyên - tất cả các mục Phạm vi bộ nhớ là ánh xạ từ bộ nhớ thiết bị đến không gian địa chỉ chính của bạn. Và trên 32 bit, bạn sẽ thấy hầu hết các thiết bị đó được ánh xạ trên dấu 2 GiB (sau này là 3 GiB) - để giảm thiểu xung đột với bộ nhớ có thể sử dụng được, mặc dù đây không thực sự là vấn đề với bộ nhớ ảo ( các ứng dụng không nhận được bất cứ nơi nào gần không gian địa chỉ phần cứng thực - chúng có bộ nhớ ảo hóa riêng, có thể được ánh xạ tới RAM, ROM, thiết bị hoặc tệp trang chẳng hạn).
Đối với ngăn xếp, tốt, nó sẽ giúp hiểu rằng theo mặc định, ngăn xếp phát triển từ đầu. Vì vậy, nếu bạn thực hiện push
, con trỏ ngăn xếp mới sẽ ở 0xFFFFFEC
- nói cách khác, bạn không cố ghi vào địa chỉ init của BIOS :) Điều đó tất nhiên có nghĩa là các thường trình khởi động BIOS có thể sử dụng ngăn xếp một cách an toàn, trước khi ánh xạ lại ở đâu đó hữu ích hơn. Trong lập trình trường học cũ, trước khi phân trang trở thành mặc định thực tế, ngăn xếp thường bắt đầu vào cuối RAM và "tràn ngăn xếp" đã xảy ra khi bạn bắt đầu ghi đè lên bộ nhớ ứng dụng. Bảo vệ bộ nhớ đã thay đổi rất nhiều điều này, nhưng nói chung, nó duy trì khả năng tương thích ngược càng nhiều càng tốt - lưu ý làm thế nào ngay cả CPU x86-64 hiện đại nhất vẫn có thể khởi động MS DOS 5 - hoặc làm thế nào Windows vẫn có thể chạy nhiều ứng dụng DOS mà không có ý tưởng về phân trang.