免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: s.t_seeyou
打印 上一主题 下一主题

需要从kernel 中得到内存的大小,从那里得到比较方便? [复制链接]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
11 [报告]
发表于 2009-12-08 16:15 |只看该作者
void __init mem_init(void)
{
        long codesize, reservedpages, datasize, initsize;

        pci_iommu_alloc();

        /* clear_bss() already clear the empty_zero_page */

        reservedpages = 0;

        /* this will put all low memory onto the freelists */
#ifdef CONFIG_NUMA
        totalram_pages = numa_free_all_bootmem();
#else
        totalram_pages = free_all_bootmem();
#endif
        reservedpages = end_pfn - totalram_pages -
                                        absent_pages_in_range(0, end_pfn);
        after_bootmem = 1;

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
12 [报告]
发表于 2009-12-08 16:16 |只看该作者

回复 #11 dreamice 的帖子

内存初始化的时候,得出的这个值

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
13 [报告]
发表于 2009-12-08 16:37 |只看该作者

  1. void __init mem_init(void)
  2. {
  3.         int codesize, reservedpages, datasize, initsize;
  4.         int tmp;

  5.         pci_iommu_alloc();

  6. #ifdef CONFIG_FLATMEM
  7.         BUG_ON(!mem_map);
  8. #endif
  9.         /* this will put all low memory onto the freelists */
  10.         totalram_pages += free_all_bootmem();

  11.         reservedpages = 0;
  12.         for (tmp = 0; tmp < max_low_pfn; tmp++)
  13.                 /*
  14.                  * Only count reserved RAM pages:
  15.                  */
  16.                 if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp)))
  17.                         reservedpages++;

  18.         set_highmem_pages_init();

  19.         codesize =  (unsigned long) &_etext - (unsigned long) &_text;
  20.         datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
  21.         initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;

  22.         printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, "
  23.                         "%dk reserved, %dk data, %dk init, %ldk highmem)\n",
  24.                 nr_free_pages() << (PAGE_SHIFT-10),
  25.                 num_physpages << (PAGE_SHIFT-10),
  26.                 codesize >> 10,
  27.                 reservedpages << (PAGE_SHIFT-10),
  28.                 datasize >> 10,
  29.                 initsize >> 10,
  30.                 (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))
  31.                );

  32.         printk(KERN_INFO "virtual kernel memory layout:\n"
  33.                 "    fixmap  : 0x%08lx - 0x%08lx   (%4ld kB)\n"
  34. #ifdef CONFIG_HIGHMEM
  35.                 "    pkmap   : 0x%08lx - 0x%08lx   (%4ld kB)\n"
  36. #endif
  37.                 "    vmalloc : 0x%08lx - 0x%08lx   (%4ld MB)\n"
  38.                 "    lowmem  : 0x%08lx - 0x%08lx   (%4ld MB)\n"
  39.                 "      .init : 0x%08lx - 0x%08lx   (%4ld kB)\n"
  40.                 "      .data : 0x%08lx - 0x%08lx   (%4ld kB)\n"
  41.                 "      .text : 0x%08lx - 0x%08lx   (%4ld kB)\n",
  42.                 FIXADDR_START, FIXADDR_TOP,
  43.                 (FIXADDR_TOP - FIXADDR_START) >> 10,

  44. #ifdef CONFIG_HIGHMEM
  45.                 PKMAP_BASE, PKMAP_BASE+LAST_PKMAP*PAGE_SIZE,
  46.                 (LAST_PKMAP*PAGE_SIZE) >> 10,
  47. #endif

  48.                 VMALLOC_START, VMALLOC_END,
  49.                 (VMALLOC_END - VMALLOC_START) >> 20,

  50.                 (unsigned long)__va(0), (unsigned long)high_memory,
  51.                 ((unsigned long)high_memory - (unsigned long)__va(0)) >> 20,

  52.                 (unsigned long)&__init_begin, (unsigned long)&__init_end,
  53.                 ((unsigned long)&__init_end -
  54.                  (unsigned long)&__init_begin) >> 10,

  55.                 (unsigned long)&_etext, (unsigned long)&_edata,
  56.                 ((unsigned long)&_edata - (unsigned long)&_etext) >> 10,

  57.                 (unsigned long)&_text, (unsigned long)&_etext,
  58.                 ((unsigned long)&_etext - (unsigned long)&_text) >> 10);

  59.         /*
  60.          * Check boundaries twice: Some fundamental inconsistencies can
  61.          * be detected at build time already.
  62.          */
  63. #define __FIXADDR_TOP (-PAGE_SIZE)
  64. #ifdef CONFIG_HIGHMEM
  65.         BUILD_BUG_ON(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE        > FIXADDR_START);
  66.         BUILD_BUG_ON(VMALLOC_END                        > PKMAP_BASE);
  67. #endif
  68. #define high_memory (-128UL << 20)
  69.         BUILD_BUG_ON(VMALLOC_START                        >= VMALLOC_END);
  70. #undef high_memory
  71. #undef __FIXADDR_TOP

  72. #ifdef CONFIG_HIGHMEM
  73.         BUG_ON(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE        > FIXADDR_START);
  74.         BUG_ON(VMALLOC_END                                > PKMAP_BASE);
  75. #endif
  76.         BUG_ON(VMALLOC_START                                >= VMALLOC_END);
  77.         BUG_ON((unsigned long)high_memory                > VMALLOC_START);

  78.         if (boot_cpu_data.wp_works_ok < 0)
  79.                 test_wp_bit();

  80.         save_pg_dir();
  81.         zap_low_mappings(true);
  82. }
复制代码
我也找到了

[ 本帖最后由 T-Bagwell 于 2009-12-8 16:39 编辑 ]

评分

参与人数 1可用积分 +15 收起 理由
Godbach + 15 感谢分享

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
14 [报告]
发表于 2009-12-08 16:46 |只看该作者
但是proc中不是直接读取这个全局变量的,我看的内核时2.6.18.3

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
15 [报告]
发表于 2009-12-08 18:15 |只看该作者

  1. struct sysinfo {
  2.         long uptime;                        /* Seconds since boot */
  3.         unsigned long loads[3];                /* 1, 5, and 15 minute load averages */
  4.         unsigned long totalram;                /* Total usable main memory size */
  5.         unsigned long freeram;                /* Available memory size */
  6.         unsigned long sharedram;        /* Amount of shared memory */
  7.         unsigned long bufferram;        /* Memory used by buffers */
  8.         unsigned long totalswap;        /* Total swap space size */
  9.         unsigned long freeswap;                /* swap space still available */
  10.         unsigned short procs;                /* Number of current processes */
  11.         unsigned short pad;                /* explicit padding for m68k */
  12.         unsigned long totalhigh;        /* Total high memory size */
  13.         unsigned long freehigh;                /* Available high memory size */
  14.         unsigned int mem_unit;                /* Memory unit size in bytes */
  15.         char _f[20-2*sizeof(long)-sizeof(int)];        /* Padding: libc5 uses this.. */
  16. };

复制代码
上面的在include/kernel.h


获得流程

  1. void free_init_pages(char *what, unsigned long begin, unsigned long end)
  2. {
  3.         unsigned long addr = begin;

  4.         if (addr >= end)
  5.                 return;

  6.         /*
  7.          * If debugging page accesses then do not free this memory but
  8.          * mark them not present - any buggy init-section access will
  9.          * create a kernel page fault:
  10.          */
  11. #ifdef CONFIG_DEBUG_PAGEALLOC
  12.         printk(KERN_INFO "debug: unmapping init memory %08lx..%08lx\n",
  13.                 begin, PAGE_ALIGN(end));
  14.         set_memory_np(begin, (end - begin) >> PAGE_SHIFT);
  15. #else
  16.         /*
  17.          * We just marked the kernel text read only above, now that
  18.          * we are going to free part of that, we need to make that
  19.          * writeable first.
  20.          */
  21.         set_memory_rw(begin, (end - begin) >> PAGE_SHIFT);

  22.         printk(KERN_INFO "Freeing %s: %luk freed\n", what, (end - begin) >> 10);

  23.         for (; addr < end; addr += PAGE_SIZE) {
  24.                 ClearPageReserved(virt_to_page(addr));
  25.                 init_page_count(virt_to_page(addr));
  26.                 memset((void *)(addr & ~(PAGE_SIZE-1)),
  27.                         POISON_FREE_INITMEM, PAGE_SIZE);
  28.                 free_page(addr);
  29.                 totalram_pages++;
  30.         }
  31. #endif
  32. }

复制代码

上面mm/init.c里


  1. void si_meminfo(struct sysinfo *val)
  2. {
  3.         val->totalram = totalram_pages;
  4.         val->sharedram = 0;
  5.         val->freeram = global_page_state(NR_FREE_PAGES);
  6.         val->bufferram = nr_blockdev_pages();
  7.         val->totalhigh = totalhigh_pages;
  8.         val->freehigh = nr_free_highpages();
  9.         val->mem_unit = PAGE_SIZE;
  10. }
复制代码

上面在mm/page_alloc.c里


  1. static int meminfo_proc_show(struct seq_file *m, void *v)
  2. {
  3.         struct sysinfo i;
  4.         unsigned long committed;
  5.         unsigned long allowed;
  6.         struct vmalloc_info vmi;
  7.         long cached;
  8.         unsigned long pages[NR_LRU_LISTS];
  9.         int lru;

  10. /*
  11. * display in kilobytes.
  12. */
  13. #define K(x) ((x) << (PAGE_SHIFT - 10))
  14.         si_meminfo(&i);
  15.         si_swapinfo(&i);
  16.         committed = percpu_counter_read_positive(&vm_committed_as);
  17.         allowed = ((totalram_pages - hugetlb_total_pages())
  18.                 * sysctl_overcommit_ratio / 100) + total_swap_pages;

  19.         cached = global_page_state(NR_FILE_PAGES) -
  20.                         total_swapcache_pages - i.bufferram;
  21.         if (cached < 0)
  22.                 cached = 0;

  23.         get_vmalloc_info(&vmi);

  24.         for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
  25.                 pages[lru] = global_page_state(NR_LRU_BASE + lru);

  26.         /*
  27.          * Tagged format, for easy grepping and expansion.
  28.          */
  29.         seq_printf(m,
  30.                 "MemTotal:       %8lu kB\n"
  31.                 "MemFree:        %8lu kB\n"
  32.                 "Buffers:        %8lu kB\n"
  33.                 "Cached:         %8lu kB\n"
  34.                 "SwapCached:     %8lu kB\n"
  35.                 "Active:         %8lu kB\n"
  36.                 "Inactive:       %8lu kB\n"
  37.                 "Active(anon):   %8lu kB\n"
  38.                 "Inactive(anon): %8lu kB\n"
  39.                 "Active(file):   %8lu kB\n"
  40.                 "Inactive(file): %8lu kB\n"
  41.                 "Unevictable:    %8lu kB\n"
  42.                 "Mlocked:        %8lu kB\n"
  43. #ifdef CONFIG_HIGHMEM
  44.                 "HighTotal:      %8lu kB\n"
  45.                 "HighFree:       %8lu kB\n"
  46.                 "LowTotal:       %8lu kB\n"
  47.                 "LowFree:        %8lu kB\n"
  48. #endif
  49. #ifndef CONFIG_MMU
  50.                 "MmapCopy:       %8lu kB\n"
  51. #endif
  52.                 "SwapTotal:      %8lu kB\n"
  53.                 "SwapFree:       %8lu kB\n"
  54.                 "Dirty:          %8lu kB\n"
  55.                 "Writeback:      %8lu kB\n"
  56.                 "AnonPages:      %8lu kB\n"
  57.                 "Mapped:         %8lu kB\n"
  58.                 "Shmem:          %8lu kB\n"
  59.                 "Slab:           %8lu kB\n"
  60.                 "SReclaimable:   %8lu kB\n"
  61.                 "SUnreclaim:     %8lu kB\n"
  62.                 "KernelStack:    %8lu kB\n"
  63.                 "PageTables:     %8lu kB\n"
  64. #ifdef CONFIG_QUICKLIST
  65.                 "Quicklists:     %8lu kB\n"
  66. #endif
  67.                 "NFS_Unstable:   %8lu kB\n"
  68.                 "Bounce:         %8lu kB\n"
  69.                 "WritebackTmp:   %8lu kB\n"
  70.                 "CommitLimit:    %8lu kB\n"
  71.                 "Committed_AS:   %8lu kB\n"
  72.                 "VmallocTotal:   %8lu kB\n"
  73.                 "VmallocUsed:    %8lu kB\n"
  74.                 "VmallocChunk:   %8lu kB\n"
  75. #ifdef CONFIG_MEMORY_FAILURE
  76.                 "HardwareCorrupted: %5lu kB\n"
  77. #endif
  78.                 ,
  79.                 K(i.totalram),
  80.                 K(i.freeram),
  81.                 K(i.bufferram),
  82.                 K(cached),
  83.                 K(total_swapcache_pages),
  84.                 K(pages[LRU_ACTIVE_ANON]   + pages[LRU_ACTIVE_FILE]),
  85.                 K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
  86.                 K(pages[LRU_ACTIVE_ANON]),
  87.                 K(pages[LRU_INACTIVE_ANON]),
  88.                 K(pages[LRU_ACTIVE_FILE]),
  89.                 K(pages[LRU_INACTIVE_FILE]),
  90.                 K(pages[LRU_UNEVICTABLE]),
  91.                 K(global_page_state(NR_MLOCK)),
  92. #ifdef CONFIG_HIGHMEM
  93.                 K(i.totalhigh),
  94.                 K(i.freehigh),
  95.                 K(i.totalram-i.totalhigh),
  96.                 K(i.freeram-i.freehigh),
  97. #endif
  98. #ifndef CONFIG_MMU
  99.                 K((unsigned long) atomic_long_read(&mmap_pages_allocated)),
  100. #endif
  101.                 K(i.totalswap),
  102.                 K(i.freeswap),
  103.                 K(global_page_state(NR_FILE_DIRTY)),
  104.                 K(global_page_state(NR_WRITEBACK)),
  105.                 K(global_page_state(NR_ANON_PAGES)),
  106.                 K(global_page_state(NR_FILE_MAPPED)),
  107.                 K(global_page_state(NR_SHMEM)),
  108.                 K(global_page_state(NR_SLAB_RECLAIMABLE) +
  109.                                 global_page_state(NR_SLAB_UNRECLAIMABLE)),
  110.                 K(global_page_state(NR_SLAB_RECLAIMABLE)),
  111.                 K(global_page_state(NR_SLAB_UNRECLAIMABLE)),
  112.                 global_page_state(NR_KERNEL_STACK) * THREAD_SIZE / 1024,
  113.                 K(global_page_state(NR_PAGETABLE)),
  114. #ifdef CONFIG_QUICKLIST
  115.                 K(quicklist_total_size()),
  116. #endif
  117.                 K(global_page_state(NR_UNSTABLE_NFS)),
  118.                 K(global_page_state(NR_BOUNCE)),
  119.                 K(global_page_state(NR_WRITEBACK_TEMP)),
  120.                 K(allowed),
  121.                 K(committed),
  122.                 (unsigned long)VMALLOC_TOTAL >> 10,
  123.                 vmi.used >> 10,
  124.                 vmi.largest_chunk >> 10
  125. #ifdef CONFIG_MEMORY_FAILURE
  126.                 ,atomic_long_read(&mce_bad_pages) << (PAGE_SHIFT - 10)
  127. #endif
  128.                 );

  129.         hugetlb_report_meminfo(m);

  130.         arch_report_meminfo(m);

  131.         return 0;
  132. #undef K
  133. }
复制代码

输出出来了


希望没误人子弟

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
16 [报告]
发表于 2009-12-08 19:38 |只看该作者
晕,打分打错地方了。是给15楼的

论坛徽章:
0
17 [报告]
发表于 2009-12-08 19:49 |只看该作者
看到这个贴子,想起一个游戏 —— 《挖金子》

论坛徽章:
0
18 [报告]
发表于 2009-12-09 09:59 |只看该作者
这么多人感兴趣啊,贴出实现的code了

#include <linux/kernel.h>
#include <linux/mm.h>

{

                                ...
                struct sysinfo i;
#define K(x) ((x) << (PAGE_SHIFT - 10))
                si_meminfo(&i);
                b.sdram_size=K(i.totalram);
#undef  K

                               ...
}

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
19 [报告]
发表于 2009-12-09 10:20 |只看该作者
呵呵,就是这块了,上面T-bagwell兄贴出来的一样

论坛徽章:
0
20 [报告]
发表于 2009-12-09 21:38 |只看该作者

回复 #15 T-Bagwell 的帖子

请问仁兄的代码的内核版本是多少?我找到的相应代码不一样,static int meminfo_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) -> static int meminfo_proc_show(struct seq_file *m, void *v)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP