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.)