Tại sao Linux hiển thị cả bộ nhớ nhiều hơn và ít hơn tôi đã cài đặt?


11

Tôi biết về trao đổi - câu hỏi này không phải là về điều đó. Trong dmesg, nhân Linux (x86-64) cho tôi biết điều này về dung lượng bộ nhớ tôi có:

[    0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)

cat /proc/meminfo nói với tôi rằng tôi có

MemTotal:        3910472 kB

Và theo tính toán của tôi, tôi nghĩ rằng tôi nên có chính xác RAM 4 * 1024 * 1024 = 4194304k. Đó là cách nhỏ hơn con số thứ hai trong dòng dmesg ở trên!

Những gì với tất cả những con số khác nhau?

Nhân tiện, uname -ađầu ra:

Linux pavilion 3.2.2-1.fc16.x86_64 #1 SMP Thu Jan 26 03:21:58 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Câu trả lời:


20

Bạn nên đọc các dmesggiá trị "Bộ nhớ Akb / Bkb khả dụng" dưới dạng:

Hiện có A để sử dụng và số khung trang cao nhất của hệ thống nhân với kích thước trang là B.

Đây là từ arch/x86/mm/init_64.c:

printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
                 "%ldk absent, %ldk reserved, %ldk data, %ldk init)\n",
                 nr_free_pages() << (PAGE_SHIFT-10),
                 max_pfn << (PAGE_SHIFT-10),
                 codesize >> 10,
                 absent_pages << (PAGE_SHIFT-10),
                 reservedpages << (PAGE_SHIFT-10),
                 datasize >> 10,
                 initsize >> 10);

nr_free_pages()trả về dung lượng bộ nhớ vật lý, được quản lý bởi kernel, hiện không được sử dụng. max_pfnlà số khung trang cao nhất ( PAGE_SHIFTca làm việc chuyển đổi thành kb). Số khung trang cao nhất có thể cao hơn (nhiều) so với những gì bạn mong đợi - ánh xạ bộ nhớ được thực hiện bởi BIOS có thể chứa các lỗ hổng.
Các lỗ này chiếm bao nhiêu được theo dõi bởi absent_pagesbiến, được hiển thị dưới dạng kB absent. Điều này sẽ giải thích hầu hết sự khác biệt giữa số thứ hai trong đầu ra "có sẵn" và RAM được cài đặt thực tế của bạn.

Bạn có thể grep cho BIOS-e820trong dmesgđể "nhìn thấy" những lỗ. Bản đồ bộ nhớ được hiển thị ở đó (ngay trên đầu dmesgra sau khi khởi động). Bạn sẽ có thể thấy những địa chỉ vật lý nào bạn có RAM thực, có thể sử dụng được.
(Các quirks x86 khác và các vùng bộ nhớ dành riêng có thể chiếm phần còn lại - Tôi không biết chi tiết ở đó.)

MemTotaltrong /proc/meminfochỉ ra RAM có sẵn để sử dụng. Ngay ở phần cuối của chuỗi khởi động, hạt nhân giải phóng initdữ liệu mà nó không cần nữa, vì vậy giá trị được báo cáo /proc/meminfocó thể cao hơn một chút so với hạt nhân in ra trong các phần ban đầu của chuỗi khởi động.

( meminfoSử dụng gián tiếp totalram_pagesđể trưng bày đó. Đối với x86_64, điều này được tính toán trong arch/x86/mm/init_64.cquá qua free_all_bootmem()mà chính nó là ở mm/bootmem.ccho nhân phi NUMA.)

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.