Kích thước trang bộ nhớ mặc định của hạt nhân Linux trên kiến trúc x86 là 4 KB, tôi tự hỏi nó được tính như thế nào và tại sao?Tại sao kích thước trang của Linux (x86) 4 KB, được tính như thế nào?
Trả lời
Kích thước trang mặc định được cố định bởi những gì MMU (bộ quản lý bộ nhớ) của CPU hỗ trợ. Trong 32-bit bảo vệ chế độ x86 hỗ trợ hai loại trang:
- người bình thường, 4 KiB
- người lớn, 4 MiB
Không phải tất cả các bộ xử lý x86 hỗ trợ các trang lớn. Một cần phải có một CPU với khả năng mở rộng kích thước trang (PSE). Điều này loại trừ các bộ xử lý trước Pentium. Hầu như tất cả các CPU x86 thế hệ hiện tại thực hiện nó.
4 KiB phổ biến rộng rãi trang chi tiết trong các kiến trúc khác. Người ta có thể cho rằng kích thước này xuất phát từ việc phân chia địa chỉ virut 32 bit thành hai chỉ mục 10 bit trong các thư mục/bảng trang và 12 bit còn lại cho kích thước trang 4 KiB.
Tôi nhận này từ bài viết wikipedia và tôi trích dẫn:
Kích thước trang thường được xác định bởi kiến trúc vi xử lý
Kiểm tra các bài viết dưới đây:
That depends on the processor architecture.
Kích thước trang mặc định là 4 KB trên nhiều kiến trúc. Nó thường có thể được tăng lên (đôi khi rất nhiều, chẳng hạn như 1GB của AMD64) bằng cách chuyển sang chế độ huge page. Điều này cho phép bảng trang nhỏ hơn, điều này có thể dẫn đến cải thiện hiệu suất.
Thiết kế của 4KB kích thước trang bình thường của kiến trúc 32-bit thực sự là rất thú vị :)
Và tôi muốn thêm một câu trả lời thêm để chứng minh tại sao nó là hợp lý.
x86 sử dụng '2-pass' để dịch địa chỉ bộ nhớ ảo thành địa chỉ bộ nhớ vật lý.
Giả sử cả thư mục trang và bảng trang chứa mục nhập và kích thước trang là byte. Để tận dụng tối đa địa chỉ , ta có:
Mỗi mục trong thư mục trang/table tiêu thụ 4 bytes (32-bit), do đó:
Do đó y = 12 và kích thước trang tính theo byte sẽ là = = 4KB.
Và còn '1-pass' thì sao? Điều này là thú vị bởi vì một cách logic, chúng ta có thể sử dụng một bảng trang đơn để tra cứu địa chỉ.
Giả sử rằng thư mục trang chứa các mục nhập , mỗi mục ánh xạ địa chỉ đến trang tương ứng và kích thước trang là byte.
Một lần nữa, để tận dụng tối đa địa chỉ, chúng ta cần:
Và:
Chúng tôi nhận được y = 17, và kích thước trang là = = 128KB.
Dù sao, công việc này "hợp lý". Nếu chúng tôi giới thiệu TLB, kích thước bộ nhớ lớn như vậy sẽ là một di chuyển: các trang bộ nhớ sẽ khó để phù hợp với TLB và thiết kế sẽ không hiệu quả.
Chúng tôi cũng có thể cho rằng, trong phiên bản '2-pass', thư mục trang và bảng trang có thể có các kích thước khác nhau. Tuy nhiên, điều này có nghĩa là chúng tôi sẽ sử dụng thư mục trang lớn hơn, sẽ chiếm nhiều hơn một trang bộ nhớ. Đáng buồn thay, mỗi khi một quá trình người dùng mới được sinh ra, cho thư mục trang của riêng nó, hệ điều hành phải phân bổ các trang kế tiếp, không được thiết kế thanh lịch.
Thuật ngữ thông thường là "bảng trang 2 cấp", không phải "2 lần". ví dụ. [x86-64 sử dụng bảng trang 4 cấp] (https://stackoverflow.com/questions/46509152/why-in-64bit-the-virtual-address-are-4-bits-short-48bit-long-compared -with-the) (vẫn với 4k trang thông thường, nhưng hugepages là 2M hoặc 1G thay vì 4M.) –
Phần bảng trang 1 cấp của bạn tạo ra một giả thiết không cần thiết: Bản thân trang bảng không * có * thành 1 trang trong kích thước. Bạn có thể có các trang nhỏ hơn (và một bảng trang phẳng lớn hơn nữa).Những gì hút khoảng 1 cấp là kích thước bảng trang: một quá trình chỉ với một lượng nhỏ bộ nhớ được ánh xạ có thể có một cây thưa thớt chỉ với một vài bảng trang cấp dưới cùng. TLB không phải là vấn đề gì cả; mỗi TLB chứa bản dịch đầy đủ từ tất cả các cấp của bảng trang, vì vậy các trang lớn hơn có nghĩa là các bit trang ít hơn, có nghĩa là một CAM nhỏ hơn. Và ít hơn các mục TLB bao gồm nhiều bộ nhớ hơn. –
Tôi thêm câu trả lời/nhận xét này vì việc tính toán sleepsort rất thú vị, tôi phải thêm nó vào trang web của mình (với việc nhắc đến nguồn của khóa học). Câu trả lời (có thể) cho câu hỏi cách bạn có thể tính toán các trang được lập trình có thể được tìm thấy here. Cách nó được tính toán như đã đề cập bởi sleepsort là rất thú vị. Tôi đã làm tương tự cho x86_64 và kết quả không phải là những gì tôi mong đợi. Tuy nhiên đọc thêm trên memory management x86_64 Tôi thấy rằng đối với 64 bit intel, 16 bit không được sử dụng, để lại nó 48 bit để chúng tôi tính toán. 9 bit cho cành cây bộ nhớ, mỗi nhánh khác 9 bit, tại đây trong 9 số khác cho các chi nhánh và cuối cùng là 9 bit cho lá của cành cuối cùng. Vì vậy, 48 - 36 = 12 bit cho mỗi địa chỉ trong trang bộ nhớ. 2^12 = 4096 như đã đề cập trước đó bởi sleepsort. Tôi chỉ tự hỏi có bao nhiêu đường chuyền kiến trúc này là, 3 hoặc 4 (nếu có ai có thể giải thích đó) sau tính sleepsort của:
2^x * 2^x * 2^x * 2^x * 2^y = 2^48
4x + y = 48
this time we have 8 bytes for each address (8 bytes * 8 bits/byte = 64 bits)
2^y/2^3 = 2^x
y - 3 = x
filled in in previous equation:
4(y - 3) + y = 48
4y - 12 + y = 48
5y = 60
y = 12
because 2^y represents the pagesize, the size = 2^12 = 4096 bytes
Để lại tôi với câu hỏi "những gì về những trang lớn trong Linux"?
- 1. Cách lấy Kích thước (KB) của UIImage
- 2. php làm thế nào để có được kích thước hình ảnh web trong kb?
- 3. Toán tử C++ sizeof tính kích thước như thế nào?
- 4. Nhiều kích cỡ bảng ghim trong Linux (x86-64)?
- 5. Android tính toán bộ nhớ cache và kích thước dữ liệu như thế nào?
- 6. Zurb's Foundation 4 tính toán Typography như thế nào?
- 7. Tại sao "Kích thước bộ nhớ được phép cạn kiệt"?
- 8. Em được tính như thế nào?
- 9. Tại sao sizeof (param_array) là kích thước của con trỏ?
- 10. Làm thế nào để có được kích thước của một hình ảnh được tổ chức tại một mảng byte trong KB
- 11. Bạn thay đổi kích thước của ImageView như thế nào?
- 12. Linux hỗ trợ nhiều hơn 512GB dải địa chỉ ảo trong x86-64 như thế nào?
- 13. Tại sao C99 phàn nàn về kích thước lưu trữ?
- 14. Tính kích thước sao lưu DB
- 15. Kích thước danh sách Java() hoạt động như thế nào?
- 16. Làm cách nào để thay đổi kích thước trang của SQL Server?
- 17. Ghi đè hiển thị của giới hạn kích thước trang/giới hạn kích thước StreamReader?
- 18. Kích thước tệp vỏ linux
- 19. Tính toán kích thước của một mảng
- 20. Trình biên dịch xác định kích thước của cấu trúc bitfield như thế nào?
- 21. Tại sao tính năng kiểm tra của Chrome khuyên tôi nên giảm thiểu kích thước cookie?
- 22. Tại sao kích thước của một dict trống giống như một dict không trống trong Python?
- 23. Tại sao Chrome bỏ qua thuộc tính "kích thước" của đầu vào văn bản?
- 24. Bạn kích thước nút jQuery như thế nào?
- 25. Kích thước của hộp văn bản đầu vào được xác định bằng HTML như thế nào?
- 26. tại sao kích thước tham chiếu luôn là 4 byte - C++
- 27. Làm thế nào để có được kích thước của màn hình hiện tại trong WPF?
- 28. RectangleGeometry với kích thước tương đối ... như thế nào?
- 29. Hệ điều hành biết kích thước thực của bộ nhớ vật lý như thế nào?
- 30. Đo kích thước thư viện trong Linux
Chuông 4M chỉ dành cho chế độ 32 bit x86. 64-bit x86 sử dụng các ôm 2M hoặc 1G, vì định dạng trang bảng 4 cấp sử dụng 9 bit cho mỗi cấp độ. https://stackoverflow.com/questions/46509152/why-in-64bit-the-virtual-address-are-4-bits-short-48bit-long-compared-with-the. (Kích thước trang không lớn vẫn là 4k ở chế độ dài, vì vậy bộ đệm L1DTLB và L1D vẫn có thể hoạt động giống nhau, trong số các lý do khác.) –
@PeterCordes, cảm ơn bạn đã bình luận của bạn. Tôi đã thực sự giải quyết các chế độ 32-bit chỉ và đó là những gì tôi thường biểu thị bằng x86. –