回答

收藏

[评测分享] 【米尔 MYD-YM62X 开发板入门评测】 8.获取系统内存信息试验

#板卡评测 #板卡评测 1957 人阅读 | 0 人回复 | 2023-11-24

本帖最后由 andeyqi 于 2023-11-24 11:09 编辑

简介:

Linux 内核对每个物理页面采用struct page数据结构来描述,每个page 的大下通常是4K的方式来管理的,并将struct page 存储到一个全局的数组mem_map[],他们的对应关系是1:1的线性映射,内核里提供了很多page信息获取的api函数,我们基于此来读取下当前内存的状态信息。

使用如下测试代码:
  1. #include <linux/version.h>
  2. #include <linux/module.h>
  3. #include <linux/init.h>
  4. #include <linux/mm.h>

  5. #define PRT(a, b) pr_info("%-15s=%10d %10ld %8ld\n", \
  6.                          a, b, (PAGE_SIZE*b)/1024, (PAGE_SIZE*b)/1024/1024)

  7. static int __init my_init(void)
  8. {
  9.         struct page *p;
  10.         unsigned long i, pfn, valid = 0;
  11.         int free = 0, locked = 0, reserved = 0, swapcache = 0,
  12.             referenced = 0, slab = 0, private = 0, uptodate = 0,
  13.             dirty = 0, active = 0, writeback = 0, mappedtodisk = 0;

  14.         unsigned long num_physpages;

  15.         num_physpages = get_num_physpages();
  16.         for (i = 0; i < num_physpages; i++) {

  17.                 /* Most of ARM systems have ARCH_PFN_OFFSET */
  18.                 pfn = i + ARCH_PFN_OFFSET;
  19.                 /* may be holes due to remapping */
  20.                 if (!pfn_valid(pfn))
  21.                         continue;

  22.                 valid++;
  23.                 p = pfn_to_page(pfn);
  24.                 if (!p)
  25.                         continue;
  26.                 /* page_count(page) == 0 is a free page. */
  27.                 if (!page_count(p)) {
  28.                         free++;
  29.                         continue;
  30.                 }
  31.                 if (PageLocked(p))
  32.                         locked++;
  33.                 if (PageReserved(p))
  34.                         reserved++;
  35.                 if (PageSwapCache(p))
  36.                         swapcache++;
  37.                 if (PageReferenced(p))
  38.                         referenced++;
  39.                 if (PageSlab(p))
  40.                         slab++;
  41.                 if (PagePrivate(p))
  42.                         private++;
  43.                 if (PageUptodate(p))
  44.                         uptodate++;
  45.                 if (PageDirty(p))
  46.                         dirty++;
  47.                 if (PageActive(p))
  48.                         active++;
  49.                 if (PageWriteback(p))
  50.                         writeback++;
  51.                 if (PageMappedToDisk(p))
  52.                         mappedtodisk++;
  53.         }

  54.         pr_info("\nExamining %ld pages (num_phys_pages) = %ld MB\n",
  55.                 num_physpages, num_physpages * PAGE_SIZE / 1024 / 1024);
  56.         pr_info("Pages with valid PFN's=%ld, = %ld MB\n", valid,
  57.                 valid * PAGE_SIZE / 1024 / 1024);
  58.         pr_info("\n                     Pages         KB       MB\n\n");

  59.         PRT("free", free);
  60.         PRT("locked", locked);
  61.         PRT("reserved", reserved);
  62.         PRT("swapcache", swapcache);
  63.         PRT("referenced", referenced);
  64.         PRT("slab", slab);
  65.         PRT("private", private);
  66.         PRT("uptodate", uptodate);
  67.         PRT("dirty", dirty);
  68.         PRT("active", active);
  69.         PRT("writeback", writeback);
  70.         PRT("mappedtodisk", mappedtodisk);

  71.         return 0;
  72. }

  73. static void __exit my_exit(void)
  74. {
  75.         pr_info("Module exit\n");
  76. }

  77. module_init(my_init);
  78. module_exit(my_exit);
复制代码

测试代码编译通过后拷贝至开发板运行结果如下:


从输出的信息可知
  • 共有page 262144*4k = 1024M
  • 空闲page 188200*4k = 735M
  • LOCK page = 0
  • 保留的 page 24434*4k = 95M
  • 交换分区的page = 0
  • slab page 8855*4k = 34M
  • private page 2890*4k = 11M
  • dirty page 2274*4k = 8M
  • mappedtodisk 31252 * 4k = 122M

输入下cat /proc/meminfo 查看下进行对比


因为内存信息是事实动态变化的,可以对比下两个数据基本都是在一个数量级的。


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

3854 积分
6 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条