Cơ chế quản lý bộ nhớ vật lý linux

Giới thiệu

Bài học trước đã giới thiệu về cơ chế virtual memory. Đặc điểm chung của tất cả các hệ thống áp dụng cơ chế này đó là: địa chỉ do CPU phát ra tách biệt với địa chỉ truy cập bộ nhớ vật lý. Từ đó mà sinh ra khái niệm địa chỉ ảo (virtual address) và địa chỉ vật lý (physical address). Địa chỉ ảo dùng để xác định vị trí của lệnh hoặc dữ liệu trong một tiến trình. Địa chỉ vật lý dùng để xác định vị trí của lệnh hoặc dữ liệu trên bộ nhớ vật lý. Phần 1 của bài học này sẽ trình bày cơ chế chuyển đổi từ địa chỉ ảo sang địa chỉ vật lý trong các hệ thống sử dụng bộ xử lý của Intel và hệ điều hành Linux.

Tập hợp các địa chỉ ảo được gọi là không gian địa chỉ ảo. Tập hợp các địa chỉ vật lý được gọi là không gian địa chỉ vật lý. Phần 2 và phần 3 của bài học này sẽ trình bày cách Linux kernel quy hoạch 2 loại không gian địa chỉ này.

Cơ chế dịch địa chỉ ảo sang địa chỉ vật lý

Để dịch địa chỉ ảo sang địa chỉ vật lý, khối MMU và bảng page table được sử dụng. Tổng quát, khối MMU chứa một thanh ghi gọi là Page Directory pointer. Trong các bộ xử lý của Intel, thanh ghi này chính là thanh ghi cr3. Ngoài ra, để tăng tốc dịch địa chỉ, MMU được trang bị thêm bảng TLB. Còn để tăng hiệu quả sử dụng bộ nhớ, Linux kernel áp dụng kỹ thuật multi-level paging để xây dựng bảng page table theo kiểu phân cấp. Tùy vào bộ xử lý, Linux kernel sẽ áp dụng kỹ thuật 2-level, 3-level hoặc 4-level paging.

2-level paging

Xét các hệ thống sử dụng bộ xử lý 80386 hoặc 80486 của Intel. Đây là các CPU 32 bit, tức là thanh ghi EIP của CPU rộng 32 bit. Trong những hệ thống này, Linux áp dụng kỹ thuật 2-level paging để xây dựng bảng page table gồm hai mức phân cấp. Cấp một gồm 1 bảng PGD (Page Global Directory), cấp hai gồm 1024 bảng Page Table. Bảng PGD gồm 1024 dòng, mỗi dòng dài 4 byte và mang thông tin về một bảng Page Table ở cấp hai. Mỗi bảng Page Table cũng gồm 1024 dòng, mỗi dòng cũng dài 4 byte và mang thông tin về một page chứa lệnh/dữ liệu. Cấu trúc của mỗi dòng trong cả 2 loại bảng là giống nhau. Cụ thể, mỗi dòng đều bao gồm các trường sau:

Trường

Số bit

Ý nghĩa

Present flag

1

Nếu bảng Page Table tương ứng với dòng này hoặc page chứa lệnh/dữ liệu tương ứng với dòng này đang nằm trong RAM, thì cờ này bằng 1.

Frame physical address

20

Chứa địa chỉ vật lý của frame chứa bảng Page Table, hoặc địa chỉ vật lý của frame chứa lệnh/dữ liệu tương ứng với dòng này.

Accessed flag

1

Được thiết lập bằng 1 mỗi khi dòng này được tham chiếu. Cứ sau một khoảng thời gian, Linux sẽ xóa cờ này. Nếu cờ này bằng 0, bảng Page Table hoặc page chứa lệnh/dữ liệu tương ứng với dòng này sẽ bị xem xét đưa ra khỏi RAM.

Dirty flag

1

Chỉ các dòng của các bảng Page Table mới có cờ này. Mỗi khi có một thao tác ghi dữ liệu vào page tương ứng với dòng này, thì cờ này được thiết lập bằng 1. Nếu cờ này bằng 0, thì page tương ứng với dòng này sẽ bị xem xét đưa ra khỏi bộ nhớ vật lý (swap out). Nếu bị swap out, nội dung của page không cần phải ghi lại vào ổ cứng.

Read/write flag

1

Nếu frame tương ứng với dòng này có thể đọc và ghi, thì cờ này bằng 1. Nếu frame tương ứng với dòng này chỉ đọc, thì cờ này bằng 0.

User/supervisor flag

1

Nếu cờ này bằng 0, thì frame tương ứng sẽ được truy cập chỉ khi nào CPU đang thực thi ở chế độ kernel mode. Nếu cờ này bằng 1, thì frame tương ứng luôn có thể truy cập, bất chấp chế độ thực thi của CPU.

PCD flag

1

Bộ nhớ cache được đặt giữa CPU và RAM nhằm cải thiện tốc độ truy cập dữ liệu. Nếu cờ này bằng 1, thì bộ nhớ cache sẽ bị vô hiệu hóa khi CPU truy cập dữ liệu trong frame.

PWT flag

1

Nếu cờ này bằng 1, thì thao tác ghi sẽ làm thay đổi dữ liệu trên cả cache và RAM (cơ chế write through). Nếu cờ này bằng 0, thì thao tác ghi sẽ chỉ làm thay đổi dữ liệu trên cache, còn dữ liệu trên RAM sẽ được cập nhật sau (cơ chế write back).

Page Size flag

1

Cờ này dùng để xác định kích thước của frame. Cờ này chỉ được áp dụng cho các dòng của bảng PGD. Nếu cờ này bằng 1, thì frame dài 2MB hoặc 4MB. Nếu cờ này bằng 0, thì frame dài 4KB.

Global flag

1

Chỉ các dòng của các bảng Page Table mới có cờ này. Cờ này ngăn không cho xóa các dòng thường xuyên được sử dụng khỏi bảng TLB.

Bảng 1. Cấu trúc của mỗi dòng trong bảng PGD hoặc bảng Page Table

Hình 1 biểu diễn cơ chế dịch địa chỉ ảo sang địa chỉ vật lý trong hệ thống 32 bit. Do cơ chế 2-level paging tạo ra 3 loại frame khác nhau, nên địa chỉ ảo được chia làm 3 phần. 10 bit đầu tiên giúp xác định xem, trong số 1024 bảng Page Table, thì Page Table nào chứa thông tin địa chỉ vật lý. 10 bit tiếp theo giúp xác định dòng nào trong bảng Page Table đó chứa thông tin địa chỉ vật lý. 12 bit cuối cùng giúp tính ra địa chỉ vật lý tương ứng với địa chỉ ảo.

Cơ chế quản lý bộ nhớ vật lý linux

Hình 1. Cơ chế dịch địa chỉ ảo sang địa chỉ vật lý trong các hệ thống 32 bit (không bật tính năng PAE)

Cũng lưu ý rằng, trong quá trình dịch địa chỉ, nếu cờ Present flag của dòng được tham chiếu bằng 0, hoặc cờ User/Supervisor của dòng đó bị vi phạm, thì MMU sẽ tạm dừng việc dịch địa chỉ lại, rồi gửi tín hiệu Page Fault tới cho CPU. CPU sẽ thực hiện Page Fault handler để xử lý tín hiệu này.

3-level paging

Do bộ xử lý 32 bit chỉ cho phép không gian địa chỉ vật lý tối đa là 4GB, nhưng một số hệ thống server lại cần chứa rất nhiều tiến trình cùng một lúc, nên 4GB là không đủ. Để đáp ứng nhu cầu này, Intel đã tạo ra bộ xử lý Pentium Pro với tính năng PAE (Physical Address Extension). Với tính năng này, tuy bộ xử lý vẫn là 32 bit, nhưng số đường bus địa chỉ sẽ là 36 bit. Điều này có nghĩa là, không gian địa chỉ ảo vẫn là 4GB, nhưng không gian địa chỉ vật lý có kích thước tối đa là 64GB. Để có thể sử dụng được tính năng này, trước khi biên dịch Linux kernel 32 bit, ta cần cấu hình CONFIG_X86_PAE=y.

Trong những hệ thống sử dụng bộ xử lý Pentium Pro và Linux hỗ trợ PAE, Linux kernel sẽ áp dụng kỹ thuật 3-level paging để xây dựng bảng page table gồm 3 mức phân cấp. Cấp một gồm 1 bảng PGD, cấp hai gồm 4 bảng PMD (Page Middle Directory), cấp ba gồm 2048 bảng Page Table. Bảng PGD gồm 4 dòng, mỗi dòng dài 8 byte và mang thông tin về một bảng PMD ở cấp hai. Mỗi bảng PMD gồm 512 dòng, mỗi dòng dài 8 byte và mang thông tin về một bảng Page Table ở cấp ba. Mỗi bảng bảng Page Table cũng gồm 512 dòng, mỗi dòng 8 byte và mang thông tin về một page chứa lệnh/dữ liệu.

Hình 2 biểu diễn cơ chế dịch địa chỉ ảo sang địa chỉ vật lý. Cơ chế này tương tự như hình 1, chỉ khác ở chỗ, 32 bit địa chỉ ảo được chia làm 4 phần (2 – 9 – 9 – 12), tương ứng với 4 loại frame.

Cơ chế quản lý bộ nhớ vật lý linux

Hình 2. Cơ chế dịch địa chỉ ảo sang địa chỉ vật lý trong các hệ thống 32 bit (bật tính năng PAE)

4-level paging

Mặc dù tính năng PAE cho phép tăng kích thước không gian vật lý, nhưng kích thước của không gian địa chỉ ảo vẫn là 32 bit. Vì cơ chế virtual memory chỉ phát huy hiệu quả khi không gian ảo lớn hơn nhiều so với không gian vật lý, nên tính năng PAE đã làm hạn chế đi sự hiệu quả của cơ chế virtual memory. Giải pháp dài hạn cho vấn đề này đó là sản xuất CPU 64 bit (tức là thanh ghi RIP rộng 64 bit). Điều này đã kéo theo sự ra đời của Linux 64 bit. Tuy nhiên, trong thực tế, Linux chỉ sử dụng không gian ảo 48 bit, thay vì toàn bộ 64 bit. Lý do là vì 2^48 rất lớn, lớn hơn rất rất nhiều so với kích thước bộ nhớ vật lý trên các hệ thống hiện tại.

Trong những hệ thống 64 bit, Linux sẽ áp dụng kỹ thuật 4-level paging để xây dựng bảng page table gồm 4 mức phân cấp. Cấp một gồm 1 bảng PGD, cấp hai gồm 512 bảng PUD (Page Upper Directory), cấp ba gồm 5122 bảng PMD, cấp bốn gồm 5123 bảng Page Table. Bảng PGD gồm 512 dòng, mỗi dòng dài 8 byte và mang thông tin về một bảng PUD ở cấp hai. Mỗi bảng PUD gồm 512 dòng, mỗi dòng dài 8 byte và mang thông tin về một bảng PMD ở cấp ba. Mỗi bảng PMD gồm 512 dòng, mỗi dòng dài 8 byte và mang thông tin về một bảng Page Table ở cấp bốn. Mỗi bảng bảng Page Table cũng gồm 512 dòng, mỗi dòng dài 8 byte và mang thông tin về một page chứa lệnh/dữ liệu.

Cơ chế dịch địa chỉ ảo sang địa chỉ vật lý tương tự như hình 1 và hình 2. Chỉ khác ở chỗ, 48 bit địa chỉ ảo được chia làm 5 phần (9 – 9 – 9 – 9 – 12), tương ứng với 5 loại frame.

Kết luận

Đặc điểm chung của các hệ thống sử dụng cơ chế virtual memory đó là địa chỉ do CPU phát ra (virtual address) tách biệt hẳn so với địa chỉ truy cập bộ nhớ vật lý (physical address). Phần này đã giới thiệu các cơ chế multi-level paging để xây dựng các bảng dịch địa chỉ từ virtual address sang physical address.

Phần tiếp theo của bài viết sẽ trình bày về cách quy hoạch không gian địa chỉ vật lý. Mời các bạn đón đọc tại đây.