Bạn nên đọc các dmesg
giá 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_pfn
là số khung trang cao nhất ( PAGE_SHIFT
ca 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_pages
biế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-e820
trong dmesg
để "nhìn thấy" những lỗ. Bản đồ bộ nhớ được hiển thị ở đó (ngay trên đầu dmesg
ra 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 ở đó.)
MemTotal
trong /proc/meminfo
chỉ 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 init
dữ liệu mà nó không cần nữa, vì vậy giá trị được báo cáo /proc/meminfo
có 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.
( meminfo
Sử 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.c
quá qua free_all_bootmem()
mà chính nó là ở mm/bootmem.c
cho nhân phi NUMA.)