Làm thế nào để kernel ngăn chương trình độc hại đọc tất cả RAM vật lý?


10

Nếu tôi viết chương trình cố gắng đọc bộ nhớ ở mọi địa chỉ có thể và tôi chạy nó trên một Unix "đầy đủ", nó sẽ không thể truy cập tất cả RAM vật lý. Nhưng làm thế nào để hệ điều hành ngăn chặn nó làm như vậy?

Tôi quen thuộc hơn với các kiến ​​trúc CPU nhỏ nơi mà bất kỳ đoạn mã lắp ráp nào cũng có thể truy cập mọi thứ. Tôi không hiểu làm thế nào một chương trình (kernel) có thể phát hiện các hoạt động độc hại như vậy.


2
Thông thường, MMU quan tâm rằng bạn không thể truy cập bộ nhớ ngoài các khu vực được phép.
ott--

1
Vâng, MMU được cấu hình bởi lắp ráp. Do đó, mã lắp ráp có thể thay đổi cấu hình MMU và truy cập một trang bộ nhớ khác, phải không?
nowox

Điều này chỉ đúng nếu bạn chạy mã của bạn dưới quyền root.
ott--

2
Bạn nên đọc về bảng trang và trừu tượng kernel trong đó.
Clarus

@ott: ngay cả root cũng không thể sửa đổi MMU (ít nhất là không có trên Linux). Chỉ có nhân làm.
Basile Starynkevitch

Câu trả lời:


12

Đó không phải là hạt nhân ngăn chặn truy cập bộ nhớ xấu, đó là CPU. Vai trò của kernel chỉ là cấu hình CPU chính xác.

Chính xác hơn, thành phần phần cứng ngăn chặn truy cập bộ nhớ xấu là MMU . Khi một chương trình truy cập địa chỉ bộ nhớ, địa chỉ được CPU giải mã dựa trên nội dung của MMU. MMU thiết lập bản dịch từ địa chỉ ảo sang địa chỉ vật lý: khi CPU thực hiện tải hoặc lưu trữ tại một địa chỉ ảo nhất định, nó sẽ tính toán địa chỉ vật lý tương ứng dựa trên nội dung MMU. Hạt nhân thiết lập cấu hình MMU theo cách mà mỗi chương trình chỉ có thể truy cập bộ nhớ mà nó có quyền. Các thanh ghi bộ nhớ và phần cứng của các chương trình khác hoàn toàn không được ánh xạ trong bộ nhớ của chương trình: các địa chỉ vật lý này không có địa chỉ ảo tương ứng trong cấu hình MMU cho chương trình đó.

Trên một chuyển đổi ngữ cảnh giữa các quy trình khác nhau, hạt nhân sửa đổi cấu hình MMU để nó chứa bản dịch mong muốn cho quy trình mới.

Một số địa chỉ ảo hoàn toàn không được ánh xạ, tức là MMU dịch chúng sang một loại đặc biệt không có giá trị như vậy. Khi bộ xử lý hủy đăng ký một địa chỉ chưa được ánh xạ, điều này gây ra một cái bẫy: bộ xử lý phân nhánh đến một vị trí được xác định trước trong mã hạt nhân. Một số bẫy là hợp pháp; ví dụ: địa chỉ ảo có thể tương ứng với một trang trong không gian hoán đổi , trong trường hợp đó, mã hạt nhân sẽ tải nội dung trang từ hoán đổi sau đó chuyển về chương trình gốc theo cách mà lệnh truy cập bộ nhớ được thực thi lại. Các bẫy khác không hợp pháp, trong trường hợp đó, quá trình sẽ nhận được tín hiệu theo mặc định sẽ giết chương trình ngay lập tức (và nếu không phân nhánh đến bộ xử lý tín hiệu trong chương trình: trong mọi trường hợp, lệnh truy cập bộ nhớ không được hoàn thành).


Bạn có thể chỉ định một chút câu lệnh "địa chỉ được CPU giải mã dựa trên nội dung của MMU" không? Có một mã thực tế trong chương trình đang chạy để giải mã địa chỉ? Hoặc khi CPU tạo quyền truy cập vào một địa chỉ - việc truy cập được thực hiện đối với MMU, nó dịch / xử lý nó đúng cách (tạo quyền truy cập vào bộ nhớ hoặc bộ đệm và trả về kết quả, hoặc kích hoạt thủ tục kernel)? Vì vậy, từ góc độ vi điều khiển / lắp ráp, MMU là một phần mới. CPU không được kết nối trực tiếp với bộ nhớ, nó được kết nối với MMU và đó là nơi thực hiện trừu tượng hóa bộ nhớ ảo.
xealits

3
@xealits Việc dịch từ địa chỉ ảo sang địa chỉ vật lý được thực hiện bên trong MMU, đây là một mạch phần cứng. Không có mã để làm điều đó trong chương trình hoặc trong kernel. Hạt nhân chỉ được gọi trong các trường hợp ngoại lệ, khi chương trình cố gắng truy cập vào một địa chỉ ảo mà mục nhập MMU nói là địa chỉ không hợp lệ. Hạt nhân cũng thực hiện công việc cấu hình các thanh ghi và các bảng trong RAM mà MMU sử dụng.
Gilles 'SO- ngừng trở nên xấu xa'
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.