A análise mais completa do diretório system / proc do Android

A explicação mais autoritária é definitivamente o manual do homem, o endereço do manual do homem do diretório proc do sistema Linux: https://linux.die.net/man/5/proc. Embora existam algumas discrepâncias com o Android, mas uma grande parte é a mesma, com referência.

1. diretório / proc

Primeiro, vamos apresentar o diretório / proc.É um diretório virtual.Os arquivos e diretórios também são virtuais.Eles não ocupam o espaço de armazenamento real, mas existem na memória do sistema. proc fornece uma interface para acessar o kernel do sistema na forma de um sistema de arquivos e lê dinamicamente as informações necessárias do kernel do sistema.
  • / proc / cmdline: exibe a linha de comando para a inicialização do kernel.
  • / proc / cpuinfo: exibe as informações da CPU do sistema. 
  • / proc / filesystems, exibe uma lista dos sistemas de arquivos registrados atualmente, nodev representa um sistema de arquivos virtual. 
  • / proc / interrupts: exibe informações de interrupção do sistema atual.
  • / proc / ioports: lista de intervalos de endereços de entrada / saída ocupados.
  • / proc / kmsg: gera log de mensagens do kernel.
  • / proc / loadavg: monitora a carga média da CPU, seu valor é o valor acumulado do uso da CPU em todos os núcleos, os três primeiros indicam a carga média dos últimos 1, 5 e 15 minutos e o quarto indica o número atual de processos em execução e o número total de processos, O último indica o ID do processo executado mais recentemente.
  • / proc / locks: abre as informações de bloqueio no arquivo.
  • / proc / meminfo: exibe o uso de memória física e virtual.
  • / proc / misc: o driver de dispositivo registrado pela função do kernel misc_register.
  • / proc / modules: lista de módulos do kernel carregados.
  • Proc / mounts: as informações do sistema de arquivos instaladas pelo sistema atual (incluindo instalação manual).
  • / proc / stat: breve informação do sistema. 
  • / proc / uptime: representa o tempo de inicialização do sistema e o tempo ocioso do sistema, respectivamente.
  • / proc / version: versão do kernel do sistema.
  • / proc / net: O ponto de montagem real é / proc / self / net, que pode exibir as condições atuais da rede.Por exemplo, você pode exibir o número da conexão TCP e o status da conexão através do arquivo tcp.
  • / proc / sys relata vários parâmetros do kernel, alguns dos quais podem ser modificados no caso do root.
  • / proc / devices Todos os dispositivos de hardware e software (dispositivos de caracteres e dispositivos de bloco) atualmente montados, incluindo o número principal e o nome do dispositivo.
  • / proc / asound: informações relacionadas à placa de som.
  • / proc / buddyinfo: Quantos blocos estão disponíveis para cada pedido em cada área de memória estão relacionados ao problema de fragmentação da memória.
  • / proc / bus: Digite as informações do dispositivo.
  • / proc / cgroups: exibe informações do subsistema do cgroups.
  • / proc / diskstats: usado para exibir discos, partições e estatísticas.
  • / proc / execdomains: informações relacionadas à segurança.
  • / proc / fb: informações do dispositivo de buffer de quadro.
  • / proc / iomem: registra a alocação de endereços físicos.
  • / proc / kallsyms: informações da tabela de símbolos do kernel.
  • / proc / pagetypeinfo: informações de paginação da memória.
  • / proc / partitions: informações da partição
  • / proc / sched_debug: informações de agendamento da CPU.
  • / proc / softirqs: condições de interrupção suave.
  • / proc / vmallocinfo: informações de alocação de memória vmalloc.
  • / proc / vmstat: estatísticas de memória virtual.
  • / proc / pid: exibe todas as informações relacionadas à entrada na cidade.
Pode-se dizer que quase todas as informações do sistema podem ser encontradas no diretório / proc.

2. diretório / proc / XXX / process

Existem muitos diretórios no diretório / proc cujos nomes são números.Estes diretórios armazenam informações sobre todos os processos em execução no sistema atual.Os números correspondem ao pid do processo.
$ ls -d /proc/[0-9]*
/proc/1/    /proc/302/  /proc/451/  /proc/496/  /proc/556/  /proc/633/
/proc/127/  /proc/317/  /proc/452/  /proc/497/  /proc/557/  /proc/718/
/proc/2/    /proc/339/  /proc/453/  /proc/5/    /proc/558/  /proc/755/
/proc/250/  /proc/385/  /proc/454/  /proc/501/  /proc/559/  /proc/760/
/proc/260/  /proc/4/    /proc/455/  /proc/504/  /proc/565/  /proc/761/
/proc/275/  /proc/402/  /proc/463/  /proc/505/  /proc/569/  /proc/9884/
/proc/290/  /proc/433/  /proc/487/  /proc/509/  /proc/594/  /proc/774/
/proc/3/    /proc/450/  /proc/491/  /proc/554/  /proc/595/

Usuários comuns podem visualizar apenas informações relacionadas a esse processo e precisam obter permissão de root para visualizar outras informações do processo, como exibir o conteúdo do diretório 9884 do processo:
# ls -l 9884/                                            
dr-xr-xr-x shell    shell             2016-10-19 15:51 attr
-r-------- shell    shell           0 2016-10-19 15:51 auxv
-r--r--r-- shell    shell           0 2016-10-19 15:51 cgroup
--w------- shell    shell           0 2016-10-19 15:51 clear_refs
-r--r--r-- shell    shell           0 2016-10-18 17:19 cmdline
-rw-r--r-- shell    shell           0 2016-10-19 15:51 comm
-rw-r--r-- shell    shell           0 2016-10-19 15:51 coredump_filter
lrwxrwxrwx shell    shell             2016-10-19 15:51 cwd -> /
-r-------- shell    shell           0 2016-10-19 15:51 environ
lrwxrwxrwx shell    shell             2016-10-18 18:55 exe -> /system/bin/adb
dr-x------ shell    shell             2016-10-19 15:51 fd
dr-x------ shell    shell             2016-10-19 15:51 fdinfo
-r--r--r-- shell    shell           0 2016-10-19 15:51 limits
-rw-r--r-- shell    shell           0 2016-10-19 15:51 loginuid
-r--r--r-- shell    shell           0 2016-10-19 15:51 maps
-rw------- shell    shell           0 2016-10-19 15:51 mem
-r--r--r-- shell    shell           0 2016-10-19 15:51 mountinfo
-r--r--r-- shell    shell           0 2016-10-19 15:51 mounts
-r-------- shell    shell           0 2016-10-19 15:51 mountstats
dr-xr-xr-x shell    shell             2016-10-19 15:51 net
dr-x--x--x shell    shell             2016-10-19 15:51 ns
-rw-r--r-- shell    shell           0 2016-10-19 15:51 oom_adj
-r--r--r-- shell    shell           0 2016-10-19 15:51 oom_score
-rw-r--r-- shell    shell           0 2016-10-19 15:51 oom_score_adj
-r--r--r-- shell    shell           0 2016-10-19 15:51 pagemap
-r--r--r-- shell    shell           0 2016-10-19 15:51 personality
lrwxrwxrwx shell    shell             2016-10-19 15:51 root -> /
-r--r--r-- shell    shell           0 2016-10-19 15:51 schedstat
-r--r--r-- shell    shell           0 2016-10-19 15:51 sessionid
-r--r--r-- shell    shell           0 2016-10-19 15:51 smaps
-r--r--r-- shell    shell           0 2016-10-19 15:51 stack
-r--r--r-- shell    shell           0 2016-10-18 17:19 stat
-r--r--r-- shell    shell           0 2016-10-19 15:51 statm
-r--r--r-- shell    shell           0 2016-10-18 21:42 status
dr-xr-xr-x shell    shell             2016-10-18 18:58 task
-r--r--r-- shell    shell           0 2016-10-19 15:51 wchan

Vamos dar uma olhada na função de cada arquivo ou diretório, um por um:
  • cmdline : esse arquivo (virtual) contém toda a linha de comando para iniciar o processo. Ele nunca foi formatado: não havia espaços entre o programa e seus parâmetros e não havia quebras de linha no final da linha.
  • cwd : o link simbólico aponta para o diretório de trabalho atual do processo. Agora, basicamente, vi o diretório raiz.A partir da saída acima, pode-se ver que ele está vinculado ao diretório raiz.
  • environ : Este arquivo contém todas as variáveis ​​de ambiente definidas para o processo no formato  variable = value . Como o   arquivo cmdline , seu conteúdo nunca foi formatado: não há linhas entre as variáveis ​​e não há quebra de linha no final do arquivo.
  • exe : Este é um link simbólico para um arquivo de programa executável executado pelo processo. A saída acima pode ser vista vinculando a / system / bin / adb, o processo geral do usuário está vinculado a / system / bin / app_process, este é o arquivo de implementação real do processo zygote, porque todos os processos são hachurados por zygote, então aqui Irá vincular a ele.
  • fd : este subdiretório contém todos os descritores atualmente abertos pelo processo. Vamos dar uma olhada na saída do processo 9884:
root@hammerhead:/proc/9884 # ls -l fd/                                         
lr-x------ shell    shell             2016-10-19 16:41 0 -> /dev/null
l-wx------ shell    shell             2016-10-19 16:41 1 -> /dev/null
lrwx------ shell    shell             2016-10-19 16:41 11 -> socket:[421052]
l-wx------ shell    shell             2016-10-19 16:41 2 -> /dev/null
lrwx------ shell    shell             2016-10-19 16:41 3 -> socket:[448153]
lrwx------ shell    shell             2016-10-19 16:41 4 -> socket:[448154]
lrwx------ shell    shell             2016-10-19 16:41 5 -> socket:[449926]
lrwx------ shell    shell             2016-10-19 16:41 6 -> socket:[449927]
lrwx------ shell    shell             2016-10-19 16:41 7 -> socket:[449928]
lr-x------ shell    shell             2016-10-19 16:41 9 -> /dev/__properties__
De fato, esta é uma lista de descritores de arquivos abertos pelo processo.Todos os descritores são representados por um link simbólico, cujo nome é o número do descritor e aponta para o arquivo aberto pelo descritor. Observe as permissões desses links simbólicos: seu significado representa apenas as permissões do arquivo aberto pelo descritor correspondente.
  • maps : Este arquivo mostra a distribuição do espaço de endereço virtual do processo. O arquivo possui 6 colunas e as colunas da esquerda para a direita são:
Endereço: o intervalo de endereços da biblioteca no processo 
Permissões: permissões para memória virtual, r = leitura, w = gravação, x =, s = compartilhado, p = privado; 
Deslocamento: o intervalo de endereços da biblioteca no processo 
Dispositivo: os números de dispositivos principais e secundários do arquivo de imagem.Quando o número do dispositivo é 0 e não há número de inode ou nome de arquivo, é um mapeamento anônimo, indicando que nenhum nó corresponde à memória
Nó: o número do nó do arquivo de imagem; 
Caminho: o caminho do arquivo de imagem 
Cada item corresponde a um membro da estrutura vm_area_struct.


Exemplos:

root@hammerhead:/proc/9884 # cat maps                                          
b6bb6000-b6bb8000 rw-p 00000000 00:00 0 
b6cb8000-b6cb9000 ---p 00000000 00:00 0 
b6cb9000-b6db6000 rw-p 00000000 00:00 0          [stack:9885]
b6db6000-b6dd6000 r--s 00000000 00:0b 6245       /dev/__properties__
b6dd6000-b6dee000 r-xp 00000000 b3:19 949        /system/lib/libm.so
b6dee000-b6def000 r--p 00017000 b3:19 949        /system/lib/libm.so
b6def000-b6df0000 rw-p 00018000 b3:19 949        /system/lib/libm.so
b6df0000-b6df1000 r-xp 00000000 b3:19 1065       /system/lib/libstdc++.so
b6df1000-b6df2000 r--p 00000000 b3:19 1065       /system/lib/libstdc++.so
b6df2000-b6df3000 rw-p 00001000 b3:19 1065       /system/lib/libstdc++.so
b6df3000-b6e3a000 r-xp 00000000 b3:19 827        /system/lib/libc.so
b6e3a000-b6e3b000 ---p 00000000 00:00 0 
b6e3b000-b6e3d000 r--p 00047000 b3:19 827        /system/lib/libc.so
b6e3d000-b6e40000 rw-p 00049000 b3:19 827        /system/lib/libc.so
b6e40000-b6e4e000 rw-p 00000000 00:00 0 
b6e4e000-b6f25000 r-xp 00000000 b3:19 849        /system/lib/libcrypto.so
b6f25000-b6f26000 ---p 00000000 00:00 0 
b6f26000-b6f32000 r--p 000d7000 b3:19 849        /system/lib/libcrypto.so
b6f32000-b6f38000 rw-p 000e3000 b3:19 849        /system/lib/libcrypto.so
b6f38000-b6f3a000 rw-p 00000000 00:00 0 
b6f3a000-b6f3c000 r--p 00000000 00:00 0 
b6f3c000-b6f3e000 rw-p 00000000 00:00 0 
b6f3e000-b6f4d000 r-xp 00000000 b3:19 176        /system/bin/linker
b6f4d000-b6f4e000 r--p 0000e000 b3:19 176        /system/bin/linker
b6f4e000-b6f4f000 rw-p 0000f000 b3:19 176        /system/bin/linker
b6f4f000-b6f50000 rw-p 00000000 00:00 0 
b6f50000-b6f6a000 r-xp 00000000 b3:19 113        /system/bin/adb
b6f6a000-b6f6b000 r--p 00019000 b3:19 113        /system/bin/adb
b6f6b000-b6f6c000 rw-p 0001a000 b3:19 113        /system/bin/adb
b6f6c000-b6f7d000 rw-p 00000000 00:00 0 
b7041000-b7044000 rw-p 00000000 00:00 0          [heap]
bebcc000-bebed000 rw-p 00000000 00:00 0          [stack]
ffff0000-ffff1000 r-xp 00000000 00:00 0          [vectors]

De acordo com a introdução acima, você pode entender facilmente o significado de cada campo. Dois pontos precisam ser explicados:

1. b6f38000-b6f3a000 rw-p 00000000 00:00 0,具有rw-p权限,并且后面的设备号路径都是0的,是堆空间。
2. 为什么每个so都出现三次,看它们的权限就明白了,r-xp是代码段,r--p是只读数据段,rw-p是读写数据段。

  • root:该符号链接指向该进程使用的根目录。通常为 /。
  • stat: 包含了进程的众多信息和与CPU相关的信息,所有值都是从系统启动开始累计到当前时刻的。
root@hammerhead:/proc/9884 # cat stat
9884 (adb) S 1 9882 5801 0 -1 1077936128 304 0 2 0 125 378 0 0 20 0 2 0 2477313 3063808 220 4294967295 
3069509632 3069614751 3200174704 3200165768 3068212952 0 0 4096 42232 4294967295 0 0 17 0 0 0 0 0 0 
3069619180 3069621324 3070496768

解释:
pid=9884 进程(包括轻量级进程,即线程)号 
comm=adb 应用程序或命令的名字 
task_state=S 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead 
ppid=1 父进程ID 
pgid=9882 线程组号 
sid=5801 c该任务所在的会话组ID 

后面字段与我在网上查到的不一样,这里就暂时先不列出来了,等后续我查清楚了再列出来。

  • statm: 包含了进程的内存页面相关的信息。
root@hammerhead:/proc/9884 # cat statm                                         
748 220 169 26 0 333 0
解释:
size(pages):任务虚拟地址空间大小,VmSize/4 
Resident(pages):正在使用的物理内存大小,VmRSS/4 
Shared(pages):共享页数
Trs(pages):程序所拥有的可执行虚拟内存大小, VmExe/4 
Lrs(pages):被映像倒任务的虚拟内存空间的库的大小,VmLib/4
Drs(pages):程序数据段和用户态的栈的大小,(VmData+ VmStk )/4 
dt(pages):脏页数量

  • status:该文件包含该进程的众多信息:可执行文件名、当前状态、PID 和 PPID、实际及有效的 UID 和 GID、内存使用情况、以及其他。请注意,stat 和 statm 现已过时。它们包含的信息现存于 status
root@hammerhead:/proc/9884 # cat status
Name:	adb
State:	S (sleeping)
Tgid:	9884
Pid:	9884
PPid:	1
TracerPid:	0
Uid:	2000	2000	2000	2000
Gid:	2000	2000	2000	2000
FDSize:	32
Groups:	1003 1004 1007 1011 1015 1028 3001 3002 3003 3006 
VmPeak:	    4012 kB
VmSize:	    2992 kB
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	     880 kB
VmRSS:	     880 kB
VmData:	    1196 kB
VmStk:	     136 kB
VmExe:	     104 kB
VmLib:	    1304 kB
VmPTE:	       8 kB
VmSwap:	       0 kB
Threads:	2
SigQ:	1/12274
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000000001000
SigCgt:	000000000000a4f8
CapInh:	0000000000000000
CapPrm:	0000000000000000
CapEff:	0000000000000000
CapBnd:	fffffff0000000c0
Cpus_allowed:	f
Cpus_allowed_list:	0-3
voluntary_ctxt_switches:	7
nonvoluntary_ctxt_switches:	46

解释:
Name 应用程序或命令的名字 
State 任务的状态,运行/睡眠/僵死/ 
SleepAVG 任务的平均等待时间(以nanosecond为单位),交互式任务因为休眠次数多、时间长,它们的 sleep_avg 也会相应地更大一些,所以计算出来的优先级也会相应高一些。 
Tgid 线程组号 
Pid 任务ID 
Ppid 父进程ID 
TracerPid 接收跟踪该进程信息的进程的ID号 
Uid Uid euid suid fsuid 
Gid Gid egid sgid fsgid 
FDSize 文件描述符的最大个数,file->fds 
Groups 
VmSize(KB) 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页 
VmLck(KB) 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm) 
VmRSS(KB) 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss) 
VmData(KB) 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm) 
VmStk(KB) 任务在用户态的栈的大小 (stack_vm) 
VmExe(KB) 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code) 
VmLib(KB) 被映像到任务的虚拟内存空间的库的大小 (exec_lib) 
VmPTE 该进程的所有页表的大小,单位:kb 
Threads 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符。 
SigQ 待处理信号的个数 
SigPnd 屏蔽位,存储了该线程的待处理信号 
ShdPnd 屏蔽位,存储了该线程组的待处理信号 
SigBlk 存放被阻塞的信号 
SigIgn 存放被忽略的信号 
SigCgt 存放被俘获到的信号 
CapInh Inheritable,能被当前进程执行的程序的继承的能力 
CapPrm Permitted,进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的,CapEff是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性 
CapEff Effective,进程的有效能力 
CapBnd:是系统的边界能力,我们无法改变它。
Cpus_allowed:f指出该进程可以使用CPU的亲和性掩码,因为我们指定为4块CPU,所以这里就是F(1111)
Cpus_allowed_list:0-3指出该进程可以使用CPU的列表,这里是0-3。
voluntary_ctxt_switches表示进程主动切换的次数.
nonvoluntary_ctxt_switches表示进程被动切换的次数.

  • mem:这是一个很重要的虚拟文件,它可以用来访问该进程的内存页面,你可以通过open、read、lseek函数来访问里面的内容。如果你用cat来打印里面的内容是会出错的。这个文件的主要用途我觉得是其它进程如果想要访问这个进程内存的话,就需要通过对它的读取了。


另外/proc/9884/下还有很多其它的文件和目录,后续会慢慢补齐。


发布了60 篇原创文章 · 获赞 44 · 访问量 34万+

Acho que você gosta

Origin blog.csdn.net/beyond702/article/details/52860316
Recomendado
Clasificación