2012-06-28 33 views
5

Không gian địa chỉ ảo của người dùng cho x86-64 với Linux dài 47 bit. Về cơ bản, Linux có thể lập bản đồ quy trình với khoảng ~ 128 TB dải địa chỉ ảo.Linux hỗ trợ nhiều hơn 512GB dải địa chỉ ảo trong x86-64 như thế nào?

Tuy nhiên, điều gây nhầm lẫn cho tôi rằng kiến ​​trúc x86-64 hỗ trợ bảng trang phân cấp cấp 4 được xác định ISA (được sắp xếp dưới dạng cây gốc) cho mỗi quy trình. Gốc của bảng trang chỉ có thể ánh xạ tới 512 GB không gian địa chỉ ảo tiếp giáp. Vậy Linux có thể hỗ trợ nhiều hơn 512GB dải địa chỉ ảo như thế nào? Nó có sử dụng nhiều bảng trang cho mỗi quá trình không? Nếu có, sau đó cho một quá trình những gì nên CR3 (x86-64 của đăng ký để chứa địa chỉ của cơ sở của bảng trang) chứa cho bất kỳ quy trình nhất định? Tui bỏ lỡ điều gì vậy?

Trả lời

7

Gốc của bảng trang chỉ có thể ánh xạ tới 512 GB không gian địa chỉ ảo tiếp giáp. Vậy Linux có thể hỗ trợ nhiều hơn 512GB dải địa chỉ ảo như thế nào? Nó có sử dụng nhiều bảng trang cho mỗi quá trình không? Nếu có, sau đó cho một quá trình những gì nên CR3 (x86-64 của đăng ký để chứa địa chỉ của cơ sở của bảng trang) chứa cho bất kỳ quy trình nhất định? Tui bỏ lỡ điều gì vậy?

Tôi không biết điều gì làm bạn có ý nghĩa bởi "thư mục gốc của bảng trang", nhưng phân trang trên x86-64 trông như thế này:

  • bảng Trang - mức thấp nhất của cấu trúc phân trang. Mỗi mục có 512 mục 8 byte (PTE) mô tả một trang 4 KiB, do đó, PT mô tả 512 * 4 KiB = 2 MiB bộ nhớ (nó cũng có thể hoạt động như 2 trang MiB, nhưng chúng ta hãy để nó ngay bây giờ).
  • Thư mục trang - bảng, tương tự như PT, chứa 512 mục 8 byte (PDE) trỏ đến PT; do đó, PD mô tả 512 * 2 MiB = 1 GiB bộ nhớ (nó cũng có thể hoạt động như 1 trang GiB, tương tự với PT).
  • Bảng trang thư mục trang - tương tự như PD, nhưng chứa 512 mục 8 byte (PDPTE) trỏ đến PD; vì vậy, PDPTE mô tả 512 * 1 Gib = 512 GiB bộ nhớ.
  • PML4, mức cấu trúc phân trang cao nhất, là bảng chứa 512 mục 8 byte (PML4E) trỏ đến PDPT; vì vậy, PML4 mô tả 512 * 512 GiB = 256 TiB bộ nhớ.

Tôi không biết bản đồ bộ nhớ chính xác của Linux, nhưng có lẽ là nửa cao hơn (từ -128 TiB tỉ số 0 - từ 0xFFFF800000000000 để 0xFFFFFFFFFFFFFFFF) được dành riêng cho hạt nhân, nửa dưới (0-128 TiB - từ 0x0000000000000000 đến 0x00007FFFFFFFFFFF) dành cho các ứng dụng không gian người dùng. Vì vậy, Linux hỗ trợ 512 lần 512 GiB của dải địa chỉ ảo mà bạn đang yêu cầu; thậm chí Torvalds cũng không nói "chúng tôi sẽ không hỗ trợ PML4". Tôi không biết điều gì khiến bạn bối rối - đó có phải là sự thật bạn đã bỏ lỡ phần nói rằng bảng trang lập bản đồ 2 MiB và bạn đã lấy nó khi nó bản đồ một trang - 4 KiB - nhưng nếu có bất cứ điều gì tôi có thể làm rõ, hãy hỏi về nó.

+0

Cảm ơn bạn đã làm rõ.Tôi đã đánh cắp một cấp độ và do đó sự nhầm lẫn. Bây giờ đã rõ rồi. – Arka

0

Thông thường, quá trình xử lý không gian địa chỉ không được chia sẻ, có nghĩa là các bảng trang liên quan không được chia sẻ giữa các quy trình riêng biệt. Và điều đó có nghĩa là ở tất cả 4 cấp độ bảng.

Tất nhiên, phần chung (hạt nhân) luôn có mặt trong tất cả các không gian địa chỉ, vì vậy, trên thực tế, có một số chia sẻ, nhưng bộ nhớ chỉ có thể truy cập vào hạt nhân.

Ngoài ra, thực tế, mọi quy trình đều có bảng trang riêng của mình khá nhiều và không có vấn đề gì khi sử dụng tất cả địa chỉ 2 trong bất kỳ địa chỉ nào trong số đó. Ít nhất, không có giới hạn đặc biệt trên một phần của CPU, mặc dù có thể có trên một phần của hệ điều hành.

Các vấn đề liên quan