Phần cứng (cụ thể là MMU , một phần của CPU) xác định kích thước trang nào có thể. Không có liên quan đến kích thước thanh ghi bộ xử lý và chỉ có mối quan hệ gián tiếp với kích thước không gian địa chỉ (trong đó MMU xác định cả hai).
Hầu như tất cả các kiến trúc đều hỗ trợ kích thước trang 4kB. Một số kiến trúc hỗ trợ các trang lớn hơn (và một số cũng hỗ trợ các trang nhỏ hơn), nhưng 4kB là một mặc định rất phổ biến.
Linux hỗ trợ hai kích cỡ trang:
- Các trang có kích thước bình thường, mà tôi tin là 4kB theo mặc định trên tất cả các kiến trúc, mặc dù một số kiến trúc cho phép các giá trị khác, ví dụ 16kB trên ARM64 hoặc 8kB, 16kB hoặc 64kB trên IA64 . Chúng tương ứng với mức mô tả sâu nhất trên MMU (cái mà Linux gọi là PTE ).
- Các trang lớn , nếu được biên dịch (
CONFIG_HUGETLB_PAGE
là cần thiết và CONFIG_HUGETLBFS
cũng cho hầu hết các mục đích sử dụng). Điều này tương ứng với mức mô tả MMU sâu thứ hai (cái mà Linux gọi là PMD) (hoặc ít nhất là nó thường làm, tôi không biết nếu điều này giữ trên tất cả các kiến trúc).
Kích thước trang là một sự thỏa hiệp giữa việc sử dụng bộ nhớ, sử dụng bộ nhớ và tốc độ.
- Kích thước trang lớn hơn có nghĩa là lãng phí nhiều hơn khi một trang được sử dụng một phần, do đó hệ thống sẽ hết bộ nhớ sớm hơn.
- Mức mô tả MMU sâu hơn có nghĩa là bộ nhớ kernel nhiều hơn cho các bảng trang.
- Cấp độ mô tả MMU sâu hơn có nghĩa là dành nhiều thời gian hơn cho việc duyệt bảng.
Lợi ích của kích thước trang lớn hơn là rất nhỏ đối với hầu hết các ứng dụng, trong khi chi phí là đáng kể. Đây là lý do tại sao hầu hết các hệ thống chỉ sử dụng các trang có kích thước bình thường.
Bạn có thể truy vấn (bình thường) kích thước trang trên hệ thống của bạn với các getconf
tiện ích hoặc chức năng C sysconf
.
$ getconf PAGE_SIZE
4096
Sử dụng các trang lớn đòi hỏi phải gắn hugetlbfs
hệ thống tập tin và mmap
tập tin ping ở đó.