Bảng trang page table là gì? Quản lý bộ nhớ ảo trong hệ điều hành

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.

Sơ đồ quan hệ giữa không gian địa chỉ ảo của tiến trình và không gian địa chỉ vật lý, thể hiện trang thuộc tiến trình và trang không thuộc tiến trình

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.

Biểu đồ cây bốn cấp page table x86-64: Level 4 trỏ tới nhiều Level 3, Level 2, Level 1, mỗi PTE trỏ tới khối 4 KiB trong RAM

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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Mutation testing là gì? Kỹ thuật đo chất lượng bộ kiểm thử

Mutation testing là gì? Đây là kỹ thuật kiểm thử phần mềm bằng cách chủ động tạo ra những lỗi cố ý trong mã nguồn (gọi là mutant), rồi chạy…

Xem thêm

CQRS là gì? Tách lệnh và truy vấn trong kiến trúc phần mềm

CQRS (Command Query Responsibility Segregation) là một mẫu kiến trúc phần mềm tách biệt hai loại thao tác: thao tác ghi (command) thay đổi trạng thái hệ thống và thao…

Xem thêm

Mô hình C4 là gì? Cách vẽ sơ đồ kiến trúc phần mềm dễ hiểu

Mô hình C4 là gì? Cách vẽ sơ đồ kiến trúc phần mềm dễ hiểu Mô hình C4 là phương pháp trực quan hóa kiến trúc phần mềm bằng 4…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất