Làm thế nào là kích thước trang được xác định trong không gian địa chỉ ảo?


43

Linux sử dụng hệ thống bộ nhớ ảo trong đó tất cả các địa chỉ là địa chỉ ảo chứ không phải địa chỉ vật lý. Các địa chỉ ảo này được bộ xử lý chuyển đổi thành địa chỉ vật lý.

Để làm cho bản dịch này dễ dàng hơn, bộ nhớ ảo và vật lý được chia thành các trang. Mỗi trang này được cung cấp một số duy nhất; số khung trang.

Một số kích thước trang có thể là 2 KB, 4 KB, v.v ... Nhưng số lượng kích thước trang này được xác định như thế nào? Có bị ảnh hưởng bởi kích thước của kiến ​​trúc? Ví dụ: xe buýt 32 bit sẽ có không gian địa chỉ 4 GB.

Câu trả lời:


56

Bạn có thể tìm ra kích thước trang mặc định của hệ thống bằng cách truy vấn cấu hình của nó thông qua getconflệnh:

$ getconf PAGE_SIZE
4096

hoặc là

$ getconf PAGESIZE
4096

GHI CHÚ: Các đơn vị trên thường tính bằng byte, vì vậy 4096 tương đương với 4096 byte hoặc 4kB.

Điều này được cài đặt sẵn trong nguồn của nhân Linux ở đây:

Thí dụ

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

Làm thế nào để thay đổi cung cấp cho bạn 4096?

Khi bạn dịch chuyển bit, bạn đang thực hiện phép nhân nhị phân với 2. Vì vậy, trong thực tế, việc dịch chuyển bit sang trái ( 1 << PAGE_SHIFT) đang thực hiện phép nhân 2 ^ 12 = 4096.

$ echo "2^12" | bc
4096

2
Phần cứng hiện đại hỗ trợ 2MB và một số 1GB, kích thước trang. "PAGE_SHIFT" có thể được đặt thành 21 cho các trang 2MB làm mặc định cho bản dựng kernel không?
ReverseFlow

2
@ReverseFlow Để có được một câu trả lời như vậy, tôi sẽ hỏi một câu hỏi riêng.
Kirill Bulygin

@sim, tự hỏi tại sao các thao tác bit được sử dụng ở đây? tôi đọc trình biên dịch đó thường chuyển đổi các phép nhân thành các thao tác bit, do đó cho hiệu suất tương tự.
InAFlash

17

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_PAGElà cần thiết và CONFIG_HUGETLBFScũ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 getconftiệ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 hugetlbfshệ thống tập tin và mmaptập tin ping ở đó.


FYI: Sử dụng các trang lớn không yêu cầu phải cài đặt hugetlbfs, vì tài liệu kernel đó ghi chú ở phía dưới, bạn cũng có thể sử dụng các cuộc gọi bộ nhớ dùng chung hoặc cờ mmap. Ngoài ra, thú vị hơn, bạn có thể kích hoạt các trang lớn trong suốt, sau đó kernel sẽ tự động chuyển đổi các trang bình thường thành các trang lớn khi có thể trên tất cả các ứng dụng.
derobert

Đây là câu trả lời thực sự cơ bản. Linux chỉ được thiết kế để sử dụng tốt phần cứng phân trang. Thêm chi tiết về phân trang: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli 改造 心 心 事件

0

Kích thước trang phụ thuộc chủ yếu vào kiến ​​trúc bộ xử lý. Trên x86, từ thời của bộ xử lý 386 đã giới thiệu chế độ được bảo vệ, kích thước trang là 4 kB.

Trong chế độ x64, cũng có thể có các trang khổng lồ, có kích thước 2 MB. Tuy nhiên, sử dụng chúng là một chút phức tạp.

Bạn có thể tìm thêm thông tin về kích thước trang trong bài viết Wikipedia


0

Bộ xử lý xác định kích thước trang có sẵn. Đối với hầu hết các mục đích, kích thước trang được triển khai phần cứng trên bộ xử lý x86 và x86_64 là 4kb. Tuy nhiên, hệ điều hành có thể phân bổ nhiều trang cùng một lúc nếu muốn và do đó triển khai hiệu quả các trang 8kb, 16kb hoặc 32kb trong phần mềm.

Bộ xử lý x86 và x86_64 tương ứng cũng có thể xen kẽ các trang 4mb và 2mb cùng với các trang 4kb tiêu chuẩn. Nếu khả năng đó được sử dụng ở tất cả, nó chủ yếu sẽ được sử dụng để phân bổ không gian kernel.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.