Bố cục bộ nhớ nhân ảo trong dmesg ngụ ý gì?


19

Trong khi xem qua "Đầu ra của dmesg" tôi có thể thấy một danh sách các giá trị mà tôi không thể hiểu đúng.

Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
    fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)
    pkmap   : 0xff800000 - 0xffa00000   (2048 kB)
    vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)
    lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)
      .init : 0xc0906000 - 0xc0973000   ( 436 kB)
      .data : 0xc071ae6a - 0xc08feb78   (1935 kB)
      .text : 0xc0400000 - 0xc071ae6a   (3179 kB)

Từ các giá trị tôi hiểu rằng tôi có 2GB RAM (Bộ nhớ vật lý). Nhưng những thứ còn lại dường như là Số ma thuật đối với tôi.

Tôi muốn biết về từng người một (tóm tắt, pkmap, .. vv) một cách ngắn gọn (nếu có nhiều nghi ngờ, tôi sẽ đăng mỗi người một câu hỏi riêng biệt)?

Ai đó có thể giải thích điều đó cho tôi?

Câu trả lời:


22

Trước hết, một hệ thống 32 bit có 0xffffffff( 4'294'967'295) địa chỉ tuyến tính để truy cập vào vị trí vật lý của RAM.
Nhân chia các địa chỉ này thành không gian người dùng và nhân.

Không gian người dùng (bộ nhớ cao) có thể được truy cập bởi người dùng và, nếu cần, cũng bởi kernel.
Phạm vi địa chỉ trong ký hiệu hex và dec:

0x00000000 - 0xbfffffff
0 - 3'221'225'471

Không gian hạt nhân (bộ nhớ thấp) chỉ có thể được truy cập bởi kernel.
Phạm vi địa chỉ trong ký hiệu hex và dec:

0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295

Như thế này:

0x00000000             0xc0000000  0xffffffff 
    |                        |          |
    +------------------------+----------+
    |  User                  |  Kernel  |
    |  space                 |  space   |
    +------------------------+----------+

Do đó, cách bố trí bộ nhớ bạn đã thấy trong dmesg tương ứng với ánh xạ của các địa chỉ tuyến tính trong không gian kernel.

Đầu tiên, các chuỗi .text, .data và .init cung cấp việc khởi tạo các bảng trang riêng của kernel (dịch tuyến tính thành các địa chỉ vật lý).

.text : 0xc0400000 - 0xc071ae6a   (3179 kB)

Phạm vi nơi mã hạt nhân cư trú.

.data : 0xc071ae6a - 0xc08feb78   (1935 kB)

Phạm vi nơi các phân đoạn dữ liệu hạt nhân cư trú.

.init : 0xc0906000 - 0xc0973000   ( 436 kB)

Phạm vi nơi các bảng trang ban đầu của hạt nhân cư trú.

(và 128 kB khác cho một số cấu trúc dữ liệu động.)

Không gian địa chỉ tối thiểu này chỉ đủ lớn để cài đặt kernel trong RAM và khởi tạo cấu trúc dữ liệu cốt lõi của nó.

Kích thước được sử dụng của chúng được hiển thị bên trong dấu ngoặc đơn, ví dụ mã hạt nhân:

0xc071ae6a - 0xc0400000 = 31AE6A

Trong ký hiệu thập phân, đó là 3'255'914 (3179 kB).


Thứ hai, việc sử dụng không gian kernel sau khi khởi tạo

lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)

Phạm vi lowmem có thể được sử dụng bởi kernel để truy cập trực tiếp vào các địa chỉ vật lý.
Đây không phải là 1 GB đầy đủ, vì hạt nhân luôn yêu cầu ít nhất 128 MB địa chỉ tuyến tính để thực hiện cấp phát bộ nhớ không liên tục và địa chỉ tuyến tính được ánh xạ sửa lỗi.

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

Phân bổ bộ nhớ ảo có thể phân bổ các khung trang dựa trên sơ đồ không liên tục. Ưu điểm chính của lược đồ này là để tránh sự phân mảnh bên ngoài, điều này được sử dụng cho các vùng trao đổi, mô-đun hạt nhân hoặc phân bổ bộ đệm cho một số thiết bị I / O.

pkmap   : 0xff800000 - 0xffa00000   (2048 kB)

Ánh xạ kernel vĩnh viễn cho phép kernel thiết lập ánh xạ lâu dài của các khung trang có bộ nhớ cao vào không gian địa chỉ kernel. Khi trang HIGHMEM được ánh xạ bằng kmap (), địa chỉ ảo được gán từ đây.

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

Đây là các địa chỉ tuyến tính được ánh xạ có thể tham chiếu đến bất kỳ địa chỉ vật lý nào trong RAM, không chỉ 1 GB cuối cùng như các địa chỉ lowmem. Các địa chỉ tuyến tính được ánh xạ sửa chữa hiệu quả hơn một chút so với các đồng nghiệp lowmem và pkmap của họ. Có các mô tả bảng trang chuyên dụng được chỉ định cho ánh xạ cố định và ánh xạ của các trang HIGHMEM sử dụng kmap_atomic được phân bổ từ đây.


Nếu bạn muốn lặn sâu hơn vào lỗ thỏ:
Tìm hiểu về Hạt nhân Linux


Cảm ơn câu trả lời tuyệt vời này. Tôi muốn biết tại sao mem thấp không đầy đủ 1GB và nhiều hơn về phần tiếp theo của câu "bởi vì kernel luôn yêu cầu ít nhất 128 MB địa chỉ tuyến tính để thực hiện cấp phát bộ nhớ không liên tục và địa chỉ tuyến tính được ánh xạ sửa lỗi."
Sen

Kernel truy cập mã bộ nhớ cao bất cứ lúc nào (fe BIOS và ACPI thông tin cư trú trên MB đầu tiên của RAM), anh không thể làm điều đó trực tiếp (như các khu vực bộ nhớ lowmem), do đó anh ta cần để lập bản đồ bộ nhớ thấp đến địa chỉ tuyến tính bộ nhớ cao, 128MB chỉ dành riêng cho mục đích này. Khu vực vmalloc chủ yếu được ánh xạ tạm thời vào một số khu vực bộ nhớ cao và được ánh xạ lại khá nhanh.
wag

Vậy các trang được thiết lập bởi kernel cho cuộc gọi hệ thống ảo cũng là một phần của fixmap ??? Tôi gặp phải câu hỏi này vì tôi muốn biết chính xác những gì nằm trong trang có địa chỉ fffb5000, fffa1000, v.v ... Tôi đang kiểm tra lại bản ghi máy ảo của mình vì nhiều CPU ảo truy cập trang này rất nhiều .... làm thế nào Tôi biết chính xác những gì trong địa chỉ này ... TRẢ LỜI TUYỆT VỜI :)
Dù sao thì
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.