Phân tích cơ chế xử lý của Hệ điều hành khi truy cập vùng nhớ không hợp lệ

 

Trong lập trình, việc truy cập vào một con trỏ không hợp lệ là một lỗi phổ biến. Điều này có thể xảy ra khi một con trỏ được khai báo nhưng chưa được khởi tạo để trỏ đến một vùng nhớ hợp lệ, hoặc trỏ đến vùng nhớ đã được giải phóng. Khi ứng dụng cố gắng đọc/ghi dữ liệu thông qua con trỏ này, chương trình sẽ bị “crash”.

Bài viết này sẽ phân tích các cơ chế diễn ra bên trong hệ điều hành (cụ thể là các hệ điều hành như Linux) dẫn đến hiện tượng “crash” này.

1. Bối cảnh: Virtual Memory và MMU

Phần lớn các hệ điều hành hiện đại đều sử dụng cơ chế Virtual Memory (Bộ nhớ ảo). Điều này có nghĩa là mỗi tiến trình (process) sẽ có một không gian địa chỉ bộ nhớ ảo riêng biệt. Do đó, hai tiến trình A và B có thể cùng có một biến tại cùng một địa chỉ ảo (ví dụ 0x1000), nhưng thực tế chúng lại trỏ đến hai vùng nhớ vật lý hoàn toàn khác nhau.

Trong CPU, có một khối phần cứng gọi là MMU (Memory Management Unit). CPU không truy cập trực tiếp vào bộ nhớ vật lý; thay vào đó, nó sẽ truyền địa chỉ ảo (virtual address) cho MMU. MMU có nhiệm vụ tra cứu xem địa chỉ ảo đó được ánh xạ (map) vào địa chỉ vật lý (physical address) nào. Sau khi có địa chỉ vật lý, MMU mới tiến hành truy cập vào đó để đọc/ghi dữ liệu và trả kết quả về cho CPU.

2. Quá trình kiểm tra tính hợp lệ của bộ nhớ

Để thực hiện việc tra cứu này, mỗi tiến trình sẽ có một cấu trúc dữ liệu đi kèm gọi là bảng phân trang (Page Table). Bảng này duy trì sự ánh xạ giữa địa chỉ ảo (virtual address) và địa chỉ vật lý tương ứng.

Mỗi khi tiến trình truy cập vào bất kỳ vùng nhớ nào:

  1. CPU gửi địa chỉ ảo mà tiến trình muốn truy cập cho MMU.
  2. MMU sẽ tra cứu địa chỉ ảo đó trong bảng phân trang của tiến trình hiện tại.
  3. Nếu tìm thấy một ánh xạ hợp lệ, MMU sẽ dịch sang địa chỉ vật lý và tiến hành truy cập. Đây là một địa chỉ hợp lệ.
  4. Nếu không tìm thấy (hoặc mục trong bảng phân trang đánh dấu là không hợp lệ/không được phép truy cập), MMU xác định đây là một truy cập không hợp lệ.
3. Trường hợp 1: Truy cập không hợp lệ trong User-Space

Vậy điều gì sẽ xảy ra khi MMU không thể tìm thấy địa chỉ trong bảng phân trang?

  1. MMU tạo ra một ngoại lệ (Exception): MMU thông báo cho Hệ điều hành (OS) về lỗi truy cập này (thường gọi là “Page Fault”).
  2. OS xử lý ngoại lệ: OS kiểm tra và xác nhận rằng địa chỉ này thực sự không hợp lệ (không phải là một “page fault” hợp lệ như trường hợp deferred allocation).
  3. Gửi tín hiệu (Signal): OS sẽ gửi một tín hiệu chấm dứt (terminate signal, ví dụ như SIGSEGV – Segmentation Fault) đến tiến trình đã gây ra lỗi.
  4. Process bị “Crash”: Khi nhận được tín hiệu này, tiến trình sẽ bị chấm dứt ngay lập tức. Đây chính là hiện tượng “crash” mà chúng ta thường thấy.
  5. Dọn dẹp tài nguyên: Do mỗi tiến trình khi sử dụng tài nguyên (bộ nhớ, file…) đều phải đăng ký với OS, nên OS có một danh sách đầy đủ các tài nguyên mà tiến trình đang “mượn”. Sau khi tiến trình crash, OS sẽ thu hồi và giải phóng toàn bộ các tài nguyên này, đảm bảo việc crash của một ứng dụng không làm ảnh hưởng đến sự ổn định của toàn bộ hệ thống.
4. Trường hợp 2: Truy cập không hợp lệ trong Kernel-Space

Chào bạn, tôi đã biên tập lại bài viết cuối cùng này. Tôi vẫn giữ nguyên cấu trúc và nội dung kỹ thuật cốt lõi, chỉ điều chỉnh lại văn phong cho phù hợp với trang blog của công ty.

 

 

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top