В macOS 64-битные приложения по умолчанию имеют нулевой размер страницы 4 ГБ.Нулевая страница - это фрагмент адресного пространства, начинающийся с адреса 0, который не позволяет получить доступ.Это то, что вызывает нарушения прав доступа, когда программа разыменовывает нулевой указатель.
64-разрядные программы Mac используют ноль страницы 4 ГБ, так что любой допустимый указатель может быть случайно урезан до 32 бит в результате ошибки программы (например, приведениедо int
и обратно к указателю), он будет недействительным и вызовет сбой в кратчайшие возможные сроки.Это помогает находить и исправлять такие ошибки.
Сегмент нулевой страницы в исполняемом файле Mach-O фактически не использует 4 ГБ на диске.Это всего лишь метаданные, которые сообщают ядру и динамическому загрузчику, сколько адресного пространства зарезервировать для него.Похоже, что size
включает в себя виртуальный размер всех сегментов, независимо от того, занимают ли они место на диске или нет.
Кроме того, нулевая страница не потребляет фактическую память при загрузке программы,или.Опять же, есть только некоторые бухгалтерские данные для отслеживания того факта, что зарезервированы 4 ГБ адресного пространства меньшего размера.
Размер, сообщаемый для «других», 4294983680 байт, равен 0x100004000
в шестнадцатеричном формате.Это ноль страницы 4 ГБ (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
Вы также можете использовать команду otool -lV /bin/ls
для просмотра команд загрузчика исполняемого файла, включая команду, устанавливающую сегмент __PAGEZERO
.