macOS 大小命令显示的数字真的很大吗?

bog*_*don 1 unix macos

> size /bin/ls
__TEXT  __DATA  __OBJC  others  dec hex
20480   4096    0   4294983680  4295008256  10000a000
Run Code Online (Sandbox Code Playgroud)

怎么可能是ls4GB呢?不是size要用于可执行文件吗?我有 4GB 内存,那么它只是显示它可以使用的内存量吗?

Ken*_*ses 5

在 macOS 上,默认情况下,64 位应用程序有 4GB 页面零。第 0 页是从地址 0 开始的地址空间块,不允许访问。这就是当程序取消引用空指针时导致访问冲突的原因。

64 位 Mac 程序使用 4GB 零页,因此,如果任何有效指针因程序错误而意外截断为 32 位(例如转换为int指针并返回到指针),则该指针将无效并尽快导致崩溃。这有助于查找并修复此类错误。

Mach-O 可执行文件中的页零段实际上并不使用磁盘上的 4GB。它只是一些元数据,告诉内核和动态加载器要为其保留多少地址空间。似乎size包括所有段的虚拟大小,无论它们是否占用磁盘空间。

此外,加载程序时,第 0 页也不消耗实际 RAM。同样,只有一些簿记数据来跟踪保留较低 4GB 地址空间的事实。

报告的“其他”大小为 4294983680 字节,以0x100004000十六进制表示。这是 4GB 零页 ( 0x100000000) 加上另外 4 个用于其他段的页。

您可以使用该-m选项来size获取更多详细信息:

$ size -m /bin/ls
Segment __PAGEZERO: 4294967296
Segment __TEXT: 20480
    Section __text: 13599
    Section __stubs: 456
    Section __stub_helper: 776
    Section __const: 504
    Section __cstring: 1150
    Section __unwind_info: 148
    total 16633
Segment __DATA: 4096
    Section __got: 40
    Section __nl_symbol_ptr: 16
    Section __la_symbol_ptr: 608
    Section __const: 552
    Section __data: 40
    Section __bss: 224
    Section __common: 140
    total 1620
Segment __LINKEDIT: 16384
total 4295008256
Run Code Online (Sandbox Code Playgroud)

您还可以使用该命令otool -lV /bin/ls查看可执行文件的加载命令,包括建立段的命令__PAGEZERO