
Bảng trang page table là gì? Quản lý bộ nhớ ảo trong hệ điều hành
Page table (bảng trang) là cấu trúc dữ liệu cốt lõi giúp hệ điều hành ánh xạ địa chỉ ảo sang địa chỉ vật lý. Mỗi tiến trình có một không gian địa chỉ ảo riêng, và page table chính là cầu nối để CPU truy xuất dữ liệu thực sự nằm trong RAM.

Tại sao cần tới page table?
Trước khi có bộ nhớ ảo, mỗi tiến trình gắn trực tiếp với một dải địa chỉ vật lý. Cách này vỡ tan khi hai tiến trình cùng truy cập một địa chỉ: chúng ghi đè lên nhau, dữ liệu hỏng hục. Bộ nhớ ảo giải quyết bằng cách cho mỗi tiến trình thấy một dải địa chỉ riêng, và page table thực hiện việc dịch địa chỉ đó sang địa chỉ vật lý tại thời điểm truy cập.
Ba mục tiêu thiết kế nổi bật:
- Cô lập tiến trình. Một tiến trình đọc tràn vùng nhớ không đụng tới tiến trình khác vì địa chỉ ảo của nó không trỏ tới đâu ngoài không gian được cấp.
- Chia sẻ bộ nhớ hiệu quả. Nhiều tiến trình có thể cùng trỏ tới một khung trang vật lý, tiết kiệm RAM khi nạp cùng một tệp thư viện.
- Phân trang và swap. Trang không nằm trong RAM có thể được ghi ra đĩa và nạp lại khi cần, nhờ cờ present trong mỗi entry.
Cấu trúc một page table
Trang đơn vị là page frame, thường 4 KiB trên x86. Mỗi entry trong page table chứa ít nhất ba trường thông tin: cờ hiện trang có nằm trong RAM, quyền truy cập (đọc, ghi, thực thi), và số hiệu khung trang vật lý. Trên phần cứng 64-bit hiện đại, cờ được tối ưu bằng kỹ thuật gọi là huge page, cho phép ánh xạ cả 2 MiB hoặc 1 GiB bằng một entry duy nhất.

Page table đa cấp trên x86-64
Ánh xạ phẳng — một page table duy nhất chứa hàng triệu entry — sẽ tốn hơn 100 MiB cho mỗi tiến trình, không khả thi. Vì vậy x86-64 dùng cấu trúc bốn cấp, mỗi cấp dùng 9 bit của địa chỉ để chỉ đường:
- PML4 (Page Map Level 4) — 512 entry, cấp cao nhất, trỏ tới PDPT.
- PDPT (Page Directory Pointer Table) — 512 entry, trỏ tới Page Directory.
- Page Directory — 512 entry, trỏ tới Page Table.
- Page Table — 512 entry, mỗi entry là số hiệu khung trang vật lý 4 KiB.
48 bit địa chỉ được chia làm bốn nhóm 9 bit (chỉ số bảng) cộng 12 bit offset nằm trong trang. Nhờ vậy chỉ những bảng thực sự được dùng mới phải cấp phát trong RAM, tiết kiệm đáng kể bộ nhớ cho tiến trình nhỏ.
| Thành phần | Kích thước | Vai trò |
|---|---|---|
| PML4 | 4 KiB (512 entry) | Cấp cao nhất, trỏ tới PDPT |
| PDPT | 4 KiB (512 entry) | Trỏ tới Page Directory |
| Page Directory | 4 KiB (512 entry) | Trỏ tới Page Table |
| Page Table | 4 KiB (512 entry) | Trỏ tới khung trang vật lý |
| Page Frame | 4 KiB | Đơn vị vật lý chứa dữ liệu |
| Huge page | 2 MiB hoặc 1 GiB | Gộp nhiều trang, giảm số lần dịch địa chỉ |
TLB và chi phí dịch địa chỉ
Đi qua bốn cấp bảng cho mỗi lần truy cập bộ nhớ sẽ rất tốn chu kỳ CPUỳ CPU. Phần cứng vì thế có TLB (Translation Lookaside Buffer) — một bộ nhớ đệm ánh xạ gần đây, thường 64 đến 4096 entry. Trúng TLB thì địa chỉ vật lý lấy ra trong vài chu kỳ; trượt TLB thì phải đi đủ bốn cấp page table.
Chính vì vậy, hiệu năng phần mềm thường phụ thuộc mạnh vào cache TLB hơn là cache dữ liệu. Duyệt mảng theo thứ tự bộ nhớ giúp các entry dùng lại liên tiếp nằm trong cùng một entry TLB, nhanh hơn nhiều so với truy cập ngẫu nhiên. Hệ điều hành còn phải xử lý TLB shootdown, tức buộc CPU khác nạp lại TLB, mỗi khi bảng ánh xạ thay đổi như sau mprotect hay munmap.
Lỗi thường gặp khi lập trình
- Segment fault do truy cập ngoài vùng ánh xạ. Entry không có cờ present hoặc quyền không phù hợp sẽ sinh page fault không thể phục hồi.
- Use-after-free. Vùng nhớ đã giải phóng vẫn còn trong TLB tạm thời, nên lỗi có thể không xuất hiện ngay, debug cực khó.
- Bộ nhớ phân mảnh. Nhiều vùng cấp phát rời rạc khiến không gian ảo bị khoảng trống, cấp phát mới thất bại dù RAM thực còn trống.
- Bỏ qua huge page. Ứng dụng quản lý dữ liệu lớn như cơ sở dữ liệu, máy học thường được lợi rõ nhờ giảm từ bốn lần dịch địa chỉ xuống còn một lần.
Liên kết tham khảo: Page table — Wikipedia, Virtual memory — Wikipedia, và tài liệu lệnh mmap(2) — Linux man page mô tả cách cấp phát vùng nhớ ảo trên hệ điều hành Linux.
