我正在编译一个自定义内核,我想测试一下映像文件的大小。结果如下:
ls -la | grep vmlinux
-rwxr-xr-x 1 root root 8167158 May 21 12:14 vmlinux
du -h vmlinux
3.8M vmlinux
size vmlinux
text data bss dec hex filename
2221248 676148 544768 3442164 3485f4 vmlinux
由于它们都显示不同的大小,哪一个最接近实际图像的大小?为什么它们不同?
它们都是正确的,它们只是显示不同的大小。
-
ls
显示文件的大小(当您打开并读取它时,这就是您将获得的字节数) -
du
显示实际磁盘使用情况,由于漏洞 ,磁盘使用情况可能小于文件大小。 -
size
显示对象/可执行文件的运行时映像的大小,这与文件大小没有直接关系(bss无论文件有多大都不使用文件中的字节,文件可能包含不属于运行时映像的调试信息等)
如果您想知道一个可执行文件将占用多少RAM/ROM(不包括动态内存分配),size
提供了您需要的信息。
需要理解两个定义
1运行时间vs存储时间(这就是size
不同的原因)
2文件深度vs目录(这就是du
不同的原因)
看下面的例子:
[root@localhost test]# ls -l
total 36
-rw-r--r-- 1 root root 712 May 12 19:50 a.c
-rw-r--r-- 1 root root 3561 May 12 19:42 a.h
-rwxr-xr-x 1 root root 71624 May 12 19:50 a.out
-rw-r--r-- 1 root root 1403 May 8 00:15 b.c
-rw-r--r-- 1 root root 1403 May 8 00:15 c.c
[root@localhost test]# du -abch --max-depth=1
1.4K ./b.c
1.4K ./c.c
3.5K ./a.h
712 ./a.c
70K ./a.out
81K .
81K total
[root@localhost test]# ls -l
total 36
-rw-r--r-- 1 root root 712 May 12 19:50 a.c
-rw-r--r-- 1 root root 3561 May 12 19:42 a.h
-rwxr-xr-x 1 root root 71624 May 12 19:50 a.out
-rw-r--r-- 1 root root 1403 May 8 00:15 b.c
-rw-r--r-- 1 root root 1403 May 8 00:15 c.c
[root@localhost test]# size a.out
text data bss dec hex filename
3655 640 16 4311 10d7 a.out
如果使用size
不在可执行文件上,OS将报告错误。
经验差异最常发生在稀疏文件和压缩文件上,并且可以在两个方向上发生。
- 杜& lt;ls
Sparse文件包含有关应用程序所需空间的元数据,其中ls读取并应用其结果,而du则不这样做。例如:
truncate -s 1m test.dat
创建一个完全由空组成的稀疏文件,没有磁盘使用。du为0,ls为1M。
- 杜祝辞ls
另一方面,du可以表示,在您的情况下,文件可能占用磁盘上的大量空间(例如。它们分布在许多块中),但并非所有块都被填充,即它们的字节大小(以ls衡量)小于du(查看已占用的块)。