4. 查看开发板系统信息

当我们新购入一台笔记本电脑或者是台式机时,都免不了会去看看它的CPU型号,内存容量以及硬盘的使用情况等等。 对于Linux开发板来说,实际上也相当于一台小型电脑,虽然距离传统PC可能有差别,但是麻雀虽小,五脏俱全,我们同样希望去查看开发板的这些相关信息。

本章中介绍的内容大部分不仅适用于开发板,大部分也适用于开发主机中的Ubuntu系统,请尝试在两种平台上执行相关的命令查看信息,比较差异。

4.1. 初探/proc目录

Linux没有提供类似Windows的任务管理器,但是它将系统运行的信息都记录在/proc目录下的文件中, 用户可以通过访问该目录下的文件获取对应的系统信息。

请在开发板的终端下执行如下命令查看/proc目录的内容:

1
2
#在开发板的终端执行以下命令
ls /proc

打印信息如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
root@npi:~# ls /proc
1    17   249  33   72  9          crypto       kmsg          slabinfo
10   194  25   330  73  90         device-tree  kpagecgroup   softirqs
104  198  259  335  75  91         devices      kpagecount    stat
105  2    26   336  76  95         diskstats    kpageflags    swaps
106  20   27   337  77  96         driver       loadavg       sys
107  204  278  34   78  97         execdomains  locks         sysrq-trigger
11   206  28   345  79  98         fb           meminfo       sysvipc
12   208  286  35   8   asound     filesystems  misc          thread-self
124  21   289  350  80  buddyinfo  fs           modules       timer_list
13   219  29   36   82  bus        interrupts   mounts        tty
137  22   291  37   83  cgroups    iomem        mtd           uptime
14   229  3    38   84  cmdline    ioports      net           version
15   230  30   4    86  config.gz  irq          pagetypeinfo  vmallocinfo
16   233  31   69   87  consoles   kallsyms     partitions    vmstat
161  24   32   70   88  cpu        key-users    scsi          zoneinfo
163  243  327  71   89  cpuinfo    keys         self
root@npi:~#

该目录下各文件包含的信息如下表所示。

表 /proc文件结构

文件名

作用

pid*

“pid*”通常就是一个数字,该数字表示的是进程的 PID 号,系统中当前运行的每一个进程都有对应的一个目录,用于记录进程所有相关信息。对于操作系统来说,一个应用程序就是一个进程

self

该文件是一个软链接,指向了当前进程的目录,通过访问/proc/self/目录来获取当前进程的信息,就不用每次都获取pid

thread-self

该文件也是一个软链接,指向了当前线程,访问该文件,等价于访问“当前进程pid/task/当前线程tid”的内容。一个进程,可以包含多个线程,但至少需要一个进程,这些线程共同支撑进程的运行。

version

记录了当前运行的内核版本,通常可以使用“uname –r”命令查看

cpuinfo

记录系统中CPU的提供商和相关配置信息

modules

记录了目前系统加载的模块信息

meminfo

记录系统中内存的使用情况,free命令会访问该文件,来获取系统内存的空闲和已使用的数量

filesystems

记录内核支持的文件系统类型,通常mount一个设备时,如果没有指定文件系统并且它无法确定文件系统类型时,mount会尝试包含在该文件中的文件系统,除了那些标有“nodev”的文件系统。

通过访问/proc文件夹的内容,就可以得到我们想要的系统信息。

4.2. 查看CPU信息

/proc/cpuinfo文件存储了CPU的信息,可通过如下命令查看:

1
cat /proc/cpuinfo

打印信息如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
processor       : 0
model name      : ARMv7 Processor rev 5 (v7l)
BogoMIPS        : 48.00
Features        : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

processor       : 1
model name      : ARMv7 Processor rev 5 (v7l)
BogoMIPS        : 48.00
Features        : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

Hardware        : STM32 (Device Tree Support)
Revision        : 0000
Serial          : 001B003E3438511536383238
root@npi:~#

从上图可以看到,我们使用的硬件平台是STM32 (Device Tree Support), 是一款ARMv7架构的双核处理器(Cortex-A7内核是ARMv7架构的)。

4.3. 查看内核版本

/proc/version文件保存了内核的版本信息,我们可以通过如下命令来获取。

1
cat /proc/version

打印信息如下

1
Linux version 4.19.94-stm-r1 (jinsheng@ebf-dev) (gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)) #1 SMP PREEMPT Fri Mar 12 08:59:06 CST 2021

从上图中我们可以看到当前使用的内核版本是4.19.94。

也可以通过如下命令获取:

1
uname –a

打印信息如下

1
Linux npi 4.19.94-stm-r1 #1 SMP PREEMPT Fri Mar 12 08:59:06 CST 2021 armv7l GNU/Linux

4.4. 查看内存信息

内核将内存的使用情况记录在/proc/meminfo文件中,我们可以通过读取该文件的内容,来了解我们内存的使用情况:

1
cat /proc/meminfo

打印信息如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
MemTotal:         955500 kB
MemFree:          851800 kB
MemAvailable:     879672 kB
Buffers:            5648 kB
Cached:            36164 kB
SwapCached:            0 kB
Active:            30076 kB
Inactive:          24600 kB
Active(anon):      12936 kB
Inactive(anon):     7248 kB
Active(file):      17140 kB
Inactive(file):    17352 kB
Unevictable:          16 kB
Mlocked:              16 kB
HighTotal:        262140 kB
HighFree:         205460 kB
LowTotal:         693360 kB
LowFree:          646340 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         12876 kB
Mapped:            16836 kB
Shmem:              7324 kB
Slab:              32172 kB
SReclaimable:      11860 kB
SUnreclaim:        20312 kB
KernelStack:         760 kB
PageTables:          664 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      477748 kB
Committed_AS:      95916 kB
VmallocTotal:     245760 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:              296 kB
CmaTotal:         131072 kB
CmaFree:          128964 kB

在实际应用中,我们一般都不会直接去读取该文件的内容,而是使用下面的命令来获取内存的相关信息。

通过free命令查看系统的内存大小:

1
free -h

如下所示,输出信息共有三行,六列。其中第一行记录了我们的内存使用情况, 可以看到我们内存容量为933M,当前已使用了48M,还剩下831M可用。 shared表示表示的是多个进程共享的内存总量,这里只占有了7M字节; buff/cached表示当前磁盘缓存的大小为52M字节。

打印信息如下

1
2
3
             total        used        free      shared     buff/cache   available
Mem:         933Mi        48Mi       831Mi       7.0Mi        52Mi       858Mi
Swap:         0B          0B          0B

4.5. 查看FLASH存储器容量

/proc/partitions文件包含了存储器的分区信息,查看分区信息可以了解板载FLASH存储器的容量。

可使用如下命令查看:

1
cat /proc/partitions

它输出的表示存储器Blocks的数量,对于本示例的开发板,eMMC的每个Block大小为512Byte。

使用8GB eMMC开发板的命令输出信息如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   major minor  #blocks  name

   1        0      65536 ram0
   1        1      65536 ram1
   1        2      65536 ram2
   1        3      65536 ram3
   1        4      65536 ram4
   1        5      65536 ram5
   1        6      65536 ram6
   1        7      65536 ram7
   1        8      65536 ram8
   1        9      65536 ram9
   1       10      65536 ram10
   1       11      65536 ram11
   1       12      65536 ram12
   1       13      65536 ram13
   1       14      65536 ram14
   1       15      65536 ram15
179        0    7634944 mmcblk1
179        1       2048 mmcblk1p1
179        2     102400 mmcblk1p2
179        3        512 mmcblk1p3
179        4    7529455 mmcblk1p4

其中的mmcblk开头的都是属于eMMC存储器的数据块,把它们所有的Blocks加起来就可以算出容量(每个Block大小为512Byte):

7634944+2048+102400+512+7529455 (Block)

=15269359*512(Byte)

=15269359*512/1024/1024/1024 (GByte)

≈7.3 GByte

算出的最终结果比8GB小一点,这跟SD卡标称值比实际值小的原因一样,不要纠结。

也可使用lsblk命令查看存储器容量

1
lsblk

打印信息如下

1
2
3
4
5
6
7
8
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
mmcblk1      179:0    0  7.3G  0 disk
├─mmcblk1p1  179:1    0    2M  0 part
├─mmcblk1p2  179:2    0  100M  0 part /boot
├─mmcblk1p3  179:3    0  512K  0 part
└─mmcblk1p4  179:4    0  7.2G  0 part /
mmcblk1boot0 179:16   0    4M  1 disk
mmcblk1boot1 179:32   0    4M  1 disk

4.6. 查看任务进程

在/proc文件夹下,有很多以数字命名的文件夹,这些文件夹是用来记录当前正在运行的进程状态, 文件名则是他们的pid号,每一个进程都对应一个pid号,用于辨识。这些进程文件夹中包含的内容, 基本上是大同小异的。使用ls命令,来查看pid为1的文件夹内容,如下图所示。 其中,fd记录里当前进程使用的文件描述,mountinfo记录了挂载信息, mem则记录了该进程的内存使用情况等。

1
2
3
4
5
6
7
8
9
root@npi:/proc# ls 1
auxv             exe        mounts         personality   syscall
cgroup           fd         mountstats     root          task
clear_refs       fdinfo     net            smaps         timerslack_ns
cmdline          limits     ns             smaps_rollup  wchan
comm             map_files  oom_adj        stack
coredump_filter  maps       oom_score      stat
cwd              mem        oom_score_adj  statm
environ          mountinfo  pagemap        status

除了上面使用的这种方式,常用的还有top命令。该命令的功能类似于windows的任务管理器, 执行效果如上图所示,该命令可以会实时地更新每个进程的使用情况, 按下“q”键或“Ctrl + C”,就可以退出该命令。

1
top

打印信息如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
top - 06:39:49 up 33 min,  1 user,  load average: 0.16, 0.14, 0.09
Tasks:  87 total,   1 running,  86 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  1.0 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    933.1 total,    828.9 free,     49.8 used,     54.5 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.    858.1 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   84 root      20   0       0      0      0 I   1.3   0.0   0:32.96 kworker/0+
  458 root      20   0    6412   2400   2064 R   0.7   0.3   0:00.07 top
    1 root      20   0   30408   7248   5300 S   0.0   0.8   0:10.24 systemd
    2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthreadd
    3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
    4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp
    8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu+
    9 root      20   0       0      0      0 S   0.0   0.0   0:00.27 ksoftirqd+
   10 root      20   0       0      0      0 I   0.0   0.0   0:00.74 rcu_preem+
   11 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_sched
   12 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_bh
   13 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 migration+
   14 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0
   15 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1
   16 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 migration+
   17 root      20   0       0      0      0 S   0.0   0.0   0:00.10 ksoftirqd+
   20 root      20   0       0      0      0 S   0.0   0.0   0:00.02 kdevtmpfs

4.7. 查看支持的文件系统

/proc/filesystems可以用来查看内核支持的文件系统类型,如上图所示。图中有部分文件系统前带有“nodev”标志, 表示这些文件系统不需要挂载块设备,如网络文件系统nfs/nfs4,伪文件系统sysfs等。

1
cat /proc/filesystems

打印信息如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
nodev   sysfs
nodev   rootfs
nodev   ramfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cgroup2
nodev   tmpfs
nodev   devtmpfs
nodev   configfs
nodev   debugfs
nodev   tracefs
nodev   sockfs
nodev   pipefs
nodev   rpc_pipefs
nodev   devpts
        ext3
        ext2
        ext4
        squashfs
        vfat
        msdos
nodev   nfs
nodev   nfs4
        ntfs
nodev   jffs2
nodev   autofs
nodev   overlay
nodev   mqueue
nodev   ubifs
nodev   pstore

4.8. 查看CPU当前主频

除了/proc目录外,在/sys目录也可以查看一些系统相关的信息, 如文件/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq包含了CPU当前的主频信息, 若系统存在该文件,可以把它的内容输出来查看:

1
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq

打印信息如下

1
2
root@npi:/proc# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
650000

如上图中的输出,表示当前CPU主频为650MHz。