查看: 745|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    昨天 11:22
  • 签到天数: 134 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2023-11-24 09:24:19 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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);
    复制代码

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

    meminfo1.png

    从输出的信息可知
    • 共有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 查看下进行对比
    meminfo2.png


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


    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-6-1 23:31 , Processed in 0.106634 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.