Busybox中包含了一个free命令,其用来查看内存信息。其输出如下:
--->8---
$ free
total used free shared buffers cached
Mem: 6122180 3908872 2213308 0 270864 2578388
-/+ buffers/cache: 1059620 5062560
Swap: 4628476 0 4628476
---8<---
其中这些信息是从那里来的呢?查看free命令的源代码(busybox/procps/free.c)可以发现,其调用sysinfo来获取这些信息。
sysinfo是Linux内核的一个API,其源码在(<kernel/sys.c>),定义如下:
--->8---
SYSCALL_DEFINE1(sysinfo, struct sysinfo __user *, info)
---8<---
sysinfo结构体的定义在<include/uapi/linux/sysinfo.h>.
--->8---
struct sysinfo {
__kernel_long_t uptime; /* Seconds since boot */
__kernel_ulong_t loads[3]; /* 1, 5, and 15 minute load averages */
__kernel_ulong_t totalram; /* Total usable main memory size */
__kernel_ulong_t freeram; /* Available memory size */
__kernel_ulong_t sharedram; /* Amount of shared memory */
__kernel_ulong_t bufferram; /* Memory used by buffers */
__kernel_ulong_t totalswap; /* Total swap space size */
__kernel_ulong_t freeswap; /* swap space still available */
__u16 procs; /* Number of current processes */
__u16 pad; /* Explicit padding for m68k */
__kernel_ulong_t totalhigh; /* Total high memory size */
__kernel_ulong_t freehigh; /* Available high memory size */
__u32 mem_unit; /* Memory unit size in bytes */
char _f[20-2*sizeof(__kernel_ulong_t)-sizeof(__u32)]; /* Padding: libc5 uses this.. */
};
---8<---
uptime通过调用get_monotonic_boottime()来获取,其定义在<kernel/time/timekeeping.c>
loads[3]通过调用get_avenrun()来获取,其定义在<kernel/sched/proc.c>
ram信息通过si_meminfo()来获取,其定义在<mm/page_alloc.c>
swap信息通过si_swapinfo()来获取,其定义在<mm/swapfile.c>