linux Tips
本文收集网上linux下的一些tips:
1 /proc/pid/maps:进程的虚拟地址空间
该文件有6列,分别为: 地址:库在进程里地址范围 权限:虚拟内存的权限,r=读,w=写,x=,s=共享,p=私有; 偏移量:库在进程里地址范围 设备:映像文件的主设备号和次设备号; 节点:映像文件的节点号; 路径: 映像文件的路径 每项都与一个vm_area_struct结构成员对应, 范例: 应用程序的正文段(权限为r-xp)从0x08048000到0x08049000,大小为4096;数据段从0x08049000到0x0804a000,大小为1KB。该应用程序使用了两个库:lib和libc。Libc的正文段从0x00391000到0x004b4000,大小为1164KB;数据段从0x004b5000到0x004b8000,大小为12KB. Ld的正文段从00378000到0038d000,大小为84KB;数据段从0x0038e000到0x0038f000,大小为4KB。该应用程序所使用的库所占的虚拟空间的大小从0x4b8000到0x378000,大小为1280KB,其实真正大小为VmLib(1251KB);因为是按页分配,每页大小为4KB。 [root@localhost ~]# cat /proc/7114/maps 地址 权限 文件地址偏移 设备 节点 路径 08047000-080dc000 r-xp 00000000 03:06 884901 /bin/bash 080dc000-080e3000 rwxp 00094000 03:06 884901 /bin/bash 080e3000-08129000 rwxp 080e3000 00:00 0 [heap] 4d575000-4d58a000 r-xp 00000000 03:06 736549 /lib/ld-2.3.4.so 4d58a000-4d58b000 r-xp 00015000 03:06 736549 /lib/ld-2.3.4.so 4d58b000-4d58c000 rwxp 00016000 03:06 736549 /lib/ld-2.3.4.so 4d58e000-4d6b1000 r-xp 00000000 03:06 736550/lib/tls/libc-2.3.4.so 4d6b1000-4d6b2000 r-xp 00123000 03:06 736550/lib/tls/libc-2.3.4.so 4d6b2000-4d6b5000 rwxp 00124000 03:06 736550/lib/tls/libc-2.3.4.so 参数 解释 address: 0085d000-00872000虚拟内存区域的起始和终止地址文件所占的地址空间 perms:rw-p 权限:r=read, w=write, x=execute, s=shared,p=private(copy on write) offset: 00000000 虚拟内存区域在被映射文件中的偏移量 dev: 03:08 文件的主设备号和次设备号 inode: 设备的节点号,0表示没有节点与内存相对应 name: /lib/ld-2.3.4.so 被映射文件的文件名;执行文件存放的是代码段:r-xp和数据段:rwxp,但共享库却有三个,还有一个是什么?(dannerWorking:http://bbs.chinaunix.net/thread-3596418-1-1.html 阅读理解,再回看android linker中关于segment mmap是代码追加so加载博文) 各共享库的代码段,存放着二进制可执行的机器指令,是由kernel把该库ELF文件的代码段map到虚存空间; 各共享库的数据段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间; 用户代码段,存放着二进制形式的可执行的机器指令,是由kernel把ELF文件的代码段map到虚存空间; 用户数据段之上是代码段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间; 用户数据段之下是堆(heap),当且仅当malloc调用时存在,是由kernel把匿名内存map到虚存空间,堆则在程序中没有调用malloc的情况下不存在; 用户数据段之下是栈(stack),作为进程的临时数据区,是由kernel把匿名内存map到虚存空间,栈空间的增长方向是从高地址到低地址。
2 /proc/pid/status cat status
Name: gedit /*进程的程序名*/ State: S (sleeping) /*进程的状态信息*/ Tgid: 9744 /*线程组号*/ Pid: 9744 /*进程pid*/ PPid: 7672 /*父进程的pid*/ TracerPid: 0 /*跟踪进程的pid,若没有被跟踪则为0,这可被用于检测进程是否被ptrace*/ Uid: 1000 1000 1000 1000 /*uid euid suid fsuid*/ Gid: 1000 1000 1000 1000 /*gid egid sgid fsgid*/ FDSize: 256 /*文件描述符的最大个数,file->fds*/ Groups: 0 4 20 24 25 29 30 44 46 107 109 115 124 1000 /*启动该进程的用户所属的组的id*/ VmPeak: 60184 kB /*进程地址空间的大小*/ VmSize: 60180 kB /*进程虚拟地址空间的大小reserved_vm:进程在预留或特殊的内存间的物理页*/ VmLck: 0 kB /*进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘*/ VmHWM: 18020 kB /*文件内存映射和匿名内存映射的大小*/ VmRSS: 18020 kB /*应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)*/ VmData: 12240 kB /*程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据*/ VmStk: 84 kB /*进程在用户态的栈的大小*/ VmExe: 576 kB /*程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 */ VmLib: 21072 kB /*被映像到任务的虚拟内存空间的库的大小*/ VmPTE: 56 kB /*该进程的所有页表的大小*/ Threads: 1 /*共享使用该信号描述符的任务的个数*/ SigQ: 0/8183 /*待处理信号的个数/目前最大可以处理的信号的个数*/ SigPnd: 0000000000000000 /*屏蔽位,存储了该线程的待处理信号*/ ShdPnd: 0000000000000000 /*屏蔽位,存储了该线程组的待处理信号*/ SigBlk: 0000000000000000 /*存放被阻塞的信号*/ SigIgn: 0000000000001000 /*存放被忽略的信号*/ SigCgt: 0000000180000000 /*存放被俘获到的信号*/ CapInh: 0000000000000000 /*能被当前进程执行的程序的继承的能力*/ CapPrm: 0000000000000000 /*进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的*/ CapEff: 0000000000000000 /*是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性*/ Cpus_allowed: 01 /*可以执行该进程的CPU掩码集*/ Mems_allowed: 1 /**/ voluntary_ctxt_switches: 1241 /*进程主动切换的次数*/ nonvoluntary_ctxt_switches: 717 /*进程被动切换的次数*/
3 /proc/name/cmdline
dannerWorking
4 ulimint 此命令用来限制当前用户各种限制
/* 功能说明:控制shell程序的资源。 语 法:ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>] 补充说明:ulimit为shell内建指令,可用来控制shell执行程序的资源。 参 数: -a 显示目前资源限制的设定。 -c <core文件上限> 设定core文件的最大值,单位为区块。 -d <数据节区大小> 程序数据节区的最大值,单位为KB。 -f <文件大小> shell所能建立的最大文件,单位为区块。 -H 设定资源的硬性限制,也就是管理员所设下的限制。 -m <内存大小> 指定可使用内存的上限,单位为KB。 -n <文件数目> 指定同一时间最多可开启的文件数。 -p <缓冲区大小> 指定管道缓冲区的大小,单位512字节。 -s <堆叠大小> 指定堆叠的上限,单位为KB。 -S 设定资源的弹性限制。 -t <CPU时间> 指定CPU使用时间的上限,单位为秒。 -u <程序数目> 用户最多可开启的程序数目。 -v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB。*/ // ulimint -a 用来显示当前的各种用户进程限制 // 数据段长度:ulimit -d unlimited // 最大内存大小:ulimit -m unlimited // 堆栈大小:ulimit -s unlimited // ulimit -c unlimited 我们在用这个命令的时候主要是为了产生core文件,就是程序运行发行段错误时的文件