linux /proc/$pid/smaps 文件中各个字段代表什么含义

作者&投稿:崇具 (若有异议请与网页底部的电邮联系)
Linux操作系统:从文件passwd中复制当前用户信息的字段到file1中,分别说明每个字段的含义~

我们看到七个字段,每个字段写字段之间用:号(冒号)分割,其中:
第1个:用户名,如:ftp ;
第2个:密码字段,是隐藏的,显示为 x ;
第3个:用户的UID字段,可以自己来设定,不要和其它用户的UID相同,否则会造成系统安全问题;
第4个:用户组的GID,可以自己设定,不要和其它用户组共用FTP的GID,否则会造成系统全全问题;
第5个:用户说明字段,可以为空;
第6个:用户的家目录,可以自己来定义,如:/home/ck;
第7个:用户登录SHELL ,这个也是可以定义的。

根据不同的kernel ver, 可能有不同的项次
根据你的描述,可以参照kernel source code /fs/proc/array.c 的do_task_stat API 了解

部分source code 如下:
494 seq_printf(m, "%d (%s) %c", pid_nr_ns(pid, ns), tcomm, state);
495 seq_put_decimal_ll(m, ' ', ppid);
496 seq_put_decimal_ll(m, ' ', pgid);
497 seq_put_decimal_ll(m, ' ', sid);
498 seq_put_decimal_ll(m, ' ', tty_nr);
499 seq_put_decimal_ll(m, ' ', tty_pgrp);
500 seq_put_decimal_ull(m, ' ', task->flags);
501 seq_put_decimal_ull(m, ' ', min_flt);
502 seq_put_decimal_ull(m, ' ', cmin_flt);
503 seq_put_decimal_ull(m, ' ', maj_flt);
504 seq_put_decimal_ull(m, ' ', cmaj_flt);
505 seq_put_decimal_ull(m, ' ', cputime_to_clock_t(utime));
506 seq_put_decimal_ull(m, ' ', cputime_to_clock_t(stime));
507 seq_put_decimal_ll(m, ' ', cputime_to_clock_t(cutime));
508 seq_put_decimal_ll(m, ' ', cputime_to_clock_t(cstime));
509 seq_put_decimal_ll(m, ' ', priority);
510 seq_put_decimal_ll(m, ' ', nice);
511 seq_put_decimal_ll(m, ' ', num_threads);
512 seq_put_decimal_ull(m, ' ', 0);
513 seq_put_decimal_ull(m, ' ', start_time);
514 seq_put_decimal_ull(m, ' ', vsize);
515 seq_put_decimal_ull(m, ' ', mm ? get_mm_rss(mm) : 0);
516 seq_put_decimal_ull(m, ' ', rsslim);
517 seq_put_decimal_ull(m, ' ', mm ? (permitted ? mm->start_code : 1) : 0);
518 seq_put_decimal_ull(m, ' ', mm ? (permitted ? mm->end_code : 1) : 0);
519 seq_put_decimal_ull(m, ' ', (permitted && mm) ? mm->start_stack : 0);
520 seq_put_decimal_ull(m, ' ', esp);
521 seq_put_decimal_ull(m, ' ', eip);
522 /* The signal information here is obsolete.
523 * It must be decimal for Linux 2.0 compatibility.
524 * Use /proc/#/status for real-time signals.
525 */
526 seq_put_decimal_ull(m, ' ', task->pending.signal.sig[0] & 0x7fffffffUL);
527 seq_put_decimal_ull(m, ' ', task->blocked.sig[0] & 0x7fffffffUL);
528 seq_put_decimal_ull(m, ' ', sigign.sig[0] & 0x7fffffffUL);
529 seq_put_decimal_ull(m, ' ', sigcatch.sig[0] & 0x7fffffffUL);
530 seq_put_decimal_ull(m, ' ', wchan);
531 seq_put_decimal_ull(m, ' ', 0);
532 seq_put_decimal_ull(m, ' ', 0);
533 seq_put_decimal_ll(m, ' ', task->exit_signal);
534 seq_put_decimal_ll(m, ' ', task_cpu(task));
535 seq_put_decimal_ull(m, ' ', task->rt_priority);
536 seq_put_decimal_ull(m, ' ', task->policy);
537 seq_put_decimal_ull(m, ' ', delayacct_blkio_ticks(task));
538 seq_put_decimal_ull(m, ' ', cputime_to_clock_t(gtime));
539 seq_put_decimal_ll(m, ' ', cputime_to_clock_t(cgtime));
540
541 if (mm && permitted) {
542 seq_put_decimal_ull(m, ' ', mm->start_data);
543 seq_put_decimal_ull(m, ' ', mm->end_data);
544 seq_put_decimal_ull(m, ' ', mm->start_brk);
545 seq_put_decimal_ull(m, ' ', mm->arg_start);
546 seq_put_decimal_ull(m, ' ', mm->arg_end);
547 seq_put_decimal_ull(m, ' ', mm->env_start);
548 seq_put_decimal_ull(m, ' ', mm->env_end);
549 } else
550 seq_printf(m, " 0 0 0 0 0 0 0");
551
552 if (permitted)
553 seq_put_decimal_ll(m, ' ', task->exit_code);
554 else
555 seq_put_decimal_ll(m, ' ', 0);
556
557 seq_putc(m, '
');
558 if (mm)
559 mmput(mm);
560 return 0;
561 }

1、/proc/$pid/smaps反应运行时进程的内存情况,系统的运行时库(so),堆,栈信息均可在其中查看到。

 

2、用户可以通过more、less等命令查看到相应pid下smaps文件的内容。 

3、以下图显示为例,说明其各字段的意义:

 1)、08048000-080bc000:地址空间的开始地址 - 结束地址 

 2)、r-xp属性:前三个是rwx(读、写、可执行),如果没有相应的权限则为“-”。最后一个可以是p或者s(p表示私有,s表示共享) 。

3)、00000000:偏移量,如果这段内存是从文件里映射过来的,则偏移量为这段内容在文件中的偏移量。如果不是从文件里面映射过来的则为0. 

4)、03:02:文件所在设备的主设备号和子设备号

5)、13130:文件号,即/bin/bash的文件号

5)、/bin/bash:文件名

7)、Rss:Resident Set Size 实际使用物理内存(包含共享库占用的内存) 

Rss的大小=Shared_Clean+Shared_Dirty+Private_Clean+Private_Dirty 

8)、Pss:实际使用的物理内存(按比例包含共享库占用的内存)。比如四个进程共享同一个占内存1000MB的共享库,每个进程算进250MB在Pss。 

9)、Shared_Clean 、 Shared_Dirty 、 Private_Clean、 Private_Dirty:

(shared/private)共享和私有 

一个页的clean字段表示没有更改此页,当发生换页时不用写回。dirty表示更改了此页,当发生换页时要写回磁盘。此处这四个值是遍历页表中各个页后得到的。 


4、要彻底的理解smaps,建议参考linux内存管理的源码。



PID全称是Process Identification。 PID是进程的代号,每个进程有唯一的PID编号。它是进程运行时系统随机分配的,并不代表专门的进程。在运行时PID是不会改变标识符的,但是你终止程序后再运行PID标识符就会被系统回收,就可能会被继续分配给新...