proc文件系统下各参数解析

2023-11-01

文章目录

一、proc文件系统

proc全称是process information pseudo-filesystem,翻译过来就是进程信息伪文件系统。
proc文件系统是一个伪文件系统,它提供了一个到内核数据结构的接口,一般挂载在/proc。proc文件系统中的大多数文件都是只读的,但有些文件是可写的,允许修改内核变量。

在Ubuntu20.04,内核版本是5.15.0-56。我们可以看到proc文件系统下的文件和目录如下图所示:
在这里插入图片描述
我们首先看到的是很多的数字,这些数字就是我们系统的每一个进程的信息,数字目录下面的文件的含义是一样的。我们就把这些数字归类为pid。
每个/proc/[pid]目录中的文件通常属于进程的有效用户和有效组ID。但是,作为一种安全措施,如果进程的“dumpable”属性为,则所有权将设置为root:root

请设置为1以外的值。

1.1 /proc/[pid]

每个正在运行的进程都有一个数值子目录;子目录以进程ID命名。每个/proc/[pid]子目录都包含下面描述的伪文件和目录:
在这里插入图片描述

1.1.1 /proc/[pid]/arch_status

空文件

1.1.2 /proc/[pid]/attr

此目录中的文件为安全模块提供了API。这个目录的内容是可以被读取和写入的文件,以便设置与安全相关的属性。添加这个目录是为了支持SELinux,但目的是让API足够通用,以支持其他安全模块。只有在内核配置了CONFIG_SECURITY时,才会出现这个目录。

1.1.2.1 /proc/[pid]/attr/current

该文件的内容表示进程的当前安全属性。在SELinux中,这个文件用于获取进程的安全上下文。安全模块可以选择通过写入该节点来支持“设置”操作。

1.1.2.2 /proc/[pid]/attr/exec

该文件表示在执行execve时分配给进程的属性。
在SELinux中,这是支持角色/域转换所需要的,而execve是进行这种转换的首选点,因为它在新的安全标签中提供了对流程初始化和状态继承的更好控制。在SELinux中,这个属性在execve上被重置,以便新程序对它可能进行的任何execve调用都恢复到默认行为。在SELinux中,进程只能设置自己的/proc/[pid]/attr/exec属性。

1.1.2.3 /proc/[pid]/attr/fscreate

该文件表示要分配给后续调用open(2)、mkdir(2)、symlink(2)和mknod(2)所创建的文件的属性。
SELinux使用这个文件来支持在安全状态下创建文件(使用前面提到的系统调用),这样在创建和设置属性之间就不会有不适当访问的风险。在SELinux中,该属性在execve上被重置,以便新程序对它可能进行的任何文件创建调用恢复默认行为,但该属性将在程序内的多个文件创建调用中保持,除非显式重置。在SELinux中,进程只能设置自己的/proc/[pid]/attr/fscreate属性。

1.1.2.4 /proc/[pid]/attr/keycreate

如果进程将安全上下文写入该文件,则随后创建的所有密钥(add_key(2))都将使用该上下文进行标记。

1.1.2.5 /proc/[pid]/attr/prev

该文件包含最后一次执行(2)之前进程的安全上下文;即/proc/[pid]/attr/current的上一个值。

1.1.2.6 /proc/[pid]/attr/sockcreate

如果进程将安全上下文写入此文件,则随后创建的所有套接字都将使用此上下文进行标记。

1.1.3 /proc/[pid]/autogroup

root@ubuntu:/proc/1# cat /proc/1/autogroup
/autogroup-2 nice 0

内核提供了一种被称为autogrouping的特性来为多进程和CPU密集型负载(如Linux内核中的大量并行进程)提升交互式桌面性能。当通过setsid(2) (setsid会将一个进程脱离父进程)创建一个新的会话时会创建一个新的autogroup,这种情况可能发生在一个新的终端窗口启动时。使用fork(2)创建的进程会继承父辈的autogroup成员。因此,一个会话中的所有进程都属于同一个autogroup。当最后一个进程结束后,autogroup会被自动销毁。一个autogroup中的所有成员都属于同一个内核调度器"任务组"。CFS调度器使用了在任务组间均衡分配CPU时钟周期的算法。可以使用下面例子进行展示提升交互式桌面性能的好处。autogroup的nice值的意义与进程的nice值意义相同,区别是前者为将autogroup作为一个整体,并基于相对其他autogroups设置的nice值来分配CPU时钟周期。对于一个autogroup内的进程,其CPU时钟周期为autogroup(相对于其他autogroups)的nice值和进程的nice值(相对于其他进程)的产物(即首先根据autogroup的nice值计算该autogroup所占用的CPU,然后根据进程的nice值计算该进程所占用的(属于其autogroup的)CPU)。
这里可以查看进程所属的autogroup和该autogroup的nioce值。

1.1.4 /proc/[pid]/auxv

root@ubuntu:/proc/1# hexdump auxv 
0000000 0021 0000 0000 0000 6000 efd4 7ffe 0000
0000010 0033 0000 0000 0000 06f0 0000 0000 0000
0000020 0010 0000 0000 0000 fbff 0f8b 0000 0000
0000030 0006 0000 0000 0000 1000 0000 0000 0000
0000040 0011 0000 0000 0000 0064 0000 0000 0000
0000050 0003 0000 0000 0000 8040 cd96 563b 0000
0000060 0004 0000 0000 0000 0038 0000 0000 0000
0000070 0005 0000 0000 0000 000d 0000 0000 0000
0000080 0007 0000 0000 0000 c000 fd72 7fe5 0000
0000090 0008 0000 0000 0000 0000 0000 0000 0000
00000a0 0009 0000 0000 0000 5a50 cd9a 563b 0000
00000b0 000b 0000 0000 0000 0000 0000 0000 0000
00000c0 000c 0000 0000 0000 0000 0000 0000 0000
00000d0 000d 0000 0000 0000 0000 0000 0000 0000
00000e0 000e 0000 0000 0000 0000 0000 0000 0000
00000f0 0017 0000 0000 0000 0000 0000 0000 0000
0000100 0019 0000 0000 0000 7859 efd0 7ffe 0000
0000110 001a 0000 0000 0000 0002 0000 0000 0000
0000120 001f 0000 0000 0000 7fed efd0 7ffe 0000
0000130 000f 0000 0000 0000 7869 efd0 7ffe 0000
0000140 0000 0000 0000 0000 0000 0000 0000 0000
0000150

这个文件包含了在进程执行时,传递给进程的ELF的解释器的信息。这个文件的格式是一个无符号的long类型的ID加上每个entry的一个无符号的long类型,这最后的一个entry包含了两个零。

1.1.5 /proc/[pid]/cgroup

root@ubuntu:/proc/1# cat cgroup 
13:pids:/init.scope
12:rdma:/
11:net_cls,net_prio:/
10:memory:/init.scope
9:freezer:/
8:perf_event:/
7:misc:/
6:hugetlb:/
5:cpu,cpuacct:/
4:devices:/init.scope
3:blkio:/
2:cpuset:/
1:name=systemd:/init.scope
0::/init.scope

可以获取一个进程属于哪些控制组的信息。

1.1.6 /proc/[pid]/clear_refs

这是一个只能写的文件,只能由进程的所有者写。写入的值和含义如下表所示:

含义
1 重置与进程相关的所有页的PG_Referenced和access /YOUNG位。
2 重置与进程关联的所有匿名页的PG_Referenced和access /YOUNG位。
3 重置与进程关联的所有文件映射页的PG_Referenced和accessible /YOUNG位。
4 清除与该进程关联的所有页面的软脏位。
5 将峰值驻留集大小(“高水位标记”)重置为进程当前驻留集大小值。
6 无效

1.1.7 /proc/[pid]/cmdline

root@ubuntu:/proc/1# cat cmdline 
/sbin/initautonoprompt
root@ubuntu:/proc/1# 

这个只读文件保存进程的完整命令行,除非进程是僵尸进程。在后一种情况下,这个文件中什么都没有,也就是说,对这个文件的读取将返回0个字符。命令行参数在这个文件中显示为一组由空字节(‘\0’)分隔的字符串,最后一个字符串后面还有一个空字节。

1.1.8 /proc/[pid]/comm

root@ubuntu:/proc/1# cat comm 
systemd

该文件公开进程的comm值,即与进程关联的命令名。同一个进程中的不同线程可能有不同的comm值,可以通过/proc/[pid]/task/[tid]/comm访问。一个线程可以修改它的comm值,或者同一线程组中的任何其他线程的comm值,通过写入文件/proc/self/task/[tid]/comm。长度超过一定长度的字符的字符串将被静默截断。

1.1.9 /proc/[pid]/coredump_filter

root@ubuntu:/proc/1# cat coredump_filter
00000033

1.1.10 /proc/[pid]/cpu_resctrl_groups

root@ubuntu:/proc/1# cat cpu_resctrl_groups
res:
mon:

1.1.11 /proc/[pid]/cpuset

root@ubuntu:/proc/1# cat cpuset
/

1.1.12 /proc/[pid]/cwd -> /

这是到进程当前工作目录的符号链接,也就是执行命令的时候所在的目录。在多线程进程中,如果主线程已经终止(通常通过调用pthread_exit(3)),则此符号链接的内容将不可用。

1.1.13 /proc/[pid]/environ

root@ubuntu:/proc/1# cat environ | tr '\000' '\n'
find_preseed=/preseed.cfg
HOME=/
init=/sbin/init
NETWORK_SKIP_ENSLAVED=
locale=en_US
TERM=linux
BOOT_IMAGE=/boot/vmlinuz-5.15.0-56-generic
drop_caps=
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
rootmnt=/root
priority=critical

该文件包含当前正在执行的程序通过execve(2)启动时设置的初始环境。条目由空字节(‘\0’)分隔,并且在末尾可能有一个空字节。如果在执行execve(2)之后,进程修改了它的环境(例如,通过调用putenv(3)这样的函数或直接修改environ(7)变量),该文件将不会反映这些更改。

1.1.14 /proc/[pid]/exe

root@ubuntu:/proc/1# ll exe 
lrwxrwxrwx 1 root root 0 Jan 14 05:17 exe -> /usr/lib/systemd/systemd*

该文件是一个符号链接,指向执行的程序文件,包含所执行命令的实际路径名。

1.1.15 /proc/[pid]/fd

root@ubuntu:/proc/1# ls fd
0   14  190  200  206  211  217  223  229  234  240  277  30   308  314  32   326  331  34  42  48  53  59  64  7   78
1   15  191  201  207  212  218  224  23   235  241  28   302  309  315  321  327  332  35  43  49  54  6   65  73  79
10  16  192  202  208  213  219  225  230  236  242  29   303  31   316  322  328  334  36  44  5   55  60  66  74  8
11  17  199  203  209  214  22   226  231  238  25   292  304  310  317  323  329  335  4   45  50  56  61  67  75  9
12  18  2    204  21   215  220  227  232  239  26   299  306  311  318  324  33   336  40  46  51  57  62  68  76
13  19  20   205  210  216  221  228  233  24   27   3    307  313  319  325  330  337  41  47  52  58  63  69  77
root@ubuntu:/proc/1# 

这是一个子目录,包含进程打开的每个文件的一个条目,由其文件描述符命名,是到实际文件的符号链接。

root@ubuntu:/proc/1/fd# ll
total 0
dr-x------ 2 root root  0 Jan 14 05:17 ./
dr-xr-xr-x 9 root root  0 Jan 14 05:17 ../
lrwx------ 1 root root 64 Jan 14 05:17 0 -> /dev/null
lrwx------ 1 root root 64 Jan 14 05:17 1 -> /dev/null
lr-x------ 1 root root 64 Jan 14 05:19 10 -> /proc/1/mountinfo
lr-x------ 1 root root 64 Jan 14 05:19 11 -> anon_inode:inotify
lr-x------ 1 root root 64 Jan 14 05:17 12 -> anon_inode:inotify
lr-x------ 1 root root 64 Jan 14 05:19 13 -> anon_inode:inotify
lr-x------ 1 root root 64 Jan 14 05:19 14 -> /proc/swaps
lrwx------ 1 root root 64 Jan 14 05:19 15 -> 'socket:[25142]'
lr-x------ 1 root root 64 Jan 14 05:19 16 -> anon_inode:inotify
lr-x------ 1 root root 64 Jan 14 05:19 17 -> anon_inode:inotify
lrwx------ 1 root root 64 Jan 14 05:19 18 -> 'socket:[58239]'
lrwx------ 1 root root 64 Jan 14 05:19 19 -> 'socket:[25146]'
lrwx------ 1 root root 64 Jan 14 05:19 190 -> 'socket:[25143]'
lrwx------ 1 root root 64 Jan 14 05:19 191 -> 'socket:[25144]'
lrwx------ 1 root root 64 Jan 14 05:19 192 -> 'socket:[25145]'
lrwx------ 1 root root 64 Jan 14 05:19 199 -> 'socket:[42574]'
lrwx------ 1 root root 64 Jan 14 05:17 2 -> /dev/null
lrwx------ 1 root root 64 Jan 14 05:17 20 -> 'socket:[25148]'
lrwx------ 1 root root 64 Jan 14 05:19 200 -> 'socket:[42575]'
lrwx------ 1 root root 64 Jan 14 05:19 201 -> 'socket:[25173]'
lr-x------ 1 root root 64 Jan 14 05:19 202 -> 'pipe:[25155]'
lrwx------ 1 root root 64 Jan 14 05:19 203 -> 'socket:[34670]'
lrwx------ 1 root root 64 Jan 14 05:19 204 -> 'socket:[34662]'
lrwx------ 1 root root 64 Jan 14 05:19 205 -> 'socket:[34660]'
lrwx------ 1 root root 64 Jan 14 05:19 206 -> 'socket:[25169]'
lrwx------ 1 root root 64 Jan 14 05:19 207 -> 'socket:[25171]'
lrwx------ 1 root root 64 Jan 14 05:19 208 -> /run/initctl|
lrwx------ 1 root root 64 Jan 14 05:19 209 -> 'socket:[25167]'
lrwx------ 1 root root 64 Jan 14 05:19 21 -> 'socket:[50747]'
lrwx------ 1 root root 64 Jan 14 05:19 210 -> 'socket:[34666]'
lrwx------ 1 root root 64 Jan 14 05:19 211 -> 'socket:[34668]'
lrwx------ 1 root root 64 Jan 14 05:19 212 -> 'socket:[25159]'
lrwx------ 1 root root 64 Jan 14 05:19 213 -> 'socket:[34664]'
lrwx------ 1 root root 64 Jan 14 05:19 214 -> 'socket:[25166]'
lrwx------ 1 root root 64 Jan 14 05:19 215 -> 'socket:[52770]'
lrwx------ 1 root root 64 Jan 14 05:19 216 -> 'socket:[52769]'
lrwx------ 1 root root 64 Jan 14 05:19 217 -> 'socket:[52689]'
lrwx------ 1 root root 64 Jan 14 05:19 218 -> 'socket:[52578]'
lrwx------ 1 root root 64 Jan 14 05:19 219 -> 'socket:[52485]'
lrwx------ 1 root root 64 Jan 14 05:19 22 -> 'socket:[58263]'
lrwx------ 1 root root 64 Jan 14 05:19 220 -> 'socket:[52472]'
lrwx------ 1 root root 64 Jan 14 05:19 221 -> 'socket:[52451]'
lrwx------ 1 root root 64 Jan 14 05:19 223 -> 'socket:[51377]'
lrwx------ 1 root root 64 Jan 14 05:19 224 -> 'socket:[51376]'
lrwx------ 1 root root 64 Jan 14 05:19 225 -> 'socket:[51368]'
lrwx------ 1 root root 64 Jan 14 05:19 226 -> 'socket:[51367]'
lrwx------ 1 root root 64 Jan 14 05:19 227 -> 'socket:[51366]'
lrwx------ 1 root root 64 Jan 14 05:19 228 -> 'socket:[51365]'
lrwx------ 1 root root 64 Jan 14 05:19 229 -> 'socket:[51364]'
lrwx------ 1 root root 64 Jan 14 05:19 23 -> 'socket:[50752]'
lrwx------ 1 root root 64 Jan 14 05:19 230 -> 'socket:[51363]'
lrwx------ 1 root root 64 Jan 14 05:19 231 -> 'socket:[51362]'
lrwx------ 1 root root 64 Jan 14 05:19 232 -> 'socket:[51361]'
lrwx------ 1 root root 64 Jan 14 05:19 233 -> 'socket:[51360]'
lrwx------ 1 root root 64 Jan 14 05:19 234 -> 'socket:[51359]'
lrwx------ 1 root root 64 Jan 14 05:19 235 -> 'socket:[51358]'
lrwx------ 1 root root 64 Jan 14 05:19 236 -> 'socket:[51357]'
lrwx------ 1 root root 64 Jan 14 05:19 238 -> 'socket:[51355]'
lrwx------ 1 root root 64 Jan 14 05:19 239 -> 'socket:[47559]'
lrwx------ 1 root root 64 Jan 14 05:19 24 -> anon_inode:bpf-prog
lrwx------ 1 root root 64 Jan 14 05:19 240 -> 'socket:[46764]'
lrwx------ 1 root root 64 Jan 14 05:19 241 -> 'socket:[46763]'
lrwx------ 1 root root 64 Jan 14 05:19 242 -> 'socket:[46688]'
lrwx------ 1 root root 64 Jan 14 05:19 25 -> anon_inode:bpf-prog
lr-x------ 1 root root 64 Jan 14 05:19 26 -> /dev/autofs
lrwx------ 1 root root 64 Jan 14 05:19 27 -> anon_inode:bpf-prog
lrwx------ 1 root root 64 Jan 14 05:19 277 -> 'socket:[46107]'
lrwx------ 1 root root 64 Jan 14 05:19 28 -> 'anon_inode:[timerfd]'
lrwx------ 1 root root 64 Jan 14 05:19 29 -> anon_inode:bpf-prog
lrwx------ 1 root root 64 Jan 14 05:19 292 -> 'socket:[41161]'
lrwx------ 1 root root 64 Jan 14 05:19 299 -> 'socket:[40535]'
l-wx------ 1 root root 64 Jan 14 05:17 3 -> /dev/kmsg
lrwx------ 1 root root 64 Jan 14 05:17 30 -> anon_inode:bpf-prog
lrwx------ 1 root root 64 Jan 14 05:19 302 -> 'socket:[39802]'
lrwx------ 1 root root 64 Jan 14 05:19 303 -> 'socket:[39796]'
lrwx------ 1 root root 64 Jan 14 05:19 304 -> 'socket:[36460]'
lrwx------ 1 root root 64 Jan 14 05:19 306 -> 'socket:[36362]'
lrwx------ 1 root root 64 Jan 14 05:19 307 -> 'socket:[38990]'
lrwx------ 1 root root 64 Jan 14 05:19 308 -> 'socket:[37428]'
lrwx------ 1 root root 64 Jan 14 05:19 309 -> 'socket:[37427]'
lrwx------ 1 root root 64 Jan 14 05:17 31 -> anon_inode:bpf-prog
lrwx------ 1 root root 64 Jan 14 05:19 310 -> 'socket:[37426]'
lrwx------ 1 root root 64 Jan 14 05:19 311 -> 'socket:[37259]'
lrwx------ 1 root root 64 Jan 14 05:19 313 -> 'socket:[35883]'
lrwx------ 1 root root 64 Jan 14 05:19 314 -> 'socket:[35868]'
lrwx------ 1 root root 64 Jan 14 05:19 315 -> 'socket:[34708]'
lrwx------ 1 root root 64 Jan 14 05:19 316 -> 'socket:[34707]'
lrwx------ 1 root root 64 Jan 14 05:19 317 -> 'socket:[34705]'
lrwx------ 1 root root 64 Jan 14 05:19 318 -> 'socket:[34704]'
lrwx------ 1 root root 64 Jan 14 05:19 319 -> 'socket:[34703]'
lrwx------ 1 root root 64 Jan 14 05:19 32 -> anon_inode:bpf-prog
lrwx------ 1 root root 64 Jan 14 05:19 321 -> 'socket:[34700]'
lrwx------ 1 root root 64 Jan 14 05:19 322 -> 'socket:[34606]'
lrwx------ 1 root root 64 Jan 14 05:19 323 -> 'socket:[31292]'
lrwx------ 1 root root 64 Jan 14 05:19 324 -> 'socket:[31146]'
lrwx------ 1 root root 64 Jan 14 05:19 325 -> 'socket:[31145]'
lrwx------ 1 root root 64 Jan 14 05:19 326 -> 'socket:[29691]'
lrwx------ 1 root root 64 Jan 14 05:19 327 -> /dev/input/event2
lrwx------ 1 root root 64 Jan 14 05:19 328 -> /dev/input/event3
lrwx------ 1 root root 64 Jan 14 05:19 329 -> /dev/input/event1
lrwx------ 1 root root 64 Jan 14 05:19 33 -> anon_inode:bpf-prog
lrwx------ 1 root root 64 Jan 14 05:19 330 -> /dev/input/event4
lrwx------ 1 root root 64 Jan 14 05:19 331 -> /dev/input/event0
lrwx------ 1 root root 64 Jan 14 05:19 332 -> /dev/dri/card0
lrwx------ 1 root root 64 Jan 14 05:19 334 -> /dev/rfkill
lrwx------ 1 root root 64 Jan 14 05:19 335 -> 'socket:[34658]'
lrwx------ 1 root root 64 Jan 14 05:19 336 -> 'socket:[25175]'
lrwx------ 1 root root 64 Jan 14 05:19 337 -> 'socket:[25157]'
lrwx------ 1 root root 64 Jan 14 05:17 34 -> 'socket:[58264]'
lrwx------ 1 root root 64 Jan 14 05:17 35 -> 'socket:[72575]'
lrwx------ 1 root root 64 Jan 14 05:17 36 -> 'socket:[72576]'
lrwx------ 1 root root 64 Jan 14 05:19 4 -> 'anon_inode:[eventpoll]'
lrwx------ 1 root root 64 Jan 14 05:19 40 -> 'socket:[25202]'
lrwx------ 1 root root 64 Jan 14 05:19 41 -> 'socket:[28910]'
lrwx------ 1 root root 64 Jan 14 05:19 42 -> 'socket:[50715]'
lrwx------ 1 root root 64 Jan 14 05:19 43 -> 'socket:[50716]'
lrwx------ 1 root root 64 Jan 14 05:19 44 -> 'socket:[50717]'
lrwx------ 1 root root 64 Jan 14 05:19 45 -> 'socket:[50753]'
lrwx------ 1 root root 64 Jan 14 05:19 46 -> 'anon_inode:[timerfd]'
lrwx------ 1 root root 64 Jan 14 05:19 47 -> 'socket:[50761]'
lrwx------ 1 root root 64 Jan 14 05:19 48 -> 'socket:[50927]'
lrwx------ 1 root root 64 Jan 14 05:19 49 -> 'socket:[50778]'
lrwx------ 1 root root 64 Jan 14 05:19 5 -> 'anon_inode:[signalfd]'
lrwx------ 1 root root 64 Jan 14 05:19 50 -> 'socket:[50779]'
lrwx------ 1 root root 64 Jan 14 05:19 51 -> 'socket:[50867]'
lrwx------ 1 root root 64 Jan 14 05:19 52 -> 'socket:[50868]'
lrwx------ 1 root root 64 Jan 14 05:19 53 -> 'socket:[50869]'
lrwx------ 1 root root 64 Jan 14 05:17 54 -> 'socket:[50928]'
lrwx------ 1 root root 64 Jan 14 05:17 55 -> 'socket:[50929]'
lrwx------ 1 root root 64 Jan 14 05:17 56 -> 'socket:[50882]'
lrwx------ 1 root root 64 Jan 14 05:17 57 -> 'socket:[50932]'
lrwx------ 1 root root 64 Jan 14 05:17 58 -> 'socket:[50933]'
lrwx------ 1 root root 64 Jan 14 05:17 59 -> 'socket:[54623]'
lr-x------ 1 root root 64 Jan 14 05:19 6 -> anon_inode:inotify
lrwx------ 1 root root 64 Jan 14 05:17 60 -> 'socket:[34697]'
lrwx------ 1 root root 64 Jan 14 05:19 61 -> 'socket:[54624]'
lrwx------ 1 root root 64 Jan 14 05:19 62 -> 'socket:[54625]'
lrwx------ 1 root root 64 Jan 14 05:19 63 -> 'socket:[56790]'
lrwx------ 1 root root 64 Jan 14 05:19 64 -> 'socket:[51029]'
lrwx------ 1 root root 64 Jan 14 05:19 65 -> 'socket:[51030]'
lrwx------ 1 root root 64 Jan 14 05:19 66 -> 'socket:[51042]'
lrwx------ 1 root root 64 Jan 14 05:19 67 -> 'socket:[51043]'
lrwx------ 1 root root 64 Jan 14 05:19 68 -> 'socket:[51034]'
lrwx------ 1 root root 64 Jan 14 05:19 69 -> 'socket:[51035]'
lr-x------ 1 root root 64 Jan 14 05:19 7 -> /sys/fs/cgroup/unified/
lrwx------ 1 root root 64 Jan 14 05:19 73 -> 'socket:[53966]'
lrwx------ 1 root root 64 Jan 14 05:19 74 -> 'socket:[51101]'
lrwx------ 1 root root 64 Jan 14 05:19 75 -> 'socket:[51102]'
lrwx------ 1 root root 64 Jan 14 05:19 76 -> 'socket:[51160]'
lrwx------ 1 root root 64 Jan 14 05:19 77 -> 'socket:[51161]'
lrwx------ 1 root root 64 Jan 14 05:19 78 -> 'socket:[51176]'
lrwx------ 1 root root 64 Jan 14 05:19 79 -> 'socket:[51171]'
lrwx------ 1 root root 64 Jan 14 05:19 8 -> 'anon_inode:[timerfd]'
lrwx------ 1 root root 64 Jan 14 05:17 9 -> 'anon_inode:[eventpoll]'
root@ubuntu:/proc/1/fd# 

0是标准输入,1是标准输出,2是标准误差,依此类推,其他数字就是打开的fd文件。打开的文件分为以下几种类型的文件描述符:

类型 格式 含义
管道 ‘pipe:[25155]’ 表示这是一个管道文件,inode是50867
套接字 ‘socket:[50867]’ 表示这是一个套接字文件,inode是50867
没有inode的文件描述符 anon_inode:[eventpoll] 这里的文件类型是eventpoll,还有其他文件类型,比如timerfd和signalfd
普通文件描述符 /dev/input/event2 表示该文件是打开 /dev/input/event2返回的fd

1.1.16 /proc/[pid]/fdinfo

root@ubuntu:/proc/1/fdinfo# ls
0   14  190  200  206  211  217  223  229  234  240  277  30   308  314  32   326  331  34  42  48  53  59  64  7   78
1   15  191  201  207  212  218  224  23   235  241  28   302  309  315  321  327  332  35  43  49  54  6   65  73  79
10  16  192  202  208  213  219  225  230  236  242  29   303  31   316  322  328  334  36  44  5   55  60  66  74  8
11  17  199  203  209  214  22   226  231  238  25   292  304  310  317  323  329  335  4   45  50  56  61  67  75  9
12  18  2    204  21   215  220  227  232  239  26   299  306  311  318  324  33   336  40  46  51  57  62  68  76
13  19  20   205  210  216  221  228  233  24   27   3    307  313  319  325  330  337  41  47  52  58  63  69  77
root@ubuntu:/proc/1/fdinfo# cat 0 
pos:	0
flags:	0100002
mnt_id:	26
ino:	5
root@ubuntu:/proc/1/fdinfo# 

//poll文件描述符
root@ubuntu:/proc/1# cat fdinfo/9 
pos:	0
flags:	02000002
mnt_id:	15
ino:	13577
tfd:       10 events: 80000019 data:     563bcf660010  pos:0 ino:6235 sdev:17
tfd:       13 events:       19 data:     563bcf660050  pos:0 ino:3509 sdev:e

//时间描述符
root@ubuntu:/proc/1# cat fdinfo/28
pos:	0
flags:	02004002
mnt_id:	15
ino:	13577
clockid: 1
ticks: 0
settime flags: 01
it_value: (74, 678839584)
it_interval: (0, 0)

这是一个子目录,包含进程打开的每个文件的一个条目,由其文件描述符命名。此目录下的文件仅由进程的所有者可读。可以读取每个文件的内容以获得有关相应文件描述符的信息。内容取决于对应的文件描述符所引用的文件类型。对于常规文件和目录,我们会看到值,其含义是:

例子 含义
pos pos: 0 这是一个十进制数字,显示文件偏移量。
flags flags: 02000002 这是一个八进制数,显示文件访问模式和文件状态标志(参见open(2))。如果设置了close-on-exec文件描述符标志,则标志还将包括值O_CLOEXEC。
mnt_id mnt_id: 15 该字段是包含该文件的挂载点的ID,具体请参见/proc/[pid]/mountinfo的描述。
eventfd-count eventfd-count: 40 eventfd文件描述符特有,eventfd-count是eventfd计数器的当前值,以十六进制表示。
tfd tfd: 10 events: 80000019 data: 563bcf660010 pos:0 ino:6235 sdev:17 epoll文件描述符特有,以tfd开头的每一行都描述了通过epoll文件描述符监视的一个文件描述符(有关详细信息,请参阅epoll_ctl(2))。tfd字段是文件描述符的编号。events字段是此文件描述符正在监视的事件的十六进制掩码。data字段是与此文件描述符关联的数据值。
sigmask sigmask: 0000000000000006 signalfd文件描述符,Sigmask是通过signalfd文件描述符接受的信号的十六进制掩码。(在本例中,位2和位3被设置,分别对应信号SIGINT和SIGQUIT;看到信号(7))。
inotify wd inotify wd:2 ino:7ef82a sdev:800001 mask:800afff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:2af87e00220ffd73 wd表示描述符编号(十进制)。ino表示目标文件的inode号,16进制。sdev表示目标文件所在的设备ID(十六进制)。mask表示目标文件被监控事件的掩码(十六进制)。
ino ino: 13577 目标文件的inode号(十六进制)。
clockid clockid: 1 这是时钟ID的数值,用于标记计时器的进度。
ticks ticks: 0 这是已经发生的计时器过期次数(即读取(2)后返回的值)。
settime flags settime flags: 01 这个字段列出了timerfd最后一次设置的标志,以八进制为单位
it_value it_value: (74, 678839584) 此字段包含计时器下一次到期之前的时间量,以秒和纳秒表示。无论计时器是否使用TFD_TIMER_ABSTIME标志创建,它总是以相对值表示。
it_interval it_interval: (0, 0) 该字段包含计时器的间隔,以秒和纳秒为单位。(it_value和it_interval字段包含该文件描述符上timerfd_gettime(2)将返回的值。)

1.1.17 /proc/[pid]/gid_map

root@ubuntu:/proc/1# cat gid_map 
         0          0 4294967295

该文件可以看到进程从用户命名空间映射的组ID的信息。这三个数字含义:
第一个数字:进程pid所在的用户命名空间中用户起始ID。
第二个数字:这里如何解释取决于打开uid_map的进程和进程pid是否在同一个用户命名空间中

  • 如果这两个进程在不同的用户名称空间中,第二个数字是打开uid_map的进程的用户名称空间中用户id范围的开始。
  • 如果两个进程属于同一个用户命名空间,第二个数字是进程pid的父用户命名空间中用户id范围的开始。这种情况允许uid_map的打开器(这里常见的情况是打开/proc/self/uid_map)查看用户id到创建该用户名称空间的进程的用户名称空间的映射。
    第三个数字:映射在两个用户名称空间之间的用户id范围的长度。这里4294967295表示负一。

1.1.18 /proc/[pid]/io

root@ubuntu:/proc/1# cat io 
rchar: 1737528570
wchar: 1510335625
syscr: 337293
syscw: 257345
read_bytes: 459443712
write_bytes: 703746048
cancelled_write_bytes: 92532736

该文件包含进程的I/O统计信息,文件中个字段含义如下:

字段 全称 含义
rchar characters read 进程从存储器中读取的字节数。这只是该进程传递给read(2)和类似系统调用的字节之和。它包括像终端I/O这样的东西,并且不受是否需要实际的物理磁盘I/O的影响(读取可能已经从页面缓存中得到满足)。
wchar characters written 进程已经或将写入磁盘的字节数。这里的注意事项与rchar类似
syscr read syscalls 统计通过read和pread这样的系统调用尝试读I/O操作的数量
syscw write syscalls 统计通过write和pwrite这样的系统调用尝试读I/O操作的数量
read_bytes bytes read 计算该进程实际从存储层获取的字节数。这对于块支持的文件系统是准确的。
write_bytes bytes written 计算此进程实际发送到存储层的字节数。
cancelled_write_bytes cancelled write bytes 这个字段表示这个进程通过截断页缓存导致不发生的字节数。任务也可能导致“负”I/O。如果这个进程截断了某个脏页缓存,那么另一个进程(在它的write_bytes中)占用的某个I/O将不会发生。

1.1.19 /proc/[pid]/limits

root@ubuntu:/proc/1# cat limits 
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             31362                31362                processes 
Max open files            1048576              1048576              files     
Max locked memory         67108864             67108864             bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       31362                31362                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us    

该文件显示每个进程的资源限制的软限制、硬限制和度量单位(请参阅getrlimit(2))。

1.1.20 /proc/[pid]/loginuid

root@ubuntu:/proc/1# cat loginuid 
4294967295
root@ubuntu:/proc/1# 

root@ubuntu:/proc/1# cat ../1909/loginuid 
1000
root@ubuntu:/proc/1# 

4294967295只是(无符号长整数)-1。-1表示未设置loginuid。这是任何登录过程未生成的进程的正常行为(例如,守护进程和内核进程)。loginuid默认为-1;pam_loginuid模块在您登录时(在tty / in DM / via ssh中)将其更改为您的用户ID,并且子进程会保留此值。

root@ubuntu:/proc/1# cat /etc/passwd |grep 1000
jian:x:1000:1000:jian,,,:/home/jian:/bin/bash

1000表示用户jian,登录过。

1.1.21 /proc/[pid]/map_files

root@ubuntu:/proc/1# ll map_files/
total 0
dr-x------ 2 root root  0 Jan 14 07:08 ./
dr-xr-xr-x 9 root root  0 Jan 14 05:17 ../
lr-------- 1 root root 64 Jan 14 22:10 563bcd968000-563bcd99a000 -> /usr/lib/systemd/systemd*
lr-------- 1 root root 64 Jan 14 22:10 563bcd99a000-563bcda58000 -> /usr/lib/systemd/systemd*
lr-------- 1 root root 64 Jan 14 22:10 563bcda58000-563bcdaae000 -> /usr/lib/systemd/systemd*
lr-------- 1 root root 64 Jan 14 22:10 563bcdaae000-563bcdaf4000 -> /usr/lib/systemd/systemd*
lr-------- 1 root root 64 Jan 14 22:10 563bcdaf4000-563bcdaf5000 -> /usr/lib/systemd/systemd*
lr-------- 1 root root 64 Jan 14 22:10 7fe5fc70c000-7fe5fc719000 -> /usr/lib/x86_64-linux-gnu/libm-2.31.so
lr-------- 1 root root 64 Jan 14 22:10 7fe5fc719000-7fe5fc7c0000 -> /usr/lib/x86_64-linux-gnu/libm-2.31.so
lr-------- 1 root root 64 Jan 14 22:10 7fe5fc7c0000-7fe5fc859000 -> /usr/lib/x86_64-linux-gnu/libm-2.31.so
lr-------- 1 root root 64 Jan 14 22:10 7fe5fc859000-7fe5fc85a000 -> /usr/lib/x86_64-linux-gnu/libm-2.31.so
lr-------- 1 root root 64 Jan 14 22:10 7fe5fc85a000-7fe5fc85b000 -> /usr/lib/x86_64-linux-gnu/libm-2.31.so
...
lr-------- 1 root root 64 Jan 14 22:10 7fe5fd75a000-7fe5fd75b000 -> /usr/lib/x86_64-linux-gnu/ld-2.31.so*

这个子目录包含与内存映射文件对应的条目(参见mmap(2))。条目由内存区域的开始和结束地址对命名(用十六进制数表示),并且是到映射文件本身的符号链接。

1.1.22 /proc/[pid]/maps

root@ubuntu:/proc/1# cat maps 
563bcd968000-563bcd99a000 r--p 00000000 08:05 32773659                   /usr/lib/systemd/systemd
563bcd99a000-563bcda58000 r-xp 00032000 08:05 32773659                   /usr/lib/systemd/systemd
563bcda58000-563bcdaae000 r--p 000f0000 08:05 32773659                   /usr/lib/systemd/systemd
563bcdaae000-563bcdaf4000 r--p 00145000 08:05 32773659                   /usr/lib/systemd/systemd
563bcdaf4000-563bcdaf5000 rw-p 0018b000 08:05 32773659                   /usr/lib/systemd/systemd
563bcf65b000-563bcf8f1000 rw-p 00000000 00:00 0                          [heap]

7fe5fc70c000-7fe5fc719000 r--p 00000000 08:05 32774684                   /usr/lib/x86_64-linux-gnu/libm-2.31.so
...
7fe5fd72c000-7fe5fd72d000 r--p 00000000 08:05 32773810                   /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fe5fd72d000-7fe5fd750000 r-xp 00001000 08:05 32773810                   /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fe5fd750000-7fe5fd758000 r--p 00024000 08:05 32773810                   /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fe5fd759000-7fe5fd75a000 r--p 0002c000 08:05 32773810                   /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fe5fd75a000-7fe5fd75b000 rw-p 0002d000 08:05 32773810                   /usr/lib/x86_64-linux-gnu/ld-2.31.so
7fe5fd75b000-7fe5fd75c000 rw-p 00000000 00:00 0 
7ffeefc06000-7ffeefd08000 rw-p 00000000 00:00 0                          [stack]
7ffeefd42000-7ffeefd46000 r--p 00000000 00:00 0                          [vvar]
7ffeefd46000-7ffeefd48000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]

该文件包含当前映射的内存区域及其访问权限的文件。

1.1.23 /proc/[pid]/mem

该文件可用于通过open(2)、read(2)和lseek(2)访问进程内存中的页面。

1.1.24 /proc/[pid]/mountinfo

root@ubuntu:/proc/1# cat mountinfo 
24 29 0:22 / /sys rw,nosuid,nodev,noexec,relatime shared:7 - sysfs sysfs rw
25 29 0:23 / /proc rw,nosuid,nodev,noexec,relatime shared:14 - proc proc rw
...

该文件包含有关进程的挂载命名空间中的挂载点的信息。它提供了各种信息(例如,传播状态,绑定挂载的挂载根,每个挂载及其父挂载的标识符)。每一部分的含义如下表格所示,这里以第一行输出结果来讲解:
24 29 0:22 / /sys rw,nosuid,nodev,noexec,relatime shared:7 - sysfs sysfs rw

项目 含义
mount ID 24 挂载的唯一ID ,umount后可以重复使用
parent ID 29 父挂载的ID
major:minor 0:22 这个文件系统上文件的st_dev的值
root / 文件系统中构成这个挂载的根目录的路径名
mount point /sys 挂载点相对于进程根目录的路径名
mount options rw,nosuid,nodev,noexec,relatime 每次挂载选项
optional fields shared:7 0个或多个“tag[:value]”形式的字段
separator - 可选字段的末尾用一个连字符标记,用作分隔符
filesystem type sysfs 格式为“type[.subtype]”的文件系统类型
mount source sysfs 文件系统特定的信息或“none”
super options rw 每个超级块的选项

1.1.25 /proc/[pid]/mounts

root@ubuntu:/proc/1# cat mounts
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
udev /dev devtmpfs rw,nosuid,noexec,relatime,size=4014420k,nr_inodes=1003605,mode=755,inode64 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,nosuid,nodev,noexec,relatime,size=810584k,mode=755,inode64 0 0
/dev/sda5 / ext4 rw,relatime,errors=remount-ro 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev,inode64 0 0
tmpfs /run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k,inode64 0 0
tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755,inode64 0 0
cgroup2 /sys/fs/cgroup/unified cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,name=systemd 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0
bpf /sys/fs/bpf bpf rw,nosuid,nodev,noexec,relatime,mode=700 0 0
...

该文件列出当前挂载在进程的挂载名称空间中的所有文件系统。

1.1.26 /proc/[pid]/mountstats

root@ubuntu:/proc/1# cat mountstats
device sysfs mounted on /sys with fstype sysfs
device proc mounted on /proc with fstype proc
device udev mounted on /dev with fstype devtmpfs
device devpts mounted on /dev/pts with fstype devpts
device tmpfs mounted on /run with fstype tmpfs
device /dev/sda5 mounted on / with fstype ext4
device securityfs mounted on /sys/kernel/security with fstype securityfs
device tmpfs mounted on /dev/shm with fstype tmpfs
device tmpfs mounted on /run/lock with fstype tmpfs
device tmpfs mounted on /sys/fs/cgroup with fstype tmpfs
device cgroup2 mounted on /sys/fs/cgroup/unified with fstype cgroup2
device cgroup mounted on /sys/fs/cgroup/systemd with fstype cgroup
device pstore mounted on /sys/fs/pstore with fstype pstore
device bpf mounted on /sys/fs/bpf with fstype bpf
device cgroup mounted on /sys/fs/cgroup/cpuset with fstype cgroup
。。。

该文件导出进程的挂载名称空间中有关挂载点的信息(统计信息、配置信息)。该文件仅由进程的所有者可读。

1.1.27 /proc/[pid]/net

此目录包含各种文件和子目录,其中包含有关网络层的信息。更详细的请看后面的/proc]/net章节。

1.1.28 /proc/[pid]/ns

root@ubuntu:/proc/1# ls -l ns
total 0
lrwxrwxrwx 1 root root 0 Jan 15 03:48 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 15 03:48 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 root root 0 Jan 15 03:48 mnt -> 'mnt:[4026531841]'
lrwxrwxrwx 1 root root 0 Jan 15 03:48 net -> 'net:[4026531840]'
lrwxrwxrwx 1 root root 0 Jan 15 03:48 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Jan 15 03:48 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Jan 15 03:48 time -> 'time:[4026531834]'
lrwxrwxrwx 1 root root 0 Jan 15 03:48 time_for_children -> 'time:[4026531834]'
lrwxrwxrwx 1 root root 0 Jan 15 03:48 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 15 03:48 uts -> 'uts:[4026531838]'

该文件导出进程的命名名称空间中个空间的信息。

1.1.29 /proc/[pid]/numa_maps

root@ubuntu:/proc/1# cat numa_maps
563bcd968000 default file=/usr/lib/systemd/systemd mapped=50 mapmax=2 N0=50 kernelpagesize_kB=4
563bcd99a000 default file=/usr/lib/systemd/systemd mapped=189 mapmax=3 N0=189 kernelpagesize_kB=4
563bcda58000 default file=/usr/lib/systemd/systemd mapped=66 mapmax=3 N0=66 kernelpagesize_kB=4
563bcdaae000 default file=/usr/lib/systemd/systemd anon=63 dirty=63 mapmax=2 active=0 N0=63 kernelpagesize_kB=4
563bcdaf4000 default file=/usr/lib/systemd/systemd anon=1 dirty=1 active=0 N0=1 kernelpagesize_kB=4
563bcf65b000 default heap anon=602 dirty=602 mapmax=2 active=0 N0=602 kernelpagesize_kB=4
7fe5ec000000 default anon=3 dirty=3 active=0 N0=3 kernelpagesize_kB=4
7fe5ec021000 default
7fe5f4000000 default anon=3 dirty=3 active=0 N0=3 kernelpagesize_kB=4
7fe5f4021000 default
7fe5fb703000 default
7fe5fb704000 default anon=2 dirty=2 active=0 N0=2 kernelpagesize_kB=4
7fe5fbf04000 default
7fe5fbf05000 default anon=8 dirty=8 mapmax=2 active=0 N0=8 kernelpagesize_kB=4
7fe5fc70c000 default file=/usr/lib/x86_64-linux-gnu/libm-2.31.so mapped=12 mapmax=72 N0=12 kernelpagesize_kB=4
7fe5fc719000 default file=/usr/lib/x86_64-linux-gnu/libm-2.31.so mapped=62 mapmax=69 N0=62 kernelpagesize_kB=4

1.1.30 /proc/[pid]/oom_adj

root@ubuntu:/proc/1# cat oom_adj 
0

该文件可用于调整用于选择在内存不足(OOM)情况下应该杀死哪个进程的分数。内核使用这个值对进程的oom_score值进行位移位操作:有效值在-16到+15之间,加上特殊值-17,这将完全禁用该进程的oom_score。一个大于0的分数增加了这个进程被oom杀手杀死的可能性;小于0的分数会降低这种可能性。这个文件的默认值是0,一个新的进程继承其父进程的oom_adj设置。但是,自Linux 2.6.36以来,这个文件的使用已弃用,取而代之的是/proc/[pid]/oom_score_adj。

1.1.31 /proc/[pid]/oom_score

root@ubuntu:/proc/1# cat oom_score
0

该文件显示内核为选择OOM-killer进程而提供给该进程的当前分数。得分越高,意味着该流程更有可能被oom杀手选中。该分数的基础是进程使用的内存量,增加(+)或减少(-)的因素包括:

  • 这个过程是否使用fork创建了很多子进程(+)
  • 进程是否运行了很长时间,或者占用了大量的CPU时间(-)
  • 进程是否有一个低nice值,也就是> 0的nice值(+)
  • 进程是否直接进行硬件访问(-)

1.1.32 /proc/[pid]/oom_score_adj

root@ubuntu:/proc/1# cat oom_score_adj
0

此文件可用于调整用于选择在内存不足条件下杀死哪个进程的。坏度启发式为每个候选任务分配一个值,范围从0(从不终止)到1000(总是终止),以确定哪个进程是目标进程。这些单元大致是进程可能分配的允许内存范围内的一个比例,基于对当前内存和交换使用的估计。例如,如果一个任务正在使用所有允许的内存,那么它的不良评分将是1000。如果它正在使用其允许内存的一半,它的分数将是500。在不良评分中还有一个额外的因素:根进程比其他任务多获得3%的内存。

1.1.33 /proc/[pid]/pagemap

该文件显示了进程的每个虚拟页到物理页帧或交换区域的映射。它为每个虚拟页面包含一个64位值,位的设置如下:

bit 含义
63 如果置一,表示该页存在于RAM中
62 如果置一,表示该页存在于交换空间中
61 表示该页面为文件映射页面或共享匿名页面。
57-60
56 如果置一,表示页面是独占映射的。
55 如果置一,表示PTE是脏的
0-54 如果页面在RAM中(位63),那么这些位提供页帧号,可以用来索引/proc/kpageflags和/proc/kpagecount。如果页面出现在交换中(第62位),那么第4-0位给出交换类型,第54-5位编码交换偏移量。

使用下面的代码编译成程序,可以通过这个虚拟地址对应的物理地址:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <errno.h>
#include <stdint.h>
#include <string.h>

#define PAGEMAP_ENTRY 8
#define GET_BIT(X,Y) (X & ((uint64_t)1<<Y)) >> Y
#define GET_PFN(X) X & 0x7FFFFFFFFFFFFF

const int __endian_bit = 1;
#define is_bigendian() ( (*(char*)&__endian_bit) == 0 )

int i, c, pid, status;
unsigned long virt_addr;
uint64_t read_val, file_offset, page_size;
char path_buf [0x100] = {};
FILE * f;
char *end;

int read_pagemap(char * path_buf, unsigned long virt_addr);

int main(int argc, char ** argv){
    if(argc!=3){
        printf("Argument number is not correct!\n pagemap PID VIRTUAL_ADDRESS\n");
        return -1;
    }
    if(!memcmp(argv[1],"self",sizeof("self"))){
        sprintf(path_buf, "/proc/self/pagemap");
        pid = -1;
    }
    else{
        pid = strtol(argv[1],&end, 10);
        if (end == argv[1] || *end != '\0' || pid<=0){
            printf("PID must be a positive number or 'self'\n");
            return -1;
        }
    }
    virt_addr = strtoll(argv[2], NULL, 16);
    if(pid!=-1)
        sprintf(path_buf, "/proc/%u/pagemap", pid);

    page_size = getpagesize();
    read_pagemap(path_buf, virt_addr);
    return 0;
}

int read_pagemap(char * path_buf, unsigned long virt_addr){
    printf("Big endian? %d\n", is_bigendian());
    f = fopen(path_buf, "rb");
    if(!f){
        printf("Error! Cannot open %s\n", path_buf);
        return -1;
    }

    //Shifting by virt-addr-offset number of bytes
    //and multiplying by the size of an address (the size of an entry in pagemap file)
    file_offset = virt_addr / page_size * PAGEMAP_ENTRY;
    printf("Vaddr: 0x%lx, Page_size: %lld, Entry_size: %d\n", virt_addr, page_size, PAGEMAP_ENTRY);
    printf("Reading %s at 0x%llx\n", path_buf, (unsigned long long) file_offset);
    status = fseek(f, file_offset, SEEK_SET);
    if(status){
        perror("Failed to do fseek!");
        return -1;
    }
    errno = 0;
    read_val = 0;
    unsigned char c_buf[PAGEMAP_ENTRY];
    for(i=0; i < PAGEMAP_ENTRY; i++){
        c = getc(f);
        if(c==EOF){
            printf("\nReached end of the file\n");
            return 0;
        }
        if(is_bigendian())
            c_buf[i] = c;
        else
            c_buf[PAGEMAP_ENTRY - i - 1] = c;
        printf("[%d]0x%x ", i, c);
    }
    for(i=0; i < PAGEMAP_ENTRY; i++){
        //printf("%d ",c_buf[i]);
        read_val = (read_val << 8) + c_buf[i];
    }
    printf("\n");
    printf("Result: 0x%llx\n", (unsigned long long) read_val);
    if(GET_BIT(read_val, 63)) {
        uint64_t pfn = GET_PFN(read_val);
        printf("PFN: 0x%llx (0x%llx)\n", pfn, pfn * page_size + virt_addr % page_size);
    } else
        printf("Page not present\n");
    if(GET_BIT(read_val, 62))
        printf("Page swapped\n");
    fclose(f);
    return 0;
}

通过gcc编译后,执行如下命令,aa就是程序的名字,1表示进程号,0x7fe5fd529000表示虚拟地址:

jian@ubuntu:~$ sudo ./aa 1 0x7fe5fd529000
[sudo] password for jian: 
Big endian? 0
Vaddr: 0x7fe5fd529000, Page_size: 4096, Entry_size: 8
Reading /proc/1/pagemap at 0x3ff2fea948
[0]0xb2 [1]0x4c [2]0x23 [3]0x0 [4]0x0 [5]0x0 [6]0x80 [7]0xa0 
Result: 0xa080000000234cb2
PFN: 0x234cb2 (0x234cb2000)

1.1.34 /proc/[pid]/patch_state

root@ubuntu:/proc/1# cat patch_state 
-1

1.1.35 /proc/[pid]/personality

root@ubuntu:/proc/1# cat personality 
00000000

这个只读文件公开了进程的执行域,十六进制显示。也就是说允许哪个cpu执行。00000000表示全部cpu可以执行,00000001表示cpu0不可以执行。

1.1.36 /proc/[pid]/projid_map

root@ubuntu:/proc/1# cat projid_map
         0          0 4294967295

1.1.37 /proc/[pid]/root

root@ubuntu:/proc/1# ll root
lrwxrwxrwx 1 root root 0 Jan 14 05:17 root -> //

Linux支持文件系统的每进程根,由chroot系统调用设置。该文件是一个指向进程根目录的符号链接,其行为与exe和fd/*相同。

1.1.38 /proc/[pid]/sched

root@ubuntu:/proc/1# cat sched
systemd (1, #threads: 1)
-------------------------------------------------------------------
se.exec_start                                :      94545997.349824
se.vruntime                                  :          1579.667011
se.sum_exec_runtime                          :          3553.995528
se.nr_migrations                             :                  533
nr_switches                                  :                10311
nr_voluntary_switches                        :                 8374
nr_involuntary_switches                      :                 1937
se.load.weight                               :              1048576
se.avg.load_sum                              :                 1109
se.avg.runnable_sum                          :              1136355
se.avg.util_sum                              :              1074578
se.avg.load_avg                              :                   16
se.avg.runnable_avg                          :                   16
se.avg.util_avg                              :                   15
se.avg.last_update_time                      :       94545997348864
se.avg.util_est.ewma                         :                   37
se.avg.util_est.enqueued                     :                   15
uclamp.min                                   :                    0
uclamp.max                                   :                 1024
effective uclamp.min                         :                    0
effective uclamp.max                         :                 1024
policy                                       :                    0
prio                                         :                  120
clock-delta                                  :                   17
mm->numa_scan_seq                            :                    0
numa_pages_migrated                          :                    0
numa_preferred_nid                           :                   -1
total_numa_faults                            :                    0
current_node=0, numa_group_id=0
numa_faults node=0 task_private=0 task_shared=0 group_private=0 group_shared=0

可以查看进程的调度实体相关的信息。
se.exec_start 是各个调度类维护的时间线信息,两者都频繁更新,cat sched文件中的这个字段没啥参考意义了。
se.vruntime是cfs调度的虚拟时间。
se.sum_exec_runtime表示任务运行的总时间。
se.nr_migrations 记录任务在不同CPU间迁移的次数。
sum_sleep_runtime 统计的是任务测试时间段内 sleep 和 block 两种休眠状态的的时长之和。
nr_switches 表示被切走的总次数 。
nr_voluntary_switches 表示非抢占任务被切走的次数。
nr_involuntary_switches 表示被抢占而导致的任务被切走的次数。
se.load.weight 表示CFS任务的权重,和其优先级挂钩,优先级变化了也会设置 。
policy 表示进程的调度策略。
prio 表示进程的优先级,RT: 0-99,CFS: 100-139,数值越小优先级越高。
clock-delta 是记录一次读取CPU时间需要的时长,涉及到读取硬件,测试发现和 CPU 频点高低无线性关系。

1.1.39 /proc/[pid]/schedstat

root@ubuntu:/proc/1# cat schedstat
3573454261 414543036 10366

1.1.40 /proc/[pid]/sessionid

root@ubuntu:/proc/1# cat sessionid
4294967295

1.1.41 /proc/[pid]/setgroups

root@ubuntu:/proc/1# cat setgroups
allow

该文件用于限制使用setgroups函数设置group的权限,默认是“allow”,此值只能被设置一次,后续设置将会返回错误。

1.1.42 /proc/[pid]/smaps

root@ubuntu:/proc/1# cat smaps
563bcd968000-563bcd99a000 r--p 00000000 08:05 32773659                   /usr/lib/systemd/systemd
Size:                200 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Rss:                 200 kB
Pss:                 100 kB
Shared_Clean:        200 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:          200 kB
Anonymous:             0 kB
LazyFree:              0 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
FilePmdMapped:         0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
Locked:                0 kB
THPeligible:    0
VmFlags: rd mr mw me sd 
563bcd99a000-563bcda58000 r-xp 00032000 08:05 32773659                   /usr/lib/systemd/systemd
Size:                760 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Rss:                 756 kB
Pss:                 353 kB
Shared_Clean:        756 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:          756 kB
Anonymous:             0 kB
LazyFree:              0 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
FilePmdMapped:         0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
Locked:                0 kB
THPeligible:    0
VmFlags: rd ex mr mw me sd 
...

该文件显示了每个进程映射的内存消耗详细情况。
第一行显示的信息与/proc/[pid]/maps中的映射显示的信息相同。下面几行显示了映射的大小、当前驻留在RAM中的映射数量(“Rss”)、进程在该映射中的比例份额(“Pss”)、映射中干净的共享页和不干净的共享页的数量,以及映射中干净的私有页和不干净的私有页的数量。“Referenced”表示当前标记为引用或访问的内存量。“Anonymous”显示不属于任何文件的内存量。“Swap”显示了有多少匿名内存也被使用了,但是在交换时被释放了。“KernelPageSize”行是内核用于备份虚拟内存区域的页大小。“MMUPageSize”行报告MMU使用的页面大小。“Locked”表示映射是否锁定在内存中。“ProtectionKey”行包含与虚拟内存区域相关的内存保护键。“VmFlags”行表示与虚拟内存区域相关的内核标志。

1.1.43 /proc/[pid]/smaps_rollup

root@ubuntu:/proc/1# cat smaps_rollup
563bcd968000-7ffeefd48000 ---p 00000000 00:00 0                          [rollup]
Rss:               12784 kB
Pss:                5236 kB
Pss_Anon:           3982 kB
Pss_File:           1254 kB
Pss_Shmem:             0 kB
Shared_Clean:       8308 kB
Shared_Dirty:        924 kB
Private_Clean:        32 kB
Private_Dirty:      3520 kB
Referenced:        12784 kB
Anonymous:          4444 kB
LazyFree:              0 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
FilePmdMapped:         0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
Locked:                0 kB

该文件可以提高用户程序的性能,这些用户程序决定一个进程的聚合内存统计数据(例如,总PSS)。

1.1.44 /proc/[pid]/stack

root@ubuntu:/proc/1# cat stack 
[<0>] ep_poll+0x55b/0x6a0
[<0>] do_epoll_wait+0xba/0xe0
[<0>] __x64_sys_epoll_wait+0x59/0x90
[<0>] do_syscall_64+0x59/0xc0
[<0>] entry_SYSCALL_64_after_hwframe+0x61/0xcb

该文件提供了该进程内核堆栈中函数调用的符号跟踪。

1.1.45 /proc/[pid]/stat

root@ubuntu:/proc/1# cat stat
1 (systemd) S 0 1 1 0 -1 4194560 65530 9078825 158 7113 57 302 12565 8530 20 0 1 0 70 173490176 3196 18446744073709551615 94814852456448 94814853234277 140732921837168 0 0 0 671173123 4096 1260 1 0 0 17 1 0 0 0 0 0 94814853587856 94814853873704 94814882607104 140732921839318 140732921839343 140732921839343 140732921839597 0

该文件记录进程的状态信息。每一个数字都有自己的含义。

1.1.46 /proc/[pid]/statm

root@ubuntu:/proc/1# cat statm
42356 3196 2085 190 0 5182 0

提供有关内存使用情况的信息(以页为单位)。
第一个数字表示程序总大小。
第二个数字表示常驻集大小
第三个数字表示常驻共享页的数量。
第四个数字表示代码段大小。
第五个数字表示库大小,不过现在没有使用了,一直是0。
第六个数字表示数据段和栈的总和
第七个数字表示脏页数量,不过现在没有使用了,一直是0。

1.1.47 /proc/[pid]/status

root@ubuntu:/proc/1# cat status			  
Name:	systemd                            //该进程执行的命令
Umask:	0000                               //进程Umask标志,以八进制形式表示,前导为零;
State:	S (sleeping)                       //进程的当前状态。“R(运行)”、“S(休眠)”、“D(磁盘休眠)”、“T(停止)”、“T(跟踪停止)”、“Z(僵尸)”或“X(死亡)”之一。
Tgid:	1                                  //线程组ID(即进程ID)。
Ngid:	0                                  //NUMA组ID
Pid:	1                                  //线程ID
PPid:	0                                  //父进程PID。
TracerPid:	0                              //跟踪该进程的PID(如果没有跟踪则为0)。
Uid:	0	0	0	0                      //真实的,有效的,保存的集合,和文件系统Uid (Gid)。
Gid:	0	0	0	0                      //
FDSize:	512                                //当前分配的文件描述符插槽数。
Groups:	                                   //补充分组列表
NStgid:	1                                  // 
NSpid:	1                                  //
NSpgid:	1                                  //
NSsid:	1                                  //
VmPeak:	  233384 kB                        //峰值虚拟内存大小
VmSize:	  169424 kB                        //虚拟内存大小
VmLck:	       0 kB                        //锁定内存大小
VmPin:	       0 kB                        //固定内存大小这些页面不能移动,因为需要直接访问物理内存。
VmHWM:	   12784 kB                        //峰值常驻集大小(“高水位标志”)
VmRSS:	   12784 kB                        //常驻集大小。注意,这里的值是RssAnon、RssFile和RssShmem的和
RssAnon:	    4444 kB                    //常驻匿名内存的大小
RssFile:	    8340 kB                    //常驻文件映射的大小
RssShmem:	       0 kB                    //常驻共享内存的大小
VmData:	   19696 kB                        //数据段的大小
VmStk:	    1032 kB                        //堆栈的大小
VmExe:	     760 kB                        //文本段的大小
VmLib:	    9552 kB                        //共享库代码大小
VmPTE:	      88 kB                        //页表项大小
VmSwap:	       0 kB                        //通过匿名私有页面交换出虚拟内存大小
HugetlbPages:	       0 kB                // hugetlb内存部分的大小(
CoreDumping:	0                          //如果进程当前正在转储内核,则值为1
THP_enabled:	1                          //
Threads:	1                              //包含该线程的进程中的线程数
SigQ:	0/31362                            //该字段包含两个以斜杠分隔的数字,。第一个是该真实用户ID当前排队的信号数量,第二个是该进程排队信号数量的资源限制
SigPnd:	0000000000000000                   //线程待定信号的掩码
ShdPnd:	0000000000000000                   //进程待定信号的掩码
SigBlk:	7be3c0fe28014a03                   //表示信号被阻塞的掩码
SigIgn:	0000000000001000                   //表示信号被忽略的掩码
SigCgt:	00000001800004ec                   //表示信号捕获的掩码
CapInh:	0000000000000000                   //在可继承集中启用的能力的掩码
CapPrm:	000001ffffffffff                   //在允许集中启用的能力的掩码
CapEff:	000001ffffffffff                   //在有效集中启用的能力的掩码
CapBnd:	000001ffffffffff                   //能力边界集,以十六进制表示
CapAmb:	0000000000000000                   //环境能力集,以十六进制表示
NoNewPrivs:	0                              //no_new_privs位的值
Seccomp:	0                              //进程的Seccomp模式;0表示SECCOMP_MODE_DISABLED;1表示SECCOMP_MODE_STRICT;2表示SECCOMP_MODE_FILTER。
Seccomp_filters:	0                      //
Speculation_Store_Bypass:	thread vulnerable		//推测缺陷缓解状态
SpeculationIndirectBranch:	conditional enabled		//
Cpus_allowed:	ffffffff,ffffffff,ffffffff,ffffffff		//该进程可能运行的cpu的十六进制掩码
Cpus_allowed_list:	0-127					//和前面一样,但是是“列表格式”
Mems_allowed:								//	允许该进程运行的内存节点掩码00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:	0				//和前面一样,但是是“列表格式”
voluntary_ctxt_switches:	8489	//自愿上下文切换的数量
nonvoluntary_ctxt_switches:	1946	//非自愿上下文切换的数量
root@ubuntu:/proc/1#


1.1.48 /proc/[pid]/syscall

root@ubuntu:/proc/1# cat syscall
232 0x4 0x563bcf846950 0x90 0xffffffff 0x0 0x3a10 0x7ffeefd070f0 0x7fe5fd64846e

该文件显示系统调用号码和当前进程正在执行的系统调用的参数寄存器,以及堆栈指针和程序计数器寄存器的值。

1.1.49 /proc/[pid]/task

这个目录为进程中的每个线程包含一个子目录。每个子目录的名称是线程的数字线程ID 。在每个子目录中,都有一组与/proc/[pid]目录下具有相同名称和内容的文件。对于所有线程共享的属性,task/[tid]子目录下的每个文件的内容将与父/proc/[pid]目录下的相应文件中的内容相同。对于每个线程都不同的属性,task/[tid]下的相应文件可能有不同的值,或者它们可能根本不存在于/proc/[pid]中。

1.1.50 /proc/[pid]/timens_offsets

root@ubuntu:/proc/1# cat timens_offsets
monotonic           0         0
boottime            0         0

1.1.51 /proc/[pid]/timers

1.1.52 /proc/[pid]/timerslack_ns

root@ubuntu:/proc/1# cat timerslack_ns
50000

1.1.53 /proc/[pid]/uid_map

root@ubuntu:/proc/1# cat uid_map
         0          0 4294967295

1.1.54 /proc/[pid]/wchan

root@ubuntu:/proc/1# cat wchan
ep_poll
root@ubuntu:/proc/1# 

进程在内核中休眠的位置对应的符号名。

1.2 /proc/acpi/

高级电源管理(APM)版本信息及电池相关状态信息。

1.3 /proc/asound/

jian@ubuntu:/proc/asound$ ll
total 0
dr-xr-xr-x  12 root root 0 Jan 12 19:05 ./
dr-xr-xr-x 411 root root 0 Jan 12 19:05 ../
lrwxrwxrwx   1 root root 5 Jan 15 18:35 AudioPCI -> card0/
dr-xr-xr-x   9 root root 0 Jan 15 18:35 card0/
-r--r--r--   1 root root 0 Jan 15 18:35 cards
-r--r--r--   1 root root 0 Jan 15 18:35 devices
-r--r--r--   1 root root 0 Jan 15 18:35 modules
dr-xr-xr-x   4 root root 0 Jan 15 18:35 oss/
-r--r--r--   1 root root 0 Jan 15 18:35 pcm
dr-xr-xr-x   6 root root 0 Jan 15 18:35 seq/
-r--r--r--   1 root root 0 Jan 15 18:35 timers
-r--r--r--   1 root root 0 Jan 15 18:35 version

ALSA使用/proc/asound目录下的文件保存设备信息并且实现一些控制目的。

1.3.1 /proc/asound/AudioPCI -> card0/

1.3.2 /proc/asound/cardX/

这里X是声卡的编号,对于系统中已经识别的每个声卡都存在对应的cardX目录,每个目录都是差不多的,可以看下下面:

jian@ubuntu:/proc/asound/card0$ ll
total 0
dr-xr-xr-x  9 root root 0 Jan 15 18:35 ./
dr-xr-xr-x 12 root root 0 Jan 12 19:05 ../
-r--r--r--  1 root root 0 Jan 15 18:42 audiopci
dr-xr-xr-x  4 root root 0 Jan 15 18:42 codec97#0/
-r--r--r--  1 root root 0 Jan 15 18:42 id
-r--r--r--  1 root root 0 Jan 15 18:42 midi0
dr-xr-xr-x  4 root root 0 Jan 15 18:42 pcm0c/
dr-xr-xr-x  4 root root 0 Jan 15 18:42 pcm0p/
dr-xr-xr-x  4 root root 0 Jan 15 18:42 pcm1p/

1.3.3 /proc/asound/cards

jian@ubuntu:/proc/asound$ cat cards 
 0 [AudioPCI       ]: ENS1371 - Ensoniq AudioPCI
                      Ensoniq AudioPCI ENS1371 at 0x2040, irq 16

该文件显示已注册的声卡的列表,还有声卡的一些大概信息。

1.3.4 /proc/asound/devices

  1:        : sequencer
  2: [ 0- 0]: digital audio playback
  3: [ 0- 0]: digital audio capture
  4: [ 0- 1]: digital audio playback
  5: [ 0- 0]: raw midi
  6: [ 0]   : control
 33:        : timer

该文件显示已注册的ALSA设备的列表

1.3.5 /proc/asound/modules

jian@ubuntu:/proc/asound$ cat /proc/asound/modules 
 0 snd_ens1371

该文件显示已注册声卡驱动的列表,并不是所有为ALSA所加载的内核模块,而是硬件驱动的列表。

1.3.6 /proc/asound/oss/

jian@ubuntu:/proc/asound$ ll oss/
total 0
dr-xr-xr-x  4 root root 0 Jan 15 18:35 ./
dr-xr-xr-x 12 root root 0 Jan 12 19:05 ../
-r--r--r--  1 root root 0 Jan 15 18:50 devices
-r--r--r--  1 root root 0 Jan 15 18:50 sndstat
jian@ubuntu:/proc/asound$ cat oss/devices 
  2: [0- 0]: raw midi
  9: [0- 0]: raw midi
jian@ubuntu:/proc/asound$ ll oss/sndstat 
-r--r--r-- 1 root root 0 Jan 15 18:50 oss/sndstat

该目录包含关于OSS模拟的信息的目录。

1.3.7 /proc/asound/pcm

jian@ubuntu:/proc/asound$ cat pcm 
00-00: ES1371/1 : ES1371 DAC2/ADC : playback 1 : capture 1
00-01: ES1371/2 : ES1371 DAC1 : playback 1

该文件显示已分配的pcm流的列表。

1.3.8 /proc/asound/seq/

jian@ubuntu:/proc/asound$ cat seq/clients 
Client info
  cur  clients : 2
  peak clients : 2
  max  clients : 192

Client   0 : "System" [Kernel]
  Port   0 : "Timer" (Rwe-)
  Port   1 : "Announce" (R-e-)
Client  14 : "Midi Through" [Kernel]
  Port   0 : "Midi Through Port-0" (RWe-)
Client  16 : "Ensoniq AudioPCI" [Kernel]
  Port   0 : "ES1371" (RWeX)
jian@ubuntu:/proc/asound$ cat seq/drivers 
snd-seq-midi,loaded,1
jian@ubuntu:/proc/asound$ cat seq/queues 
jian@ubuntu:/proc/asound$ cat seq/timer 

1.3.9 /proc/asound/timers

jian@ubuntu:/proc/asound$ cat timers
G0: system timer : 4000.000us (10000000 ticks)
P0-0-0: PCM playback 0-0-0 : SLAVE
P0-0-1: PCM capture 0-0-1 : SLAVE
P0-1-0: PCM playback 0-1-0 : SLAVE

该文件记录了ALSA已知的计时器的列表,并且描述了当前哪个是实际正在实际使用。

1.3.10 /proc/asound/version

jian@ubuntu:/proc/asound$ cat version 
Advanced Linux Sound Architecture Driver Version k5.15.0-57-generic.

只读文件, 记录了ALSA子系统模块(或内核)构建的版本和日期。

1.4 /proc/bootconfig

1.5 /proc/buddyinfo

jian@ubuntu:/proc$ cat buddyinfo 
Node 0, zone      DMA      0      0      0      0      0      0      0      1      0      1      3 
Node 0, zone    DMA32   2665   1251    573    899    279     53      9      9      6      2      0 
Node 0, zone   Normal   1056    471    144    156     55      3      0      0      0      0      0 

此文件包含用于诊断内存碎片问题的信息。每行以节点的标识和区域的名称开始,它们一起标识一个内存区域。然后,按照一定顺序划分这些区域的可用块的计数。这里本机有一个内存节点,这个节点有三个区域,分别是DMA、DMA32和Normal。每个区域后面的数字表示从0阶到11阶,每一阶的内存数量。
关于这些区域的更多信息可以在/proc/zoneinfo中找到。

1.6 /proc/bus/

jian@ubuntu:/proc$ ls bus
input  pci

这是一个目录,包含已安装总线的子目录。

1.6.1 /proc/bus/input

jian@ubuntu:/proc/bus/input$ ls
devices  handlers

该目录包含input总线的信息。

1.6.1.1 /proc/bus/input/devices
jian@ubuntu:/proc/bus/input$ cat devices 
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
U: Uniq=
H: Handlers=kbd event0 
B: PROP=0
B: EV=3
B: KEY=10000000000000 0
...

devices文件记录着输入子系统的各个设备信息,每个设备信息的内容都有 I、N、P、S、U、H、B 几个字段,下面对每个字段解释:

  • I:设备ID
  • N:设备名称
  • P:系统层次结构中设备的物理路径
  • S:系统文件路径
  • U:设备的唯一识别码,可以为空
  • H:与设备关联的输入句柄列表
  • B:位掩码,以十六进制表示
    • PROP:设备属性
    • EV :设备支持的事件类型
    • KEY :设备拥有的键盘、按键
    • MSC :设备支持的杂项事件
    • LED :设备上的LED
1.6.1.2 /proc/bus/input/handlers
jian@ubuntu:/proc/bus/input$ cat handlers 
N: Number=0 Name=rfkill
N: Number=1 Name=kbd
N: Number=2 Name=sysrq (filter)
N: Number=3 Name=mousedev Minor=32
N: Number=4 Name=evdev Minor=64
N: Number=5 Name=leds
N: Number=6 Name=joydev Minor=0

该文件记录了各个输入子系统的handlers 信息。

1.6.2 /proc/bus/pci

jian@ubuntu:/proc/bus/pci$ ls
devices  00  02  

该目录包含各种总线子目录和伪文件,其中包含有关PCI总线、已安装设备和设备驱动程序的信息。

1.6.2.1 /proc/bus/pci/devices
jian@ubuntu:/proc/bus/pci$ cat devices 
0000	80867190	0	               0	               0	               0	               0	               0	               0	               0	               0	               0	               0	               0	               0	               0	               0	agpgart-intel

这个文件记录有关PCI设备的信息,每一个pci设备都是17或者18个字段组成,每一个字段的含义是:
第1个字段是,总线设备功能,总线是前8位,后8位是设备(前5位)和功能(后3位)。
第2个字段是,vendor(前16位)和device(后16位)。
第3个字段是,中断号
第4-10个字段是bar0-bar6以及flag信息。
第11-17个字段是bar0-bar6的长度。
第18个字段是设备名称,也可以是空的。

1.6.2.2 /proc/bus/pci/XX

XX表示pci的域,pci有几个域,这里就会有几个目录。我们pci下有00和02两个目录,说明我们 的pci总线有两个pci域。每个XX目录下面都是aa.b格式的文件:

jian@ubuntu:/proc/bus/pci$ ls 00
00.0  07.0  07.3  0f.0  11.0  15.1  15.3  15.5  15.7  16.1  16.3  16.5  16.7  17.1  17.3  17.5  17.7  18.1  18.3  18.5  18.7
01.0  07.1  07.7  10.0  15.0  15.2  15.4  15.6  16.0  16.2  16.4  16.6  17.0  17.2  17.4  17.6  18.0  18.2  18.4  1

所以,对于每一个文件,aa表示总线,b表示卡槽,文件则记录着pci设备的功能信息。

1.7 /proc/cgroups

1.8 /proc/cmdline

jian@ubuntu:/proc$ cat cmdline
BOOT_IMAGE=/boot/vmlinuz-5.15.0-58-generic root=UUID=23b3b5ca-aa0c-4135-923e-11c3fa34bc68 ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet

该文件记录了在引导时传递给Linux内核的参数。

1.9 /proc/consoles

1.10 /proc/cpuinfo

jian@ubuntu:/proc$ cat cpuinfo 
processor	: 7
vendor_id	: GenuineIntel
cpu family	: 6
model		: 158
model name	: Intel(R) Core(TM) i9-9900 CPU @ 3.10GHz
stepping	: 13
microcode	: 0xffffffff
cpu MHz		: 3096.008
cache size	: 16384 KB
physical id	: 14
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 14
initial apicid	: 14
fpu		: yes
fpu_exception	: yes
cpuid level	: 22
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves arat flush_l1d arch_capabilities
bugs		: spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit srbds mmio_stale_data retbleed
bogomips	: 6192.01
clflush size	: 64
cache_alignment	: 64
address sizes	: 45 bits physical, 48 bits virtual
power management:

这是一个CPU和系统架构相关项的集合,对于每个支持的架构都有不同的列表。两个常见的条目是processor,它给出CPU编号和bogomips;在内核初始化期间计算的系统常数。SMP机器有每个CPU的信息。lscpu命令就是从这个文件中收集它的信息。

1.11 /proc/crypto

jian@ubuntu:/proc$ cat crypto
...
name         : stdrng
driver       : drbg_nopr_ctr_aes128
module       : kernel
priority     : 211
refcnt       : 1
selftest     : passed
internal     : no
type         : rng
seedsize     : 0
...

该文件记录了系统上已安装的内核使用的密码算法及每个算法的详细信息列表;

1.12 /proc/devices

ian@ubuntu:/proc$ cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  5 ttyprintk
  6 lp
  7 vcs
 10 misc
 13 input
 14 sound/midi
 14 sound/dmmidi
 21 sg
 29 fb
 89 i2c
 99 ppdev
108 ppp
116 alsa
128 ptm
136 pts
180 usb
189 usb_device
202 cpu/msr
204 ttyMAX
216 rfcomm
226 drm
236 aux
237 cec
238 lirc
239 ipmidev
240 hidraw
241 vfio
242 wwan_port
243 bsg
244 watchdog
245 remoteproc
246 ptp
247 pps
248 rtc
249 dma_heap
250 dax
251 dimmctl
252 ndctl
253 tpm
254 gpiochip

Block devices:
  7 loop
  8 sd
  9 md
 11 sr
 65 sd
 66 sd
 67 sd
 68 sd
 69 sd
 70 sd
 71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp
259 blkext

这个文件记录主设备号和设备组的文本列表。MAKEDEV脚本可以使用它来与内核保持一致。

1.13 /proc/diskstats

jian@ubuntu:/proc$ cat diskstats
   7       0 loop0 14 0 34 3 0 0 0 0 0 16 3 0 0 0 0 0 0
   7       1 loop1 45 0 698 1536 0 0 0 0 0 1552 1536 0 0 0 0 0 0
   7       2 loop2 50 0 720 941 0 0 0 0 0 952 941 0 0 0 0 0 0
   7       3 loop3 56 0 2142 2241 0 0 0 0 0 2008 2241 0 0 0 0 0 0
   7       4 loop4 59 0 2170 3228 0 0 0 0 0 2780 3228 0 0 0 0 0 0
   7       5 loop5 59 0 2186 2278 0 0 0 0 0 1628 2278 0 0 0 0 0 0
   7       6 loop6 43 0 700 932 0 0 0 0 0 948 932 0 0 0 0 0 0
   7       7 loop7 48 0 724 1352 0 0 0 0 0 1356 1352 0 0 0 0 0 0
  11       0 sr0 11 0 5 2 0 0 0 0 0 24 2 0 0 0 0 0 0
   8       0 sda 27150 20645 1567164 284433 8253 5162 135930 3278 0 61372 287711 0 0 0 0 0 0
   8       1 sda1 172 21 13366 121 2 0 2 0 0 124 121 0 0 0 0 0 0
   8       2 sda2 2 0 4 0 0 0 0 0 0 8 0 0 0 0 0 0 0
   8       5 sda5 26866 20624 1549290 284269 8251 5162 135928 3277 0 61304 287547 0 0 0 0 0 0
   7       8 loop8 43 0 696 2523 0 0 0 0 0 2308 2523 0 0 0 0 0 0
   7       9 loop9 543 0 36282 3176 0 0 0 0 0 4468 3176 0 0 0 0 0 0
   7      10 loop10 11 0 28 4 0 0 0 0 0 8 4 0 0 0 0 0 0

该文件包含每个磁盘设备的磁盘I/O统计信息。

1.14 /proc/dma

jian@ubuntu:/proc$ cat dma
 4: cascade

这个文件记录了每个正在使用且注册的ISA DMA通道的信息列表。

1.15 /proc/driver/

jian@ubuntu:/proc/driver$ ls
rtc
jian@ubuntu:/proc/driver$ cat rtc 
rtc_time	: 06:02:28
rtc_date	: 2023-01-16
alrm_time	: 00:00:00
alrm_date	: 2023-01-17
alarm_IRQ	: no
alrm_pending	: no
update IRQ enabled	: no
periodic IRQ enabled	: no
periodic IRQ frequency	: 1024
max user IRQ frequency	: 64
24hr		: yes
periodic_IRQ	: no
update_IRQ	: no
HPET_emulated	: yes
BCD		: yes
DST_enable	: no
periodic_freq	: 1024
batt_status	: okay

1.16 /proc/dynamic_debug/

该目录下只有一个文件,就是control。/proc/dynamic_debug/control这个文件可以代替/sys/kernel/debug/dynamic_debug/control。使用凡是也是一样的:

echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control

1.17 /proc/execdomains

jian@ubuntu:/proc$ cat execdomains 
0-0	Linux           	[kernel]

1.18 /proc/fb

jian@ubuntu:/proc$ cat fb 
0 svgadrmfb

1.19 /proc/filesystems

jian@ubuntu:/proc$ cat filesystems 
nodev	sysfs
nodev	tmpfs
nodev	bdev
nodev	proc
nodev	cgroup
nodev	cgroup2
nodev	cpuset
nodev	devtmpfs
nodev	configfs
nodev	debugfs
nodev	tracefs
nodev	securityfs
nodev	sockfs
nodev	bpf
nodev	pipefs
nodev	ramfs
nodev	hugetlbfs
nodev	devpts
	ext3
	ext2
	ext4
	squashfs
	vfat
nodev	ecryptfs
	fuseblk
nodev	fuse
nodev	fusectl
nodev	mqueue
nodev	pstore
	btrfs
nodev	autofs
nodev	binfmt_misc

该文件记录了当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型。

1.20 /proc/fs/

jian@ubuntu:/proc$ ls fs/
ext4  jbd2  nfsd

该目录包含系统挂载了的文件系统类型的子目录,目前现在本机已经挂载了ext4 jbd2 nfsd这三种类型的文件系统。在这些目录下则记录着该文件系统类型已经挂载的设备。在已经挂载的设备名字的目录下的各个文件则记录着设备的具体信息。

jian@ubuntu:/proc/fs$ tree 
.
├── ext4
│   └── sda5
│       ├── es_shrinker_info
│       ├── fc_info
│       ├── mb_groups
│       ├── mb_stats
│       ├── mb_structs_summary
│       └── options
├── jbd2
│   └── sda5-8
│       └── info
└── nfsd

1.21 /proc/interrupts

jian@ubuntu:/proc$ cat interrupts 
            CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       
   0:          5          0          0          0          0          0          0          0   IO-APIC    2-edge      timer
   1:          0          0          0       2867          0          0          0         10   IO-APIC    1-edge      i8042
   8:          1          0          0          0          0          0          0          0   IO-APIC    8-edge      rtc0
   9:          0          0          0          0          0          0          0          0   IO-APIC    9-fasteoi   acpi
  12:          0          0          0          0          0          0         16      45563   IO-APIC   12-edge      i8042
  14:          0          0          0          0          0          0          0          0   IO-APIC   14-edge      ata_piix
 NMI:          0          0          0          0          0          0          0          0   Non-maskable interrupts
 LOC:      50273     101090      61152      60845      72323      58620      57121     137583   Local timer interrupts
 SPU:          0          0          0          0          0          0          0          0   Spurious interrupts
 PMI:          0          0          0          0          0          0          0          0   Performance monitoring interrupts
 IWI:          0          0          0          0          0          0          0          0   IRQ work interrupts
 RTR:          0          0          0          0          0          0          0          0   APIC ICR read retries
 RES:        303        416        426        314        311        277        355        284   Rescheduling interrupts
 CAL:      28934      40829      36283      33901      24768      30956      33783      30881   Function call interrupts
 TLB:        223        214        210        301        238        232        153        195   TLB shootdowns
 TRM:          0          0          0          0          0          0          0          0   Thermal event interrupts
 THR:          0          0          0          0          0          0          0          0   Threshold APIC interrupts
 DFR:          0          0          0          0          0          0          0          0   Deferred Error APIC interrupts
 MCE:          0          0          0          0          0          0          0          0   Machine check exceptions
 MCP:         27         27         27         27         27         27         27         27   Machine check polls
 ERR:          0
 MIS:          0
 PIN:          0          0          0          0          0          0          0          0   Posted-interrupt notification event
 NPI:          0          0          0          0          0          0          0          0   Nested posted-interrupt event
 PIW:          0          0          0          0          0          0          0          0   Posted-interrupt wakeup event

该文件记录每个IO设备的每个CPU的中断数。包括了系统内部的中断,例如NMI(不可屏蔽中断),LOC(本地定时器中断),以及对于SMP系统,TLB (TLB刷新中断),RES(重调度中断),CAL(远程函数调用中断),以及其他可能的中断。

1.22 /proc/iomem

root@kylin:~#
root@kylin:~# cat /proc/iomem
00000000-0ffffffe : 28008000.spi
28000000-28000fff : 28000000.mmc
28001000-28001fff : 28001000.mmc
28005000-28005fff : 28009000.i2s
28008000-28008fff : 28008000.spi
28009000-28009fff : 28009000.i2s
2800a000-2800afff : 2800a000.can
...
28034000-28034fff : 28034000.gpio
28035000-28035fff : 28035000.gpio
28036000-28036fff : 28036000.gpio
28037000-28037fff : 28037000.gpio
28038000-28038fff : 28038000.gpio
28039000-28039fff : 28039000.gpio
...
80000000-b00fffff : System RAM
  80000000-8000ffff : reserved
  80080000-8128ffff : Kernel code
  81290000-8137ffff : reserved
  81380000-81801fff : Kernel data
  ac100000-b00fffff : reserved
c9a00000-fbffffff : System RAM
  ca400000-fa3fffff : reserved
  fa42c000-fa432fff : reserved
1000000000-1fffffffff : pcie@40000000
  1000000000-10000fffff : 0000:00:02.0
  1000100000-10002fffff : PCI Bus 0000:01
2000000000-207fffffff : System RAM
...

该文件记录了cpu的物理地址映射用途和使用情况。比如“80000000-b00fffff : System RAM”表示这段地址用作内存的,下面的“ 80080000-8128ffff : Kernel code”表示这段地址存放内核代码。“28034000-28034fff : 28034000.gpio”表示这段空间是设备内存。操作这段内存可以控制gpio。

1.23 /proc/ioports

这是当前注册的正在使用的输入输出端口区域的列表。

1.24 /proc/irq/

jian@ubuntu:/proc/irq$ ls
0  10  12  14  16  18  2   25  27  29  30  32  34  36  38  4   41  43  45  47  49  50  52  54  56  58  7  9
1  11  13  15  17  19  24  26  28  3   31  33  35  37  39  40  42  44  46  48  5   51  53  55  57  6   8  default_smp_affinity

1.24 /proc/irq/default_smp_affinity

jian@ubuntu:/proc/irq$ cat default_smp_affinity 
ffffffff,ffffffff,ffffffff,ffffffff

文件表示默认的smp架构中,每一个cpu是否允许触发中断,1表示允许,0表示不允许。default_smp_affinity 的每一位代表着一个cpu。

1.24 /proc/irq/X/

jian@ubuntu:/proc/irq/1$ ls
affinity_hint  effective_affinity  effective_affinity_list  i8042  node  smp_affinity  smp_affinity_list  spurious

X代表的中断号,有些中断没有使用,从/proc/interrupts文件可以看到使用的中断,但是这个目录下没有使用的中断也会有一个目录。这些目录下的文件都是大同小异的,如上面所示,其中i8042 是中断号的名字,这是一个目录,但是目录里面什么也没有。

jian@ubuntu:/proc/irq/1$ cat affinity_hint 
00000000,00000000,00000000,00000000
jian@ubuntu:/proc/irq/1$ cat effective_affinity
00000000,00000000,00000000,00000008
jian@ubuntu:/proc/irq/1$ cat effective_affinity_list 
3
jian@ubuntu:/proc/irq/1$ cat node 
0
jian@ubuntu:/proc/irq/1$ cat smp_affinity
00000000,00000000,00000000,00000008
jian@ubuntu:/proc/irq/1$ cat smp_affinity_list 
3
jian@ubuntu:/proc/irq/1$ cat spurious 
count 0
unhandled 0
last_unhandled 0 ms

1.25 /proc/kallsyms

它保存了模块(X)工具用来动态链接和绑定可加载模块的内核导出符号定义。

1.26 /proc/kcore

该文件表示系统的物理内存,以ELF核心文件格式存储。通过这个伪文件和一个未剥离的内核(/usr/src/linux/vmlinux)二进制文件,可以使用GDB检查任何内核数据结构的当前状态。

1.27 /proc/keys

jian@ubuntu:/proc$ cat keys
1d189757 I--Q---    18 perm 3f030000  1000  1000 keyring   _ses: 1
2275e5ca I--Q---     3 perm 1f3f0000  1000 65534 keyring   _uid.1000: empty
37bddbb8 I--Q---     1 perm 1f3f0000  1000 65534 keyring   _uid_ses.1000: 1

1.28 /proc/key-users

jian@ubuntu:/proc$ cat key-users
    0:   110 109/109 94/1000000 1927/25000000
  101:     1 1/1 1/200 9/20000
  102:     1 1/1 1/200 9/20000
  116:     2 2/2 2/200 18/20000
  121:     1 1/1 1/200 9/20000
 1000:     3 3/3 3/200 37/20000

1.29 /proc/kmsg

这个文件可以用来代替syslog(2)系统调用来读取内核消息。一个进程必须有超级用户权限才能读取这个文件,并且只有一个进程可以读取这个文件。如果正在运行使用syslog(2)系统调用功能记录内核消息的syslog进程,则不应该读取此文件。

1.30 /proc/kpagecgroup

这个文件包含一个64位的内存索引节点号,该索引节点号是每个页面所占用的内存cgroup的索引节点号,按页帧号索引。

1.31 /proc/kpagecount

该文件包含每个物理页帧映射次数的64位计数,按页帧号索引

1.32 /proc/kpageflags

该文件包含64位掩码,对应于每个物理页帧;它是按页帧数索引。

1.33 /proc/loadavg

jian@ubuntu:/proc$ cat loadavg 
0.00 0.02 0.00 1/590 2483

该文件中的前三个字段是负载平均数字,给出运行队列(状态R)或等待磁盘I/O(状态D)在1分钟、5分钟和15分钟内的平均作业数。它们与正常运行时间和其他程序给出的负载平均值相同。第四个字段由两个用斜杠(/)分隔的数字组成。第一个是当前可运行的内核调度实体(进程、线程)的数量。斜杠后面的值是系统上当前存在的内核调度实体的数量。第五个字段是最近在系统上创建的进程的PID。

1.34 /proc/locks

jian@ubuntu:/proc$ cat locks 
1: POSIX  ADVISORY  READ 1269 00:19:1438 4 4
2: POSIX  ADVISORY  READ 1269 00:19:1417 4 4
3: POSIX  ADVISORY  READ 1269 00:19:1416 4 4
4: POSIX  ADVISORY  READ 1269 00:19:1413 4 4
5: POSIX  ADVISORY  READ 1269 00:19:1412 4 4
6: POSIX  ADVISORY  READ 1269 00:19:1411 4 4
7: POSIX  ADVISORY  READ 1269 00:19:1410 4 4
8: POSIX  ADVISORY  READ 1269 00:19:1409 4 4
9: POSIX  ADVISORY  READ 1269 00:19:1408 4 4
10: POSIX  ADVISORY  READ 1269 00:19:1407 4 4
11: FLOCK  ADVISORY  WRITE 1024 00:1b:8 0 EOF
12: POSIX  ADVISORY  WRITE 1269 00:19:1406 0 EOF
13: POSIX  ADVISORY  WRITE 1269 00:19:1405 0 EOF
14: POSIX  ADVISORY  READ 1269 00:19:1396 4 4
15: POSIX  ADVISORY  READ 1862 08:05:19398682 128 128
16: POSIX  ADVISORY  READ 1862 08:05:19398678 1073741826 1073742335
17: POSIX  ADVISORY  READ 1142 08:05:19398682 128 128
18: POSIX  ADVISORY  READ 1142 08:05:19398678 1073741826 1073742335
19: POSIX  ADVISORY  WRITE 1272 00:19:1414 0 EOF
20: FLOCK  ADVISORY  WRITE 858 08:05:31727842 0 EOF
21: POSIX  ADVISORY  READ 1273 00:19:1556 4 4
22: POSIX  ADVISORY  WRITE 1273 00:19:1415 0 EOF
23: POSIX  ADVISORY  READ 1269 00:19:1556 4 4
24: FLOCK  ADVISORY  WRITE 1766 00:37:88 0 EOF
25: POSIX  ADVISORY  WRITE 1290 00:19:1443 0 EOF
26: POSIX  ADVISORY  WRITE 1023 00:19:1398 0 EOF
27: POSIX  ADVISORY  WRITE 1023 00:19:1397 0 EOF
28: POSIX  ADVISORY  READ 1023 00:19:1396 4 4
29: FLOCK  ADVISORY  WRITE 840 00:19:1213 0 EOF

该文件显示了锁的信息,每一行可以分为8个部分:
(1)锁在列表中的序号位置。
(2)锁类型。此处可能出现的值包括:

  • FLOCK :这是一个使用FLOCK(2)创建的BSD文件锁。
  • OFDLCK :这是使用fcntl(2)创建的OFD (open file description)锁。
  • POSIX :这是一个使用fcntl(2)创建的POSIX字节范围锁。
    (3)锁的类型,在这里可以出现的字符串有:
  • ADVISORY:这是一个建议锁。
  • MANDATORY:这是一个强制锁。
    (4)锁的类型。可以出现在这里的值有:
  • READ:读锁。
  • WRITE :写锁。
    (5)拥有锁的进程的PID。
    (6)三个用冒号分隔的子字段,标识包含被锁定文件所在的文件系统的设备的主要和次要设备ID,后面跟着被锁定文件的inode号。
    (7)锁的第一个字节的字节偏移量。对于BSD锁,这个值总是0。
    (8)锁最后一个字节的字节偏移量。该字段中的EOF表示锁扩展到文件的末尾。对于BSD锁,显示的值总是0。

1.35 /proc/mdstat

1.36 /proc/meminfo

jian@ubuntu:/proc$ cat meminfo 
MemTotal:        3983208 kB
MemFree:         1877212 kB
MemAvailable:    2617428 kB
Buffers:          118312 kB
Cached:           779368 kB
SwapCached:            0 kB
Active:           420352 kB
Inactive:        1058188 kB
Active(anon):       2852 kB
Inactive(anon):   578440 kB
Active(file):     417500 kB
Inactive(file):   479748 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        580924 kB
Mapped:           303088 kB
Shmem:              5568 kB
KReclaimable:      94492 kB
Slab:             192460 kB
SReclaimable:      94492 kB
SUnreclaim:        97968 kB
KernelStack:       11440 kB
PageTables:        14612 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     4088752 kB
Committed_AS:    3544920 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       63064 kB
VmallocChunk:          0 kB
Percpu:            92672 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      257856 kB
DirectMap2M:     3936256 kB
DirectMap1G:     2097152 kB

该文件报告有关系统内存使用情况的统计信息。free命令使用它来报告系统上的空闲内存和已使用内存(物理内存和交换内存)数量,以及内核使用的共享内存和缓冲区数量。文件的每一行都包含一个参数名,后面跟着一个冒号,参数值和一个可选的测量单位(例如,“kB”)。下面的列表描述了读取字段值所需的参数名称和格式说明符:
(1)MemTotal :总可用内存(即物理RAM减去一些保留位和内核二进制代码)。
(2)MemFree :表示系统尚未使用的内存,MemUsed=MemTotal-MemFree就是已被用掉的内存。
(3)MemAvailable :可用内存数。MemAvailable≈MemFree+Buffers+Cached
(4)Buffers :原始磁盘块的相对临时存储。
(5)Cached :从磁盘读取文件的内存缓存(页缓存)。
(6)SwapCached :曾经被换出的内存被换回,但仍然在交换文件中。
(7)Active :最近使用过的内存,等于Active(anon) + Active(file)的和
(8)Inactive :最近使用较少的内存。等于Inactive(anon) + Inactive(file)的和
(9)Active(anon) :最近使用过的匿名页内存
(10)Inactive(anon) :最近使用较少的匿名页内存
(11)Active(file) :最近使用过的文件页内存
(12)Inactive(file) :最近使用较少的文件页内存
(13)Unevictable :有些内存页是不能被释放的,这些内存页不能放在LRU表中,而是记录到Unevictable标中
(14)Mlocked :
(15)SwapTotal :交换空间的总大小
(16)SwapFree :交换空间的剩余容量
(17)Dirty :脏数据,等待写回磁盘的内存。
(18)Writeback :正在被主动写回磁盘的内存。
(19)AnonPages :映射到用户空间页表的非文件备份页。
(20)Mapped :已映射到内存中的文件,例如库。
(21)Shmem :tmpfs所使用的内存。
(22)KReclaimable :可回收内存,内核将在内存压力下尝试回收的内核分配。
(23)Slab :由"Slab分配器"分配的总量。
(24)SReclaimable :不存在活跃对象,可以回收的Slab容量
(25)SUnreclaim :对象处于活跃状态,不能被回收的Slab容量
(26)KernelStack :内核代码使用的堆栈区域。
(27)PageTables :页表,用于存储各个用户进程的逻辑地址和物理地址的变换关系,它本身也是一个内存区域。
(28)NFS_Unstable :发送到服务器的NFS页,但尚未提交到稳定存储。
(29)Bounce :用于块设备“反弹缓冲区”的内存。
(30)WritebackTmp :FUSE用于临时回写缓冲区的内存。
(31)CommitLimit :这是当前系统上可分配的内存总量,以千字节表示
(32)Committed_AS :系统上当前分配的内存量。提交的内存是进程分配的所有内存的总和,即使这些内存还没有被它们“使用”。
(33)VmallocTotal :vmalloc内存区域的总大小。
(34)VmallocUsed :已经使用的vmalloc内存区域。
(35)VmallocChunk :vmalloc区域中空闲的最大的连续块,
(36)Percpu :
(37)HardwareCorrupted :
(38)AnonHugePages :映射到用户空间页表的非文件支持的大页面。
(39)ShmemHugePages :共享内存和分配大页面的tmpfs所使用的内存
(40)ShmemPmdMapped :共享内存映射到具有大页面的用户空间。
(41)FileHugePages :
(42)FilePmdMapped :
(43)HugePages_Total :巨大页面池的大小。
(44)HugePages_Free :空闲巨大页面池的大小。
(45)HugePages_Rsvd :这是承诺从池中进行分配,但尚未进行分配的巨大页面的数量。
(46)HugePages_Surp :这是在/proc/sys/vm/nr_hugepages值之上的池中的大页数。
(47)Hugepagesize :大页的总大小。
(48)Hugetlb :大页的页表大小
(49)DirectMap4k :由内核线性映射为4kB页的RAM字节数。
(50)DirectMap2M :由内核线性映射为2MB页的RAM字节数。
(51)DirectMap1G :由内核线性映射为1GB页的RAM字节数。

1.37 /proc/misc

jian@ubuntu:/proc$ cat misc 
122 vsock
123 vmci
235 autofs
234 btrfs-control
124 cpu_dma_latency
227 mcelog
236 device-mapper
223 uinput
  1 psaux
196 vfio
200 tun
125 udmabuf
237 loop-control
183 hw_random
228 hpet
229 fuse
126 ecryptfs
231 snapshot
242 rfkill
127 vga_arbiter

该文件显示了字符设备的次设备号被使用情况。

1.38 /proc/modules

jian@ubuntu:/proc$ cat modules
md5 4033 1 - Live 0x10a7f000
l2cap 29505 10 hidp,rfcomm, Live 0xe0aaa000

该文件记录了系统已经加载的模块的文本列表,每一行的含义:
第一列表示模块名
第二列表示此模块占用内存空间大小,
第三列表示此模块有多少实例被装入,
第四列表示此模块依赖于其它哪些模块,
第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),
第六列表示此模块在内核内存中的偏移量;

1.39 /proc/mounts

jian@ubuntu:/proc$ ll mounts 
lrwxrwxrwx 1 root root 11 Jan 15 20:17 mounts -> self/mounts

该文件是个软连接,软连接到self/mounts。

1.40 /proc/mpt/

1.41 /proc/mtrr

jian@ubuntu:/proc$ sudo cat mtrr 
[sudo] password for jian: 
reg00: base=0x000000000 (    0MB), size= 2048MB, count=1: write-back
reg01: base=0x080000000 ( 2048MB), size= 1024MB, count=1: write-back
reg02: base=0x100000000 ( 4096MB), size= 4096MB, count=1: write-back
reg03: base=0x200000000 ( 8192MB), size= 8192MB, count=1: write-back
reg04: base=0x400000000 (16384MB), size=16384MB, count=1: write-back
reg05: base=0x800000000 (32768MB), size=32768MB, count=1: write-back
reg06: base=0x1000000000 (65536MB), size=65536MB, count=1: write-back

内存类型范围寄存器。

1.42 /proc/net -> self/net/

jian@ubuntu:/proc$ ll net
lrwxrwxrwx 1 root root 8 Jan 15 20:17 net -> self/net/

该文件是个软连接,软连接到self/net。

1.43 /proc/pagetypeinfo

jian@ubuntu:~/share/note/phytium-linux-kernel-5$ sudo cat  /proc/pagetypeinfo
[sudo] password for jian: 
Page block order: 9
Pages per block:  512

Free pages count per migrate type at order       0      1      2      3      4      5      6      7      8      9     10 
Node    0, zone      DMA, type    Unmovable      0      0      0      0      0      0      0      1      0      0      0 
Node    0, zone      DMA, type      Movable      0      0      0      0      0      0      0      0      0      1      3 
Node    0, zone      DMA, type  Reclaimable      0      0      0      0      0      0      0      0      0      0      0 
Node    0, zone      DMA, type   HighAtomic      0      0      0      0      0      0      0      0      0      0      0 
Node    0, zone      DMA, type      Isolate      0      0      0      0      0      0      0      0      0      0      0 
Node    0, zone    DMA32, type    Unmovable    162    189     71     27     13      2      0      0      0      5      0 
Node    0, zone    DMA32, type      Movable     38      4      1      1      1      1      0      0      0      0    202 
Node    0, zone    DMA32, type  Reclaimable     76     29      6     10      6      4      1      0      1      0      0 
Node    0, zone    DMA32, type   HighAtomic      0      0      0      0      0      0      0      0      0      0      0 
Node    0, zone    DMA32, type      Isolate      0      0      0      0      0      0      0      0      0      0      0 
Node    0, zone   Normal, type    Unmovable     14     12     21     26     14      7      1      0      0      1      3 
Node    0, zone   Normal, type      Movable      1      1      3      2      0      1      0      1      0      0      0 
Node    0, zone   Normal, type  Reclaimable      8      5      4      8      1      0      1      0      1      0      0 
Node    0, zone   Normal, type   HighAtomic      0      0      0      0      0      0      0      0      0      0      0 
Node    0, zone   Normal, type      Isolate      0      0      0      0      0      0      0      0      0      0      0 

Number of blocks type     Unmovable      Movable  Reclaimable   HighAtomic      Isolate 
Node 0, zone      DMA            1            7            0            0            0 
Node 0, zone    DMA32          160         1340           28            0            0 
Node 0, zone   Normal          142          340           30            0            0 

该文件可以查看各种迁移类型的页的分布情况。

1.44 /proc/partitions

jian@ubuntu:/proc$ cat partitions
major minor  #blocks  name

   7        0          4 loop0
   7        1      64748 loop1
   7        2      64792 loop2
   7        3     354608 loop3
   7        4     354640 loop4
   7        5      93888 loop5
   7        6      47028 loop6
   7        7      47032 loop7
  11        0    1048575 sr0
   8        0  524288000 sda
   8        1     524288 sda1
   8        2          1 sda2
   8        5  523760640 sda5
   7        8      50812 loop8
   7        9      51024 loop9

该文件包含每个分区的主、次编号,以及1024字节块的数量和分区名称。

1.45 /proc/pressure/

jian@ubuntu:/proc/pressure$ ls
cpu  io  memory

该目录主要记录系统的压力情况,目录下的文件分贝记录文件名的压力情况。

1.45.1 /proc/pressure/cpu

jian@ubuntu:/proc/pressure$ cat cpu 
some avg10=0.00 avg60=0.01 avg300=0.00 total=11844771
full avg10=0.00 avg60=0.00 avg300=0.00 total=0

1.45.2 /proc/pressure/io

jian@ubuntu:/proc/pressure$ cat io 
some avg10=0.00 avg60=0.00 avg300=0.00 total=36823298
full avg10=0.00 avg60=0.00 avg300=0.00 total=35522928

1.45.3 /proc/pressure/memory

jian@ubuntu:/proc/pressure$ cat memory 
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0

1.46 /proc/schedstat

jian@ubuntu:/proc$ cat schedstat
version 15
timestamp 4298743620
cpu0 0 0 0 0 0 0 17563200615 3709278645 134999
domain0 00000000,00000000,00000000,000000ff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
cpu1 0 0 0 0 0 0 30377733293 3533538054 272256
domain0 00000000,00000000,00000000,000000ff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
cpu2 0 0 0 0 0 0 20096233475 2609785136 167669
domain0 00000000,00000000,00000000,000000ff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
cpu3 0 0 0 0 0 0 19088595158 2653695803 166969
domain0 00000000,00000000,00000000,000000ff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
cpu4 0 0 0 0 0 0 14244834435 1821370720 140077
domain0 00000000,00000000,00000000,000000ff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
cpu5 0 0 0 0 0 0 15504434559 2094926784 152708
domain0 00000000,00000000,00000000,000000ff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
cpu6 0 0 0 0 0 0 18916583704 2303312637 180464
domain0 00000000,00000000,00000000,000000ff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
cpu7 0 0 0 0 0 0 24065078042 3513143266 252430
domain0 00000000,00000000,00000000,000000ff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

1.47 /proc/scsi/

jian@ubuntu:/proc/scsi$ ls
device_info  mptspi  scsi  sg

一个包含scsi中层伪文件的目录和各种scsi底层驱动程序目录,这些目录包含这个系统中每个scsi主机的一个文件,所有这些目录都给出scsi IO子系统的某些部分的状态。这些文件包含ASCII结构,因此可以用cat(1)读取。还可以写入一些文件来重新配置子系统或打开或关闭某些特性。

1.47.1 /proc/scsi/device_info

jian@ubuntu:/proc/scsi$ cat device_info  
'Aashima' 'IMAGERY 2400SP' 0x1
'CHINON' 'CD-ROM CDS-431' 0x1
'CHINON' 'CD-ROM CDS-535' 0x1
'DENON' 'DRD-25X' 0x1
'HITACHI' 'DK312C' 0x1
'HITACHI' 'DK314C' 0x1

1.47. /proc/scsi/mptspi

1.47. /proc/scsi/scsi

jian@ubuntu:/proc/scsi$ cat scsi 
Attached devices:
Host: scsi3 Channel: 00 Id: 00 Lun: 00
  Vendor: NECVMWar Model: VMware SATA CD01 Rev: 1.00
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi32 Channel: 00 Id: 00 Lun: 00
  Vendor: VMware,  Model: VMware Virtual S Rev: 1.0 
  Type:   Direct-Access                    ANSI  SCSI revision: 02

这是内核已知的所有SCSI设备的列表。该清单与引导期间看到的清单类似。SCSI目前只支持add-single-device命令,该命令允许root用户将热插拔设备添加到已知设备列表中。

1.47. /proc/scsi/sg

1.48 /proc/self

jian@ubuntu:/proc$ ll self
lrwxrwxrwx 1 root root 0 Jan 15 20:17 self -> 2766/

该文件是个软连接,连接到/proc/[pid],也就是该文件指访问/proc文件系统的进程,与以进程ID命名的/proc目录相同。

1.49 /proc/slabinfo

jian@ubuntu:/proc$ sudo cat slabinfo 
[sudo] password for jian: 
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
AF_VSOCK              75     75   1280   25    8 : tunables    0    0    0 : slabdata      3      3      0
ext4_groupinfo_4k   4011   4011    192   21    1 : tunables    0    0    0 : slabdata    191    191      0
btrfs_delayed_node      0      0    312   26    2 : tunables    0    0    0 : slabdata      0      0      0
btrfs_ordered_extent      0      0    424   38    4 : tunables    0    0    0 : slabdata      0      0      0
btrfs_extent_map       0      0    144   28    1 : tunables    0    0    0 : slabdata      0      0      0
btrfs_trans_handle      0      0    112   36    1 : tunables    0    0    0 : slabdata      0      0      0
btrfs_inode            0      0   1208   27    8 : tunables    0    0    0 : slabdata      0      0      0
fsverity_info          0      0    256   32    2 : tunables    0    0    0 : slabdata      0      0      0
fscrypt_info           0      0    136   30    1 : tunables    0    0    0 : slabdata      0      0      0
...

在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了这些对象相关slap的信息。

1.50 /proc/softirqs

1.51 /proc/stat

jian@ubuntu:/proc$ cat stat 
cpu  4551 189 2562 13709891 15707 0 339 0 0 0
cpu0 392 0 657 1714527 1713 0 40 0 0 0
cpu1 916 66 339 1711903 2415 0 35 0 0 0
cpu2 623 107 277 1713987 1921 0 50 0 0 0
cpu3 637 2 225 1714326 1689 0 20 0 0 0
cpu4 433 0 203 1714859 1561 0 16 0 0 0
cpu5 440 2 211 1714612 1753 0 24 0 0 0
cpu6 537 1 313 1713234 2732 0 111 0 0 0
cpu7 570 7 334 1712438 1920 0 42 0 0 0
intr 1719044 5 5159 0 0 0 0 0 0 1 0 0 0 74382 ...
ctxt 2817543
btime 1673842634
processes 2914
procs_running 1
procs_blocked 0
softirq 1171512 1 370100 3408 18092 41148 0 6465 431915 0 300383

内核/系统统计数据。常见条目包括:
cpu :系统(“cpu”行)或特定的cpu(“cpuN”行)在各种状态下所花费的时间量,这10个时间值分别是:user、nice、system、idle、irq、softirq、steal、guest、guest_nice。
intr :这一行显示了自启动时间以来为每个可能的系统中断服务的中断计数。第一列是服务的所有中断的总数,包括未编号的特定于体系结构的中断;随后的每一列都是该特定编号中断的总数。未编号的中断不显示,只显示总数。
ctxt :表示系统经历的上下文切换次数。
btime :系统开机的时间点,单位为秒,是1970-01-01到现在的秒数。
processes:系统启动后fork的数量
procs_running:处于可运行状态的进程数。
procs_blocked :等待I/O完成而阻塞的进程数。
softirq :这一行显示了所有cpu的softirq数量。第一列是所有softirq的总和,随后的每一列是特定softirq的总和。

1.52 /proc/swaps

jian@ubuntu:/proc$ cat swaps 
Filename				Type		Size		Used		Priority
/swapfile               file		2097148		0			-2

这个文件记录了swap正在使用的情况。

1.53 /proc/sys/

jian@ubuntu:/proc/sys$ ls
abi  debug  dev  fs  kernel  net  user  vm

这个目录包含许多对应于内核变量的文件和子目录。每个目录记录着对应系统的变量。

1.53.1 /proc/sys/abi

此目录可能包含具有应用程序二进制信息的文件。

1.53.2 /proc/sys/debug

此目录包含具有debug信息的文件。

1.53.3 /proc/sys/dev

此目录包含具有设备信息的文件。

1.53.4 /proc/sys/fs

此目录包含具有文件系统信息的文件。

1.53.5 /proc/sys/kernel

此目录包含具有内核信息的文件。

1.53.6 /proc/sys/net

此目录包含具有网络信息的文件。

1.53.7 /proc/sys/user

此目录包含具有用户信息的文件。

1.53.8 /proc/sys/vm

此目录包含具有虚拟内存信息的文件。

1.54 /proc/sysrq-trigger

该文件是控制sysrq的接口文件,只能输入不能输出。
使用方法如下:

# 立即重新启动计算机
echo "b" > /proc/sysrq-trigger
 
# 立即关闭计算机
echo "o" > /proc/sysrq-trigger
 
# 导出内存分配的信息 (可以用/var/log/message 查看)
echo "m" > /proc/sysrq-trigger
 
# 导出当前CPU寄存器信息和标志位的信息
echo "p" > /proc/sysrq-trigger
 
# 导出线程状态信息
echo "t" > /proc/sysrq-trigger
 
# 故意让系统崩溃
echo "c" > /proc/sysrq-trigger
 
# 立即重新挂载所有的文件系统
echo "s" > /proc/sysrq-trigger
 
# 立即重新挂载所有的文件系统为只读
echo "u" > /proc/sysrq-trigger

1.55 /proc/sysvipc/


jian@ubuntu:/proc/sysvipc$ ls
msg  sem  shm

该目录中的文件会列出所有 IPC 对象,这个目录中三个只读文件提供的信息与通过 ipcs 获取的信息是一样的。

1.55.1 /proc/sysvipc/msg

jian@ubuntu:/proc/sysvipc$ cat msg 
       key      msqid perms      cbytes       qnum lspid lrpid   uid   gid  cuid  cgid      stime      rtime      ctime

该文件列出所有消息队列及其特性。

1.55.2 /proc/sysvipc/sem

jian@ubuntu:/proc/sysvipc$ cat sem 
       key      semid perms      nsems   uid   gid  cuid  cgid      otime      ctime

该文件列出所有信号量集及其特性。

1.55.3 /proc/sysvipc/shm

jian@ubuntu:/proc/sysvipc$ cat shm 
       key      shmid perms                  size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime                   rss                  swap
         0          4  1600                524288  1862  1970      2  1000  1000  1000  1000 1673843791 1673843791 1673842814                401408                     0
         0          6  1600                524288  1862  1970      2  1000  1000  1000  1000 1673843791 1673843791 1673842819                401408                     0
         0          9  1600                524288  1881  2441      2  1000  1000  1000  1000 1673852224 1673852224 1673842825                102400                     0
         0         12  1600                524288  1862  1171      2  1000  1000  1000  1000 1673843792          0 1673843792                401408                     0
         0         17  1600                524288  2097  1171      2  1000  1000  1000  1000 1673845796          0 1673845796                 32768                     0
         0         20  1600               4194304  2097  1171      2  1000  1000  1000  1000 1673845848          0 1673845848                524288                     0

该文件列出所有共享内存段及其特性。

1.56 /proc/thread-self

jian@ubuntu:/proc$ ll thread-self
lrwxrwxrwx 1 root root 0 Jan 15 20:17 thread-self -> 4890/task/4890/

这是一个 软链接, 链接到进程的 /proc/self/task/tid 目录。

1.57 /proc/timer_list

1.58 /proc/tty/

1.59 /proc/uptime

jian@ubuntu:/proc$ cat uptime 
82070.07 655742.62

第一个参数num1是代表从系统启动到现在的时间(以秒为单位)。第二个参数num2是代表系统空闲的时间(以秒为单位)。

1.60 /proc/version

jian@ubuntu:/proc$ cat version
Linux version 5.15.0-58-generic (buildd@lcy02-amd64-033) (gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #64~20.04.1-Ubuntu SMP Fri Jan 6 16:42:31 UTC 2023

该文件可以查看内核版本相关信息。

1.61 /proc/version_signature

jian@ubuntu:/proc$ cat version_signature
Ubuntu 5.15.0-58.64~20.04.1-generic 5.15.74

1.62 /proc/vmallocinfo

jian@ubuntu:/proc$ sudo cat vmallocinfo
[sudo] password for jian: 
0xffffa00ac0000000-0xffffa00ac0005000   20480 irq_init_percpu_irqstack+0xec/0x180 vmap
0xffffa00ac0005000-0xffffa00ac0007000    8192 acpi_os_map_iomem+0x1da/0x210 phys=0x00000000bfefe000 ioremap
0xffffa00ac0007000-0xffffa00ac0009000    8192 acpi_os_map_iomem+0x1da/0x210 phys=0x00000000bfeff000 ioremap
0xffffa00ac0009000-0xffffa00ac000b000    8192 acpi_os_map_iomem+0x1da/0x210 phys=0x00000000bfedc000 ioremap
0xffffa00ac000b000-0xffffa00ac000d000    8192 hpet_enable+0x114/0x4e6 phys=0x00000000fed00000 ioremap
0xffffa00ac000d000-0xffffa00ac000f000    8192 gen_pool_add_owner+0x4b/0xd0 pages=1 vmalloc N0=1
...
0xffffa00ac0081000-0xffffa00ac0083000    8192 bpf_prog_alloc_no_stats+0x36/0x170 pages=1 vmalloc N0=1
0xffffa00ac0084000-0xffffa00ac0089000   20480 copy_process+0x1e6/0x18e0 pages=4 vmalloc N0=4
0xffffa00ac0089000-0xffffa00ac008b000    8192 bpf_prog_alloc_no_stats+0x36/0x170 pages=1 vmalloc N0=1
0xffffa00ac008c000-0xffffa00ac0091000   20480 copy_process+0x1e6/0x18e0 pages=4 vmalloc N0=4
0xffffa00ac0091000-0xffffa00ac0093000    8192 bpf_prog_alloc_no_stats+0x36/0x170 pages=1 vmalloc N0=1
0xffffa00ac0094000-0xffffa00ac0099000   20480 copy_process+0x1e6/0x18e0 pages=4 vmalloc N0=4
...

该文件记录了系统虚拟地址空间的详细且具体的使用情况。

1.63 /proc/vmstat

jian@ubuntu:/proc$ cat vmstat 
nr_free_pages 362431
nr_zone_inactive_anon 148142
nr_zone_active_anon 744
nr_zone_inactive_file 146833
nr_zone_active_file 167219
nr_zone_unevictable 0
nr_zone_write_pending 0
nr_mlock 0
nr_bounce 0
nr_zspages 0
nr_free_cma 0
numa_hit 2304723
numa_miss 0
numa_foreign 0
numa_interleave 4447
numa_local 2304723
numa_other 0
nr_inactive_anon 148142
nr_active_anon 744
nr_inactive_file 146833
nr_active_file 167219
nr_unevictable 0
nr_slab_reclaimable 30994
nr_slab_unreclaimable 25450
nr_isolated_anon 0
nr_isolated_file 0
workingset_nodes 0
workingset_refault_anon 0
workingset_refault_file 0
workingset_activate_anon 0
workingset_activate_file 0
workingset_restore_anon 0
workingset_restore_file 0
workingset_nodereclaim 0
nr_anon_pages 150073
nr_mapped 77068
nr_file_pages 312865
nr_dirty 0
nr_writeback 0
nr_writeback_temp 0
nr_shmem 1417
nr_shmem_hugepages 0
nr_shmem_pmdmapped 0
nr_file_hugepages 0
nr_file_pmdmapped 0
nr_anon_transparent_hugepages 1
nr_vmscan_write 0
nr_vmscan_immediate_reclaim 0
nr_dirtied 136107
nr_written 120898
nr_kernel_misc_reclaimable 0
nr_foll_pin_acquired 0
nr_foll_pin_released 0
nr_kernel_stack 11472
nr_page_table_pages 3734
nr_swapcached 0
nr_dirty_threshold 129274
nr_dirty_background_threshold 64558
pgpgin 1089152
pgpgout 569421
pswpin 0
pswpout 0
pgalloc_dma 128
pgalloc_dma32 1970162
pgalloc_normal 453961
pgalloc_movable 0
allocstall_dma 0
allocstall_dma32 0
allocstall_normal 0
allocstall_movable 0
pgskip_dma 0
pgskip_dma32 0
pgskip_normal 0
pgskip_movable 0
pgfree 2843966
pgactivate 159853
pgdeactivate 0
pglazyfree 3076
pgfault 2078070
pgmajfault 3658
pglazyfreed 0
pgrefill 0
pgreuse 432489
pgsteal_kswapd 0
pgsteal_direct 0
pgdemote_kswapd 0
pgdemote_direct 0
pgscan_kswapd 0
pgscan_direct 0
pgscan_direct_throttle 0
pgscan_anon 0
pgscan_file 0
pgsteal_anon 0
pgsteal_file 0
zone_reclaim_failed 0
pginodesteal 0
slabs_scanned 0
kswapd_inodesteal 0
kswapd_low_wmark_hit_quickly 0
kswapd_high_wmark_hit_quickly 0
pageoutrun 0
pgrotated 0
drop_pagecache 0
drop_slab 0
oom_kill 0
numa_pte_updates 0
numa_huge_pte_updates 0
numa_hint_faults 0
numa_hint_faults_local 0
numa_pages_migrated 0
pgmigrate_success 0
pgmigrate_fail 0
thp_migration_success 0
thp_migration_fail 0
thp_migration_split 0
compact_migrate_scanned 0
compact_free_scanned 0
compact_isolated 0
compact_stall 0
compact_fail 0
compact_success 0
compact_daemon_wake 0
compact_daemon_migrate_scanned 0
compact_daemon_free_scanned 0
htlb_buddy_alloc_success 0
htlb_buddy_alloc_fail 0
unevictable_pgs_culled 52819
unevictable_pgs_scanned 0
unevictable_pgs_rescued 36
unevictable_pgs_mlocked 36
unevictable_pgs_munlocked 36
unevictable_pgs_cleared 0
unevictable_pgs_stranded 0
thp_fault_alloc 0
thp_fault_fallback 0
thp_fault_fallback_charge 0
thp_collapse_alloc 1
thp_collapse_alloc_failed 0
thp_file_alloc 0
thp_file_fallback 0
thp_file_fallback_charge 0
thp_file_mapped 0
thp_split_page 0
thp_split_page_failed 0
thp_deferred_split_page 0
thp_split_pmd 0
thp_split_pud 0
thp_zero_page_alloc 0
thp_zero_page_alloc_failed 0
thp_swpout 0
thp_swpout_fallback 0
balloon_inflate 0
balloon_deflate 0
balloon_migrate 0
swap_ra 0
swap_ra_hit 0
direct_map_level2_splits 131
direct_map_level3_splits 1
nr_unstable 0

该文件统计系统虚拟地址的使用情况。

1.64 /proc/zoneinfo

ian@ubuntu:/proc$ cat zoneinfo 
Node 0, zone      DMA
  per-node stats
      nr_inactive_anon 147577
      nr_active_anon 743
      nr_inactive_file 146783
      nr_active_file 166554
      nr_unevictable 0
      nr_slab_reclaimable 30964
      nr_slab_unreclaimable 25384
      nr_isolated_anon 0
      nr_isolated_file 0
      workingset_nodes 0
      workingset_refault_anon 0
      workingset_refault_file 0
      workingset_activate_anon 0
      workingset_activate_file 0
      workingset_restore_anon 0
      workingset_restore_file 0
      workingset_nodereclaim 0
      nr_anon_pages 149526
      nr_mapped    76950
      nr_file_pages 312143
      nr_dirty     0
      nr_writeback 0
      nr_writeback_temp 0
      nr_shmem     1410
      nr_shmem_hugepages 0
      nr_shmem_pmdmapped 0
      nr_file_hugepages 0
      nr_file_pmdmapped 0
      nr_anon_transparent_hugepages 1
      nr_vmscan_write 0
      nr_vmscan_immediate_reclaim 0
      nr_dirtied   132244
      nr_written   117044
      nr_kernel_misc_reclaimable 0
      nr_foll_pin_acquired 0
      nr_foll_pin_released 0
      nr_kernel_stack 11472
      nr_page_table_pages 3725
      nr_swapcached 0
  pages free     3712
        min      66
        low      82
        high     98
        spanned  4095
        present  3997
        managed  3840
        cma      0
        protection: (0, 2919, 3794, 3794, 3794)
      nr_free_pages 3712
      nr_zone_inactive_anon 0
      nr_zone_active_anon 0
      nr_zone_inactive_file 0
      nr_zone_active_file 0
      nr_zone_unevictable 0
      nr_zone_write_pending 0
      nr_mlock     0
      nr_bounce    0
      nr_zspages   0
      nr_free_cma  0
      numa_hit     1
      numa_miss    0
      numa_foreign 0
      numa_interleave 1
      numa_local   1
      numa_other   0
  pagesets
    cpu: 0
              count: 0
              high:  10
              batch: 1
  vm stats threshold: 8
    cpu: 1
              count: 0
              high:  10
              batch: 1
  vm stats threshold: 8
    cpu: 2
              count: 0
              high:  10
              batch: 1
  vm stats threshold: 8
    cpu: 3
              count: 0
              high:  10
              batch: 1
  vm stats threshold: 8
    cpu: 4
              count: 0
              high:  10
              batch: 1
  vm stats threshold: 8
    cpu: 5
              count: 0
              high:  10
              batch: 1
  vm stats threshold: 8
    cpu: 6
              count: 0
              high:  10
              batch: 1
  vm stats threshold: 8
    cpu: 7
              count: 0
              high:  10
              batch: 1
  vm stats threshold: 8
  node_unreclaimable:  0
  start_pfn:           1
Node 0, zone    DMA32
  pages free     356327
        min      12950
        low      16187
        high     19424
        spanned  1044480
        present  782288
        managed  765904
        cma      0
        protection: (0, 0, 874, 874, 874)
      nr_free_pages 356327
      nr_zone_inactive_anon 117213
      nr_zone_active_anon 348
      nr_zone_inactive_file 70666
      nr_zone_active_file 123718
      nr_zone_unevictable 0
      nr_zone_write_pending 0
      nr_mlock     0
      nr_bounce    0
      nr_zspages   0
      nr_free_cma  0
      numa_hit     1713731
      numa_miss    0
      numa_foreign 0
      numa_interleave 2
      numa_local   1713731
      numa_other   0
  pagesets
    cpu: 0
              count: 937
              high:  2023
              batch: 63
  vm stats threshold: 48
    cpu: 1
              count: 1825
              high:  2023
              batch: 63
  vm stats threshold: 48
    cpu: 2
              count: 1401
              high:  2023
              batch: 63
  vm stats threshold: 48
    cpu: 3
              count: 1352
              high:  2023
              batch: 63
  vm stats threshold: 48
    cpu: 4
              count: 823
              high:  2023
              batch: 63
  vm stats threshold: 48
    cpu: 5
              count: 1067
              high:  2023
              batch: 63
  vm stats threshold: 48
    cpu: 6
              count: 1468
              high:  2023
              batch: 63
  vm stats threshold: 48
    cpu: 7
              count: 1962
              high:  2023
              batch: 63
  vm stats threshold: 48
  node_unreclaimable:  0
  start_pfn:           4096
Node 0, zone   Normal
  pages free     4790
        min      3878
        low      4847
        high     5816
        spanned  262144
        present  262144
        managed  226058
        cma      0
        protection: (0, 0, 0, 0, 0)
      nr_free_pages 4790
      nr_zone_inactive_anon 30364
      nr_zone_active_anon 395
      nr_zone_inactive_file 76117
      nr_zone_active_file 42836
      nr_zone_unevictable 0
      nr_zone_write_pending 0
      nr_mlock     0
      nr_bounce    0
      nr_zspages   0
      nr_free_cma  0
      numa_hit     442060
      numa_miss    0
      numa_foreign 0
      numa_interleave 4444
      numa_local   442060
      numa_other   0
  pagesets
    cpu: 0
              count: 523
              high:  605
              batch: 63
  vm stats threshold: 32
    cpu: 1
              count: 181
              high:  605
              batch: 63
  vm stats threshold: 32
    cpu: 2
              count: 528
              high:  605
              batch: 63
  vm stats threshold: 32
    cpu: 3
              count: 365
              high:  605
              batch: 63
  vm stats threshold: 32
    cpu: 4
              count: 416
              high:  605
              batch: 63
  vm stats threshold: 32
    cpu: 5
              count: 514
              high:  605
              batch: 63
  vm stats threshold: 32
    cpu: 6
              count: 325
              high:  605
              batch: 63
  vm stats threshold: 32
    cpu: 7
              count: 382
              high:  605
              batch: 63
  vm stats threshold: 32
  node_unreclaimable:  0
  start_pfn:           1048576
Node 0, zone  Movable
  pages free     0
        min      0
        low      0
        high     0
        spanned  0
        present  0
        managed  0
        cma      0
        protection: (0, 0, 0, 0, 0)
Node 0, zone   Device
  pages free     0
        min      0
        low      0
        high     0
        spanned  0
        present  0
        managed  0
        cma      0
        protection: (0, 0, 0, 0, 0)

该文件显示有关内存区域的信息。这对于分析虚拟内存行为很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

proc文件系统下各参数解析 的相关文章

  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • Linux 上的用户空间能否实现本机代码的抢占式多任务处理?

    我想知道是否可以在 Linux 用户空间的单个进程中实现本机代码的抢占式多任务处理 也就是说 从外部暂停一些正在运行的本机代码 保存上下文 交换到不同的上下文 然后恢复执行 所有这些都由用户空间精心安排 但使用可能进入内核的调用 我认为这可
  • 我不明白 execlp() 在 Linux 中如何工作

    过去两天我一直在试图理解execlp 系统调用 但我还在这里 让我直奔主题 The man pageexeclp 将系统调用声明为int execlp const char file const char arg 与描述 execl exe
  • “make install”将库安装在 /usr/lib 而不是 /usr/lib64

    我正在尝试在 64 位 CentOS 7 2 上构建并安装一个库 为了这个目的我正在跑步 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX usr DCMAKE C COMPILER
  • 按进程名称过滤并记录 CPU 使用情况

    Linux 下有选项吗顶部命令 https www man7 org linux man pages man1 top 1 html我可以在哪里按名称过滤进程并将每秒该进程的 CPU 使用情况写入日志文件 top pgrep 过滤输出top
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 高效的内存屏障

    我有一个多线程应用程序 其中每个线程都有一个整数类型的变量 这些变量在程序执行期间递增 在代码中的某些点 线程将其计数变量与其他线程的计数变量进行比较 现在 我们知道在多核上运行的线程可能会无序执行 一个线程可能无法读取其他线程的预期计数器
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 为什么我可以在 /proc/pid/maps 输出中看到几个相同的段?

    测试在32位Linux上进行 代码如下 int foo int a int b int c a b return c int main int e 0 int d foo 1 2 printf d n d scanf d e return
  • 从 systemd bash 内联脚本创建 filename_$(date %Y-%m-%d)

    我正在尝试执行systemd计时器并希望将执行脚本的输出保存在每个日期的文件中 这是我的ExecStart脚本中的 service file ExecStart bin bash c echo date Y m d gt gt home u
  • 使用 plistBuddy 获取值数组

    var keychain access groups declare a val usr libexec PlistBuddy c Print var sample plist echo val echo val 0 Ouput Array
  • Awk - 计算两个文件之间的每个唯一值和匹配值

    我有两个文件 首先 我尝试获取第 4 列中每个唯一字段的计数 然后匹配第二个文件的第二列中的唯一字段值 File1 第 4 列的每个唯一值和 File2 第 2 列包含我需要在两个文件之间匹配的值 所以本质上 我试图 gt 如果 file2
  • 如何在 GNU/Linux 上设置 Subversion (SVN) 服务器 - Ubuntu [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一台运行 Ubuntu 的笔记本电脑 我想将其用作 Subversion 服务器 既让我自己在本地承诺 也让其他人远程承诺 要使其
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 让 TeXstudio 在 linux mint 中工作:找不到文件“url.sty”。

    刚刚切换到 Linux Mint 以前的顽固 Windows 用户 我在尝试安装 TeXstudio 时遇到一些问题 Sudo apt get install texstudio 给了我一个正确的安装 至少 我是这么认为的 但是当我尝试构建
  • 使用 inotify 的正确方法是什么?

    我想使用inotifyLinux 上的机制 我希望我的应用程序知道文件何时aaa被改变了 您能给我提供一个如何做到这一点的示例吗 文档 来自监视文件系统活动 inotify https developer ibm com tutorials
  • pprof 和 ps 之间的内存使用差异

    我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况 这pprof工具显示如下 Flat Flat Sum Cum Cum Name Inlined 1 58GB 49 98 49 98 1 58GB 49 98 os Read
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例

随机推荐

  • Sqlite如何修改表结构字段类型

    转自 Sqlite如何修改表结构字段类型 百度经验 baidu com SQLite 仅仅支持 ALTER TABLE 语句的一部分功能 我们可以用 ALTER TABLE 语句来更改一个表的名字 也可向表中增加一个字段 列 但是我们不能删
  • Java图书管理系统,课程设计必用(源码+文档)

    前提导入 高校图书馆是图书借阅的场所 它支撑着学校教学 科研等多项工作的开展 在高校中占有重要的位置 本文以高校图书馆的实际工作需求为导向 研发了一个能够满足图书管理人员和读者使用需求的图书管理系统 本系统采用Java MySQL 作为系统
  • 电容电感自谐振

    电感电容自谐振 MuRata 0603 仿真范围为0 30GHz 一 电感自谐振 二 电容自谐振 以上是利用ADS对muRata的实际电感电容自谐振的实验结果 该结果是根据阻抗幅度值得到的 其与S21显示的结果稍微有频偏 但能对应上 扼流电
  • springboot配置访问sqlserver,mysql数据库以及ssm的公共业务逻辑层抽取

    springboot的搭建 http blog csdn net goligory article details 78404480 最近喜欢用springboot 有时间就研究了一下 因为经常用sqlserver 在网上查了半天没有什么很
  • 【深度学习】Pytorch 系列教程(十一):PyTorch数据结构:3、变量(Variable)介绍

    目录 一 前言 二 实验环境 三 PyTorch数据结构 0 分类 1 张量 Tensor 2 张量操作 Tensor Operations 3 变量 Variable 一 前言 ChatGPT PyTorch是一个开源的机器学习框架 广泛
  • java web实验2客户端综合编程

    一 实验目的与要求 简述本次实验要求达到的目的 涉及到的相关知识点 实验的具体要求 1 实验目的 1 编写HTML网页 掌握HTML表单 表格等常用标签的使用 掌握CSS的语法和应用 2 编写JavaScript代码 熟悉并掌握JavaSc
  • ctk插件框架异常:The service interface class has no Q_DECLARE_INTERFACE macro

    ctk插件框架异常 The service interface class has no Q DECLARE INTERFACE macro 前言 当调试ctkPluginFramework时 抛出异常 throw ctkServiceEx
  • 【2022第十届‘泰迪杯’挑战赛】A题:害虫识别完整版(大致思路。详细过程和代码以及结果csv在压缩包中)

    2022第十届 泰迪杯 挑战赛 A题 害虫识别完整版 已有完整结果 2022泰迪杯挑战赛A题害虫识别完整版 大致思路 详细过程和代码在压缩包中 正式数据 2022 04 06 正式数据 提取码 u54n 写在前面 完整版下载 建议Chrom
  • ios备忘录下载安卓版_ios8备忘录app软件下载

    ios8备忘录最新版是一款可以在手机上安装ios8专用备忘录的软件 可以快速记录事件 支持语音输入 还可以合并多个便签 超多样式可以自己选择 感受全新的记录体验 软件的功能众多 还可以设置定时提醒功能 快来试试吧 ios8备忘录软件介绍 你
  • Latex

    http www tablesgenerator com 表格神器 LibreDigitalLibrary github io 印度人搜集的教育资源 1 MCM The Mathematical Contest in Modeling ht
  • java创建以任意图片为背景的窗口

    swing自带的窗体是不能够满足我们的应用需求的 所以需要制作任意图片和形状的JFrame框体 比如下图 并且可以设置窗体背景图片的透明度 下面说明如何做到上图的效果 1 首先你得需要一张好看的图片 比如羊皮纸 但是这个下载的图片是方方正正
  • 处理中文乱码

    处理传输中文乱码 String shopProductName request getParameter shopProductName if org springframework util StringUtils isEmpty sho
  • 雷达手势识别技术概述

    前言 不必害怕未知 无需恐惧犯错 做一个Creator 目录 前言 雷达技术特点 毫米波雷达 实现过程 手势信号预处理 手势特征提取与分类识别算法 雷达技术特点 随着雷达技术的快速发展和广泛应用 雷达手势识别已成为人机交互技术领域的一个重要
  • LoadRunner解决动态验证码问题

    对于这个问题 通常我们可以采取以下三个途径来解决该问题 1 第一种方法 也是最容易想到的 在被测系统中暂时屏蔽验证功能 也就是说 临时修改应用 无论用户输入的是什么验证码 都认为是正确的 这种方法最容易实现 对测试结果也不会有太大的影响 当
  • Linux命令之sync

    概述 sync 命令可以强制将内存中的文件缓冲写入磁盘 更新块信息 在 linux unix 系统中 在文件或数据处理过程中一般先放到内存缓冲区中 等到适当的时候再写入磁盘 以提高系统的运行效率 这样虽然可以提高磁盘写入数据的效率 但是也带
  • STM32高级定时器中心对齐PWM模式,频率设置的分享

    有关STM32高级定时器中心对齐PWM输出的实验记录 计算PWM的频率公式 f PCLK2 TIM Prescaler 1 TIM Period 1 2 条件TIM ClockDivision 0 而不是f PCLK2 TIM Presca
  • 单链表的定义,插入与删除,查找,建立。

    链表分为 单链表 双链表 循环链表 静态链表 一 单链表的定义 在内存空间中 各个节点在逻辑上相邻 但在物理上不相邻 在单个的结点内部需要存放 数据域 和 指针域 存放指向下一个结点的指针 优点 不要求一大片连续空间 改变容量方便 缺点 不
  • InVideo AI:用人工智能轻松制作视频

    简介 InVideo AI 是一款在线视频制作工具 使用人工智能来帮助用户快速 轻松地制作高质量的视频 该工具提供多种功能 包括 链接 ai invideo io 仪表盘 历史记录 创建视频 选择模板 youtube explainer 加
  • 关于华硕飞行堡垒8笔记本网卡启动不了(Inter(R) Wi-Fi 6 AX201)该设备无法启动 代码10

    今天打开笔记本莫名奇妙的 连不上WIFI了 网线可以联网 查看设备管理器 网卡亮感叹号 查看详情 提示 该设备无法启动 代码10 代码10有三个情况 1 驱动不合 概率少 2 系统不合 小概率 3 坏了 大概率 解决方案也就是 1 重装网卡
  • proc文件系统下各参数解析

    文章目录 一 proc文件系统 1 1 proc pid 1 1 1 proc pid arch status 1 1 2 proc pid attr 1 1 2 1 proc pid attr current 1 1 2 2 proc p