Tại sao các vùng ánh xạ bộ nhớ chỉ đọc có các trang bẩn?


8

Thực hiện (ví dụ) lệnh sau để lấy danh sách các trang được ánh xạ bộ nhớ:

pmap -x `pidof bash`

Tôi đã nhận được kết quả đầu ra này: nhập mô tả hình ảnh ở đây Tại sao một số trang chỉ đọc được đánh dấu là "bẩn", tức là được viết yêu cầu viết lại? Nếu chúng chỉ đọc, quá trình sẽ không thể ghi cho chúng ... (Trong ví dụ được cung cấp, các trang bẩn luôn là 4 kB, nhưng tôi đã tìm thấy các trường hợp khác với các giá trị khác nhau)

Tôi cũng đã kiểm tra / Proc / pid / smaps và các trang đó được mô tả là "Bẩn thỉu riêng tư".

Câu trả lời:


7

Một trang bẩn không nhất thiết phải viết lại. Một trang bẩn là một trang được viết từ khi kernel cuối cùng đánh dấu nó là sạch. Dữ liệu không phải lúc nào cũng cần được lưu lại vào tệp gốc.

Các trang là riêng tư, không được chia sẻ, vì vậy chúng sẽ không được lưu lại vào tệp gốc. Không thể có một trang bẩn được hỗ trợ bởi một tệp chỉ đọc. Nếu trang cần được xóa khỏi RAM, nó sẽ được lưu trong trao đổi.

Các trang chỉ đọc, riêng tư và bẩn, nhưng trong phạm vi tệp ánh xạ bộ nhớ, thường là các trang dữ liệu chứa các hằng số cần được khởi tạo trong thời gian chạy, nhưng không thay đổi sau khi chúng được khởi tạo. Ví dụ, chúng có thể chứa dữ liệu tĩnh nhúng con trỏ; các giá trị con trỏ phụ thuộc vào địa chỉ mà chương trình hoặc thư viện được ánh xạ, do đó nó phải được tính sau khi chương trình bắt đầu, với trang được đọc-ghi ở giai đoạn này. Sau khi con trỏ được tính toán, nội dung của trang sẽ không bao giờ thay đổi trong trường hợp này của chương trình, vì vậy trang có thể được thay đổi thành chỉ đọc. Xem các trang săn bắn xuống bộ nhớ bẩn Các trang bằng stosb để biết ví dụ với các đoạn mã.

Bạn có thể, hiếm khi hơn, xem các trang chỉ đọc, thực thi, riêng tư, bẩn; những điều này xảy ra với một số trình liên kết trộn mã và dữ liệu một cách tự do hơn hoặc với việc biên dịch đúng lúc.


Tôi chưa xác minh nó, nhưng tôi nghi ngờ bạn cũng có thể nhận được các trang bẩn riêng tư chỉ đọc, có thể thực thi được với các đối tượng chia sẻ không phải PIC. Tôi dường như nhớ rằng đó là lý do các đối tượng chia sẻ PIC có khá nhiều yêu cầu thực tế .
Andrew Henle

2

Ngoài các trường hợp danh sách Gilles :

Khi một quá trình chuyển đổi, kernel có thể đánh dấu tất cả các trang bẩn của nó là chỉ đọc và chúng sẽ được chia sẻ giữa cha mẹ và con. Khi một trong các quy trình ghi vào trang, một ngoại lệ sẽ xảy ra và kernel sẽ sao chép trang và đánh dấu nó có thể ghi. Điều này giúp tiết kiệm công việc sao chép các trang mà cuối cùng không bị sửa đổi bởi một trong hai quy trình. (Lưu ý rằng trong tình huống này, các trang được đánh dấu chỉ đọc trong phần cứng nhưng được nhân biết là có thể ghi được.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.