Tại sao Debian Linux cho phép không gian địa chỉ ảo tối đa 128TiB trên mỗi tiến trình mà chỉ là bộ nhớ vật lý 64TiB?


23

Tôi chỉ đọc ở đây :

  • lên tới 128TiB không gian địa chỉ ảo trên mỗi quy trình (thay vì 2GiB)
  • Hỗ trợ bộ nhớ vật lý 64TiB thay vì 4GiB (hoặc 64GiB với tiện ích mở rộng PAE)

Tại sao vậy? Ý tôi là, sự hỗ trợ bộ nhớ vật lý đang bị giới hạn bởi kernel hoặc bởi phần cứng hiện tại?

Tại sao bạn cần gấp đôi không gian bộ nhớ ảo so với bộ nhớ vật lý mà bạn thực sự có thể giải quyết?


Bạn cũng có thể thêm trao đổi.
Thorbjørn Ravn Andersen

2
đó là rất nhiều RAM ...
dalearn

4
@dalearn - bạn biết đấy, khi tôi mới biết rằng bạn có thể mở rộng bộ nhớ chuyển đổi ngân hàng cho micros 8 bit cho phép chúng có tới 4096KB, tôi đã nói chính xác điều tương tự ...
Jules

Câu trả lời:


35

Những giới hạn đó không đến từ Debian hoặc từ Linux, chúng đến từ phần cứng. Các kiến ​​trúc khác nhau (bộ xử lý và bus bộ nhớ) có những hạn chế khác nhau.

Trên các bộ xử lý PC x86-64 hiện tại, MMU cho phép 48 bit không gian địa chỉ ảo . Điều đó có nghĩa là không gian địa chỉ được giới hạn ở 256TB. Với một bit để phân biệt địa chỉ kernel với địa chỉ người dùng, để lại 128TB cho không gian địa chỉ của quy trình.

Trên các bộ xử lý x86-64 hiện tại, địa chỉ vật lý có thể sử dụng tối đa 48 bit , có nghĩa là bạn có thể có tối đa 256TB. Giới hạn đã tăng dần kể từ khi kiến ​​trúc amd64 được giới thiệu (từ 40 bit nếu tôi nhớ lại chính xác). Mỗi bit của không gian địa chỉ tốn một số logic nối dây và giải mã (làm cho bộ xử lý đắt hơn, chậm hơn và nóng hơn), vì vậy các nhà sản xuất phần cứng có động cơ để giảm kích thước.

Linux chỉ cho phép các địa chỉ vật lý lên tới 2 ^ 46 (vì vậy bạn chỉ có thể có tối đa 64TB) vì nó cho phép bộ nhớ vật lý được ánh xạ hoàn toàn trong không gian kernel. Hãy nhớ rằng có 48 bit không gian địa chỉ; một bit cho kernel / user để lại 47 bit cho không gian địa chỉ kernel. Một nửa số đó tại hầu hết các địa chỉ bộ nhớ vật lý trực tiếp và nửa còn lại cho phép kernel ánh xạ bất cứ thứ gì nó cần. (Linux có thể đối phó với bộ nhớ vật lý không thể được ánh xạ đầy đủ cùng một lúc, nhưng điều đó mang lại sự phức tạp bổ sung, do đó, nó chỉ được thực hiện trên các nền tảng mà nó yêu cầu, chẳng hạn như x86-32 với PAE và armv7 với LPAE.)

Nó hữu ích cho bộ nhớ ảo lớn hơn bộ nhớ vật lý vì nhiều lý do:

  • Nó cho phép kernel ánh xạ toàn bộ bộ nhớ vật lý và còn chỗ trống cho các cặp bản đồ ảo.
  • Ngoài các ánh xạ của bộ nhớ vật lý, còn có các ánh xạ hoán đổi, các tệp và trình điều khiển thiết bị.
  • Thật hữu ích khi có bộ nhớ chưa được ánh xạ ở những nơi: các trang bảo vệ để bắt tràn bộ đệm , các vùng chưa được xử lý lớn do ASLR , v.v.

9
Giới hạn 46 bit trên bộ nhớ vật lý có liên quan đến bản đồ bộ nhớ Linux : nó bao gồm ánh xạ toàn bộ bộ nhớ vật lý trong không gian kernel, có nghĩa là bộ nhớ vật lý chỉ có thể tương ứng với một phần tư không gian địa chỉ khả dụng.
Stephen Kitt

Bất cứ ai cũng có thể giải thích về nhận xét @StephenKitt? Tôi rất quan tâm đến việc hiểu điều đó nhưng ngay cả sau khi đọc tài liệu tham khảo, anh ấy đã trích dẫn tôi không hiểu;)
gsi-frank

@ gsi-frank Thật thuận tiện cho kernel có toàn bộ bộ nhớ vật lý được ánh xạ vĩnh viễn. Vì vậy, trong không gian địa chỉ 2 ^ 48, 2 ^ 47 chuyển đến địa chỉ người dùng, 2 ^ 46 chuyển đến địa chỉ kernel và 2 ^ 46 dành cho địa chỉ bộ nhớ vật lý.
Gilles 'SO- ngừng trở nên xấu xa'

@ gsi-frank Nếu bạn có thể giữ một bản sao của cuốn sách kinh điển " Phát triển hệ điều hành 32 bit của riêng bạn ", nó đi sâu vào lý do đáng kể về lý do tác giả đưa ra quyết định tương tự cho hệ điều hành của chính mình (trong trường hợp đó, chia không gian địa chỉ ảo 4GiB của 80386 thành phân đoạn nhân 2GiB chứa ánh xạ RAM vật lý 1GiB và phân khúc người dùng 2GiB). Bất cứ ai quan tâm đến nội bộ hệ điều hành có lẽ nên đọc nó - nó cung cấp một thiết kế đầy đủ đơn giản để hiểu nhưng đủ nâng cao để trở thành nhân hệ điều hành hữu ích.
Jules

Kể từ phiên bản 4.13 của kernel, x86-64 (và một số kiến ​​trúc khác) có thể được xây dựng với các phân trang năm cấp , giúp tăng không gian địa chỉ trên x86-64 lên 52 bit cho RAM vật lý và 57 bit cho ảo (4 PiB / 128 PiB). Lưu ý rằng bản đồ bộ nhớ trong không gian kernel đưa ra các vấn đề bảo mật để có thể thay đổi trong tương lai gần.
Stephen Kitt

9

Tôi không biết tại sao, nhưng tôi có thể nghĩ ra bảy lý do tại sao nó hữu ích để hỗ trợ gấp đôi không gian địa chỉ so với bộ nhớ vật lý.

  1. Đầu tiên là để bạn có thể chạy các ứng dụng cần thêm bộ nhớ - ngay cả khi nó có nghĩa là đổi sang đĩa.
  2. Bố trí bộ nhớ sạch hơn để sử dụng bộ nhớ phân vùng. Ví dụ, một hệ điều hành có thể lấy các địa chỉ được đánh số cao hơn và để lại các địa chỉ được đánh số thấp hơn cho các ứng dụng để làm sạch tách.
  3. Ngẫu nhiên bố trí không gian địa chỉ là một chút hiệu quả.
  4. Đánh dấu các trang là thực thi có thể có nghĩa là bộ nhớ còn sót lại.
  5. I / O được ánh xạ bộ nhớ.
  6. Phân bổ bộ nhớ dễ dàng hơn: người ta có thể phân bổ các khối lớn hơn tại một thời điểm.
  7. Giảm phân mảnh bộ nhớ

1
Cảm ơn! 1) quá rõ ràng và cơ bản đến nỗi tôi cảm thấy xấu hổ cho câu hỏi này;)
gsi-frank

2
(3) cũng thực sự quan trọng. Bạn thực sự muốn một không gian địa chỉ ảo có độ lớn lớn hơn dung lượng bộ nhớ bạn sẽ phân bổ để những dự đoán ngẫu nhiên gần như chắc chắn dẫn đến bẫy.
R ..

6

Đó là những hạn chế về phần cứng. Phần cứng x86_64 / amd64 hiện tại cho phép các địa chỉ ảo 48 bit và kích thước khác nhau (tùy thuộc vào triển khai, ví dụ, máy trạm của tôi ở đây chỉ hỗ trợ 36 bit) địa chỉ vật lý. Nhân Linux chia đôi không gian địa chỉ ảo (sử dụng một nửa cho kernel, một nửa cho không gian người dùng, giống như trên x86).

Vì vậy, bạn nhận được:

2⁴⁸ byte 2 = 2⁴⁷ byte = 128 TiB

Kích thước địa chỉ vật lý thường nhỏ hơn vì nó thực sự là vật lý. Nó chiếm các chân / miếng đệm, bóng bán dẫn, kết nối, v.v., trên / trong CPU và các đường dấu vết trên bảng. Có lẽ cũng giống như vậy trong các chipset. Thật vô nghĩa khi hỗ trợ một lượng ram không thể tưởng tượng được qua tuổi thọ thiết kế của lõi xử lý hoặc ổ cắm, tất cả những thứ đó đều phải trả tiền. (Ngay cả với 32 khe DIMM và mỗi DIMM 64GiB, bạn vẫn chỉ ở mức 2TiB. Ngay cả khi công suất DIMM tăng gấp đôi hàng năm, chúng tôi cách 64TiB 5 năm.

Như Peter Cordes chỉ ra, mọi người hiện đang gắn bộ lưu trữ không bay hơi như 3D XPoint vào bus bộ nhớ, điều này khiến cho không gian địa chỉ có thể hiểu được. Các bộ xử lý mới hơn đã mở rộng không gian địa chỉ vật lý lên 48 bit; có thể wiki Debian chưa được cập nhật.


Bộ nhớ không bay hơi được kết nối trực tiếp với bus bộ nhớ (ví dụ 3D XPoint) đang trở thành một thứ và điều này có thể làm tăng đáng kể nhu cầu về không gian địa chỉ vật lý trong vài năm tới (vì nó dày hơn DRAM và rất hữu ích khi có tải trọng thuyền trong nhiều trường hợp hơn là rất hữu ích khi có tải thuyền RAM). Xem zdnet.com/article/the-non-voliverse-memory-revolution để biết bài viết không mang tính kỹ thuật cao (hoặc google để biết nội dung tốt hơn). Intel Skylake hỗ trợ nó clflushclflushopthướng dẫn.
Peter Cordes

1
Bạn đã có thể mua các hệ thống có tối đa 12TiB RAM trong 96 khe cắm ( ví dụ: hệ thống HPC bốn ổ cắm của Tyan ), vì vậy 64TiB có thể còn ít hơn năm năm nữa. Và một số người mua chúng và lắp chúng với bộ nhớ RAM đó ...
Stephen Kitt

@StephenKitt hmm, không sao vì công suất DIMM mất gần 3 năm để tăng gấp đôi 😁
derobert

Hóa ra bạn thực sự có thể mua các hệ thống có 64 TiB RAM ngay bây giờ.
Stephen Kitt
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.