热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

当前位置 :| 主页>Linux教程>内核研究>

通过Linux内核观察/proc/pid/statm

来源: 作者: 时间:2007-03-23 Tag: 点击:

输出解释

CPU 以及CPU0。。。的每行的每个参数意思(以第一行为例)为:

参数 解释 /proc//status

Size (total pages) 任务虚拟地址空间的大小 VmSize/4

Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4

Shared(pages) 共享页数 0

Trs(pages) 程序所拥有的可执行虚拟内存的大小 VmExe/4

Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4

Drs(pages) 程序数据段和用户态的栈的大小 (VmData+ VmStk )4

dt(pages) 脏页数量

通过内核代码,我们可以更加清楚的了解其含义:

显示该信息主要是通过 proc_pid_statm 该函数来实现的。如果对proc的机制不了解,请参考《linux设备驱动程序》。

其调用过程:proc_pid_statm->statm_pmd_range->statm_pte_range。目的是从地址区间逐渐转化成具体的每个页表。阅读代码,只需了解一个大概,不用了解很多细节,要比写起来轻松许多。

其中totals,pages,shared,dirty的是通过虚拟地址的页表来进行判断。

do {
    pte_t page = *pte;
    struct page *ptpage;

    address += PAGE_SIZE;
    pte++;
    if (pte_none(page))
       continue;
    ++*total;             //是合法的页都计算在内。
    if (!pte_present(page))
continue;
    ptpage = pte_page(page);
    if ((!VALID_PAGE(ptpage)) || PageReserved(ptpage))
        continue;
    ++*pages;            //只有页表中含有present标记的,计算在内。
    if (pte_dirty(page))
        ++*dirty;        //页表中dirty标记,计算在内。
    if (page_count(pte_page(page)) > 1)
        ++*shared;       //页表的所有者超过1的,就认为共享。
} while (address < end);

trs、drs、lrs是通过线性地址区间来进行区分的。

int proc_pid_statm(struct task_struct *task, char * buffer)
。。。。。
while (vma) {
。。。。。。。。。。。
    if (vma->vm_flags & VM_EXECUTABLE)      //该线性区间的flags标志为可执行。
       trs += pages; /* text */
    else if (vma->vm_flags & VM_GROWSDOWN)  //该线性区间的flags标志为向下增长。
       drs += pages; /* stack */
    else if (vma->vm_end > 0x60000000)      //结尾线性地址大于0x60000000。
       lrs += pages; /* library */
    else        //这块区间应该是数据区与堆。
       drs += pages;
     vma = vma->vm_next;
}

pages=trs+drs+lrs

因此说,trs drs lrs 与totals,pages,shared,dirty两组,分别从两个角度观察内存。




相关文章:
精通initramfs构建step by step
Linux利用kexec迅速切换内核
进程上下文VS中断上下文
内核通知链 学习笔记
linux spi子系统驱动分析
menuconfig 配置选项
《Linux操作系统内核实习》之练习一
udev详解
什么叫微内核,宏内核?
Linux 信号signal处理机制
开发简单的 Linux2.6 内核模块
删除内核的perl脚本
Linux2.6内核usb gadget驱动移植
GCC hacks in the Linux kernel
iomem
kernel学习的想法
让自己的驱动支持udev
linux内核编译步骤
内核的等待队列
Linux内核wait_queue深入分析
升级和删除内核
SD卡驱动分析2
Linux Kernel VDSO本地权限提升漏洞
内核中的TCP的追踪分析-15-TCP(IPV4)的客户端与
linux 2.6内核可加载模块的编译
内核模块HelloWorld
在环回接口上发送一个数据报
ARP初始化
1分钟编译FreeBSD内核
linux设备模型之uart驱动架构分析