8

Tôi đọc rằng, "Khi chương trình thực thi lệnh như: MOV REG,1000, nó sẽ sao chép nội dung của địa chỉ bộ nhớ 1000 sang REG. Địa chỉ có thể được tạo bằng cách lập chỉ mục, thanh ghi cơ sở, đăng ký phân đoạn và các cách khác.Hiểu địa chỉ ảo và không gian địa chỉ ảo

Địa chỉ được tạo chương trình này được gọi là địa chỉ ảo và tạo thành không gian địa chỉ ảo. "

Có ai vui lòng giải thích cho tôi không, (Địa chỉ được tạo ra chương trình này được gọi là địa chỉ ảo) có nghĩa là gì?

Trả lời

27

Chương trình và dữ liệu được lưu dưới dạng số trong ô nhớ. Mỗi ô bộ nhớ có một số duy nhất, được gọi là số địa chỉ của nó. Phạm vi số đại diện cho các địa chỉ hợp lệ được gọi là không gian địa chỉ.

Khi chương trình chạy, CPU đọc dữ liệu từ bộ nhớ và ghi kết quả trở lại bộ nhớ. CPU giao tiếp vị trí mong muốn với bộ nhớ bằng cách chỉ định địa chỉ của ô nhớ được nhắm mục tiêu bởi thao tác đọc hoặc ghi.

Có nhiều cách để CPU có thể tìm ra địa chỉ (nhớ, địa chỉ chỉ là một số). Số đại diện cho địa chỉ có thể trong sổ đăng ký, nó có thể được lưu trữ tại một vị trí bộ nhớ khác, nó có thể được tính toán bằng cách cộng hoặc trừ một khoản bù trừ cho thanh ghi, v.v. Trong mọi trường hợp, chương trình được biên dịch của bạn hướng dẫn CPU cách tìm ra (hoặc tạo ra) địa chỉ cần đọc hoặc viết.

Kiến trúc hiện đại cho phép nhiều chương trình thực thi như thể chúng sở hữu toàn bộ không gian địa chỉ logic. Nói cách khác, một số chương trình có thể ghi vào vị trí bộ nhớ tại cùng một địa chỉ mà không cần bước qua kết quả của nhau. Điều này được thực hiện bằng cách ảo hóa không gian địa chỉ: giả sử chương trình A và B tạo ghi vào vị trí bộ nhớ ở 0x1000. CPU, được hỗ trợ bởi hệ điều hành, có thể thực hiện các điều chỉnh bổ sung cho địa chỉ và bản đồ nó tới địa chỉ thực 0x60001000 cho chương trình A và 0x5F001000 cho chương trình B. Cả hai chương trình đều nghĩ rằng chúng đã ghi ở vị trí 0x1000 , bởi vì chúng hoạt động trong không gian địa chỉ ảo ảo. Mô hình của bộ nhớ là một khối liền kề bắt đầu từ 0 và tiếp tục 0x000100000000 (giả sử rằng hệ thống của bạn có 4GiB bộ nhớ có sẵn cho các quá trình). Nhưng mô hình này chỉ hoạt động vì CPU bổ sung dịch địa chỉ logic của chúng thành địa chỉ thực, được phân bổ và lấy đi khi cần thiết trong quá trình chạy chương trình.

Bởi vì cùng một số đại diện cho một địa chỉ có nghĩa khác nhau đối với một chương trình và một CPU, không gian địa chỉ của chương trình được gọi là ảo, và không gian địa chỉ của CPU được gọi là vật lý.

+0

Trong ví dụ 0x1000 của bạn là địa chỉ được tạo chương trình? –

+0

@ program-o-steve Có, đó là một chương trình được tạo ra địa chỉ.Lưu ý rằng nó không quan trọng * cách * chương trình tạo ra địa chỉ đó: nó có thể là địa chỉ của biến tĩnh, phần tử 0 của mảng tại địa chỉ 0x1000, phần tử 32 của mảng tại địa chỉ 0x0FE0, v.v. . – dasblinkenlight

+0

nhưng câu lệnh trong câu hỏi của tôi cho biết địa chỉ được tạo bởi chương trình là địa chỉ ảo. 0x1000 dường như không phải là địa chỉ ảo –

1

Khi một chương trình truy cập bộ nhớ, nó không biết hoặc quan tâm đến nơi bộ nhớ vật lý sao lưu địa chỉ được lưu trữ. Nó biết nó là lên đến hệ điều hành và phần cứng để làm việc cùng nhau để bản đồ xác định vị trí địa chỉ vật lý phải và do đó cung cấp quyền truy cập vào dữ liệu mà nó muốn. Vì vậy, chúng tôi giới hạn địa chỉ mà một chương trình đang sử dụng để truy cập bộ nhớ một địa chỉ ảo. Một địa chỉ ảo bao gồm hai phần; trang và phần bù đắp vào trang đó.