Папка dyld mac os что это
Как упоминалось в предыдущей статье, в процессе запуска приложения ядро операционной системы сначала выполняет некоторую обработку, такую как создание нового процесса и выделение памяти. В iOS / Mac OS ядро операционной системы - XNU. После того, как XNU завершит соответствующую работу, он передаст управление dyld. dyld, динамический компоновщик, используется для загрузки динамических библиотек. dyld работает в пользовательском режиме, от XNU до dyld, завершил переход из режима ядра в пользовательский режим. Итак, что сделал Дилд? К счастью, dyld - это открытый исходный код. Мы анализируем исходный код dyld, чтобы увидеть, какую работу проделал dyld во время запуска приложения.
Как упоминалось в предыдущей статье, функция ввода dyld - __dyld_start, давайте посмотрим на те операции, которые выполняются в __dyld_start. Часть исходного кода в dyld - это язык ассемблера, а исходный код __dyld_start - это ассемблер. Часть кода __dyld_start выглядит следующим образом:
__dyld_start внутренне вызывает функцию dyldbootstrap :: start (), взглянем на внутреннюю реализацию dyldbootstrap :: start ():
Операция по нахождению адреса основной функции приложения в основном выполняется в функции _main, а в функции _main выполняется больше операций. Посмотрим, как реализована функция _main ().
функция _main ()
В функции _main () содержится больше кода, и многое еще сделано. В основном завершается создание контекста, основная программа инициализируется в объект ImageLoader, загружается динамическая библиотека общей системы, загружается зависимая динамическая библиотека, связывается динамическая библиотека, инициализируется основная программа и возвращается адрес функции main () основной программы. Далее рассмотрим конкретную реализацию каждой функции в отдельности.
instantiateFromLoadedImage
Функция instantiateFromLoadedImage () в основном преобразует файл Mach-O основной программы в объект ImageLoader, который используется в последующем процессе компоновки. ImageLoader является абстрактным классом, и его родственными классами являются ImageLoaderMachO, ImageLoaderMachO является подклассом ImageLoader, ImageLoaderMachO имеет два подкласса, ImageLoaderMachOCompressed и ImageLoaderMachOClassic. Отношения между этими классами следующие:
В процессе запуска приложения основная программа и связанные с ней динамические библиотеки в конечном итоге преобразуются в объект ImageLoader. Посмотрите на операции, выполненные в instantiateFromLoadedImage.
isCompatibleMachO в основном проверяет, совместимы ли cutype и cpusubtype файла mach-o с текущей системой, а затем вызывает функцию instantiateMainExecutable (), взглянем на реализацию функции instantiateMainExecutable ():
Функция instantiateMainExecutable () вызывает ImageLoaderMachOCompressed :: instantiateMainExecutable () и ImageLoaderMachOClassic :: instantiateMainExecutable () в зависимости от того, был ли сжат файл Mach-O. Все текущие файлы Mach-O сжаты, поэтому мы рассмотрим только реализацию ImageLoaderMachOCompressed :: instantiateMainExecutable.
В результате такой последовательности операций файл Mach-O в конечном итоге преобразуется в сжатый объект ImageLoaderMachOC.
mapSharedCache
mapSharedCache () отвечает за загрузку разделяемой динамической библиотеки в системе в пространство памяти, например, UIKit - это динамическая разделяемая библиотека, которая также является механизмом для обмена динамическими библиотеками между различными приложениями. Общие библиотеки, к которым обращаются разные приложения, в конечном итоге отображаются в одну и ту же физическую память, что позволяет получить общую динамическую библиотеку.
В системе Mac OS общий кэш динамической библиотеки хранится в виде файла в каталоге / var / db / dyld, а программа обновления общего кэша - update_dyld_shared_cache, которая находится в каталоге / usr / bin. update_dyld_shared_cache обычно вызывается, только когда системный установщик устанавливает программное обеспечение и обновляет систему. Далее рассмотрим внутреннюю логику реализации mapSharedCache ().
В mapSharedCache () много кодов, мы рассмотрим только некоторые коды:
В mapSharedCache () вызываются некоторые методы в ядре, и, наконец, фактически выполняется системный вызов. Основная логика mapSharedCache (): сначала определите, была ли общая динамическая библиотека отображена в памяти, и, если она уже существует, вернитесь напрямую, в противном случае откройте файл кэша и отобразите общую динамическую библиотеку в память.
loadInsertedDylib
После сопоставления общей динамической библиотеки с памятью dyld загрузит динамическую библиотеку в переменную среды приложения DYLD_INSERT_LIBRARIES, вызвав функцию loadInsertedDylib (). Вы можете установить переменные окружения в xcode и распечатать переменную окружения DYLD_INSERT_LIBRARIES во время запуска приложения. Вот посмотрите на переменную окружения DYLD_INSERT_LIBRARIES разработанного нами приложения:
Взгляните на логику реализации в loadInsertedDylib:
Функция loadInsertedDylib () в основном вызывает функцию load (), взглянем на реализацию функции load ():
Функция load () является точкой входа для поиска динамической библиотеки. В функции load () для поиска динамической библиотеки будут вызываться loadPhase0, loadPhase1, loadPhase2, loadPhase3, loadPhase4, loadPhase5, loadPhase6. Наконец, в loadPhase6 файл mach-o анализируется и, наконец, преобразуется в объект ImageLoader. Взгляните на логику реализации в loadPhase6:
Функция ImageLoaderMachO :: instantiateFromFile () используется в loadPhase6 для генерации объекта ImageLoader. Реализация ImageLoaderMachO :: instantiateFromFile () аналогична логике реализации instantiateMainExecutable, упомянутой выше. Сжатие, генерировать различные объекты ImageLoader, не слишком много введение здесь.
После того, как основная программа и связанные с ней динамические библиотеки в своих переменных среды конвертированы в объекты ImageLoader, dyld свяжет эти ImageLoaders, и эта ссылка использует собственную функцию link () ImageLoader. Посмотрите на конкретную реализацию кода:
Функция link () в основном выполняет следующую работу:
1. recursiveLoadLibraries рекурсивно загружает все зависимые библиотеки
2. recursiveRebase рекурсивно исправляет базовый адрес себя и зависимых библиотек
3. recursiveBind рекурсивно связывает символы
В процессе рекурсивной загрузки всех зависимых библиотек метод загрузки должен вызывать функцию loadLibrary (), а фактическим последним вызовом является метод load (). После link () адреса основной программы и связанных зависимых библиотек были пересмотрены для достижения цели доступности процесса.
initializeMainExecutable
После выполнения функции link () она вызовет функцию initializeMainExecutable (), которую можно понимать как функцию инициализации. На самом деле, в процессе запуска приложения, помимо того, что dyld выполняет некоторую работу, также есть важная роль, то есть runtime, и runtime, и dyld тесно связаны между собой. Некоторые уведомления обратного вызова Dyld регистрируются во время выполнения.Эти уведомления регистрируются при инициализации среды выполнения. Одно из уведомлений заключается в том, что при загрузке нового изображения будет выполнена функция load-images () во время выполнения. Затем посмотрите на некоторый исходный код во время выполнения и проанализируйте, что делает функция load-images ().
В load_images () сначала вызовите функцию trapare_load_methods (), затем вызовите функцию call_load_methods (). Посмотрите на реализацию parepar_load_methods ():
_getObjc2NonlazyClassList получает список всех классов, а remapClass должен получить указатель, соответствующий классу, а затем вызвать функцию schedule_class_load (), взглянуть на реализацию schedule_class_load:
Анализируя этот код, мы можем узнать, что перед добавлением подкласса в список загрузки, его родительский класс будет загружен в список первым. Вот почему метод + load родительского класса вызывается перед методом + load дочернего класса.
Затем мы рассмотрим реализацию функции call_load_methods ():
Функция call_class_loads () в основном вызывается в call_load_methods, взглянем на реализацию call_class_loads:
Основная логика заключается в том, чтобы найти соответствующий класс из списка loadable_classes для загрузки, а затем найти реализацию @selector (load) и выполнить ее.
getThreadPC
getThreadPC - это метод в ImageLoaderMachO, основная функция которого - получить адрес главной функции приложения, взглянуть на логику его реализации:
Основная логика этой функции заключается в том, чтобы пройти loadCommand, найти инструкцию 'LC_MAIN', получить дешевый адрес, на который указывает инструкция, после обработки получить адрес основной функции и вернуть этот адрес в __dyld_start. После сохранения адреса основной функции в регистре в __dyld_start, перейдите к соответствующему адресу и начните выполнение основной функции. На этом этапе процесс запуска приложения официально завершен.
резюме
Выше были представлены ключевые функции в каждом процессе в функции _main, и, наконец, давайте посмотрим на реализацию функции _main:
В этой статье представлен весь процесс от dyld, обрабатывающего основную программу Mach-O, до нахождения адреса основной функции Mach-O основной программы. Следует отметить, что это всего лишь введение в общий процесс.На самом деле, помимо того, что написано в статье, в исходном коде есть много деталей и некоторые знания, которые не представлены. Будь то XNU или dyld, чтение его исходного кода - это огромный проект, который требует постоянного изучения и анализа в будущем.
Операционная система Apple для компьютеров имеет глубокую и разветвленную структуру папок. Некоторые из них важны настолько, что «яблочные инженеры» просто прячут их от пользователей – ведь малейшее изменение сделает работу системы нестабильной, приведет к потере данных, а то и просто не даст вашему Mac включиться.
Ниже мы приводим хит-парад самых «опасных» папок macOS
1. Языковые файлы и папки
Приложения для Mac всегда поставляются с языковыми файлами – их будет ровно столько, на сколько языков переведена программа.
Чтобы увидеть их, зайдите в Finder, откройте вкладку Программы и кликните правой кнопкой мыши по любому приложение, а в появившемся контекстном меню выберите вариант Показать содержимое пакета.
Путь будет выглядеть примерно так:
Нередко языковые файлы удаляют – ради того, чтобы освободить немного свободного места. Именно немного – сканирование программой CleanMyMac X показывает, что удаление этих файлов даст вам незначительное количество свободного пространства.
В общем, сильно сэкономить не получится – а вот получить проблемы вроде зависаний и вылета некоторых старых приложений Microsoft Office и Adobe вполне реально. К тому же, для удаления системных языковых пакетов macOS требуется отключение встроенной защиты System Integrity Protection – а вот этого делать настоятельно не рекомендуется.
2. Папки в разделе /private/var
macOS создает файлы кэша на пользовательском и системном уровнях, чтобы ускорить систему. Кэш и временные файлы, расположенные в /Library/Caches, находятся в открытом доступе, их можно удалять даже без помощи сторонних приложений.
Но есть и такие места, которые управляются исключительно операционной системой, и вам они даже не видны. Иногда они занимают приличное место на диске, так что логично выозникает как минимум желание с этим разобраться.
Чтобы открыть /private/var, откройте Finder, нажмите ⌘Cmd + ⇧Shift + G и введите в адресной строке /private/var/folders. Новая вкладка в Finder будет открыта незамедлительно.
Для перехода к системному кэшу и временным файлам запустите Терминал и введите следующую команду:
Вы увидите папки с названиями из двух букв. Если углубиться в них, вы окажетесь в папках с названием уже из одной буквы. В папке С «живет» кэш (от Cache), В папке Т – временные файлы (Temporary), а данные пользователя находятся в O.
Сканирование с помощью OmniDiskSweeper показывает, что размер /private/var/folders составляет 1 ГБ, а всей /private/var – чуть больше 4 ГБ. Это нормально – беспокоиться стоит, если эти директории «весят» более 10 ГБ.
Если они не удаляются, загрузите Mac в безопасном режиме. macOS подключить дополнительные встроенные механизмы для уничтожения кэша и временных файлов. После этого можно будет загрузиться уже в обычном режиме и проверить свободное место на диске.
Другие важные папки в /private/var
- /private/var/db – включает в себя набор различных конфигураций для macOS и файлов с данными, включая базу данных Spotlight, сетевые настройки и др.
- /private/var/VM – содержит важную информацию для перехода в режим сна. Когда ваш Mac «засыпает», эта директория разрастается до более чем 5 ГБ.
3. Папка Система и Библиотеки
Создатели macOS предусмотрели в ней несколько папок с названием Library (Библиотеки). Они имеют одно и то же название, но располагаются в разных частях ОС, и отличаются друг от друга по функциональным возможностям.
Всего есть три папки:
В русскоязычной версии macOS
Основная и находящаяся в разделе System (Система) папки Library (Библиотеки) влияют практически на каждый аспект в системе. Например, в Системе находятся папки с файлами, которые необходимы macOS для работы. Модифицировать их имеет право только сама операционная система. Соответственно, пользователю здесь делать нечего.
4. User Library
Папка с тем же названием в «домашней» директории – это ваша персональная библиотека данных. Здесь также находится сама система, сторонние файлы поддержки, настройки, а также данные почтового клиента Apple Mail, закладки и история Safari, записи из календаря и многое другое. Есть здесь и папка, которую время от времени рекомендуется чистить. Но это совсем не значит, что «трогать» можно всё – как раз наоборот.
/Library/Application Support и системные, и сторонние приложения сохраняют файлы поддержки (обычно в подпапке) с регистрационными данными и информацией о совершенных сессиях. Удалять вручную их нельзя, для этого есть специальное приложение AppCleaner.
/Library/Preferences хранятся настройки всех системных и сторонних приложений. Опять-таки, вручную удалять их нельзя – если это сделать, приложение вернется к изначальным настройкам или будет вылетать при запуске. Для очистки этих данных используйте уже упомянутый AppCleaner.
/Library/Containers располагаются файлы поддержки, кэшированные данные и временные файлы для приложений из Mac App Store. Так как приложения из магазина приложений работают исключительно в «песочнице», они не могут записывать данные в какое-либо другое место на диске. Как вы уже догадались, вручную ничего удалять здесь нельзя. Что делать? Просто переустановить приложение, данные от которых занимают слишком много места.
5. Скрытые папки в «домашней» директории
Откройте Finder и одновременно нажмите ⌘Cmd + ⇧Shift + . (точка) – и получите доступ к большому числу файлов и папок в директории Home (Дом), которые обычно скрыты от пользователя. Как вы наверняка уже догадались, это сделано неслучайно – Apple не хочет, чтобы вы случайно что-то удалили и нарушили работу Mac.
В частности, не следует модифицировать и тем более удалять следующие папки:
- .Spotlight-V100 – метаданные встроенного поисковика Spotlight для каждого смонтированного диска. Процессы под названием mdworker используют эти метаданные для обновления выдачи Spotlight.
- .fseventsd – в этот лог-файл записывается информация о событиях в системных файлах (например, создание файлов, модификация, удаление и т.д.). Time Machine использует эти данные для того, чтобы создавать бэкап в фоновом режиме.
- .DocumentRevisions-V100 – база данных из приложений с сохранением различных версий. С её помощью вы, к примеру, можете вернуться к более старой версии документа даже тогда, когда не сохраняли её.
- .PKInstallSandboxManager – используется для обновлений ПО и песочницы.
- .PKInstallSandboxManager-SystemSoftware – используется для обновления системного ПО.
- .Trashes – корзина на каждом из системных дисков.
Обязательно сделайте бэкап
Обычному пользователю малоинтересны «скрытые» папки – в конце концов, в них не лежат деньги :). Но если свободного места на диске становится все меньше, самые отчаянные юзеры все-таки могут начать эксперименты со «слишком большими» папками.
Если вы один из них, и уверены в том, что делаете – все равно предварительно сделайте резервную копию системы и сохраните её на внешнем диске. В том случае, если все-таки возникнут какие-либо проблемы с системой, вы сравнительно легко сможете всё восстановить в прежнем виде, и невинный эксперимент не закончится потерей ценных документов и данных в приложениях.
В последнее время приходит много писем с вопросами о том, почему после обновления на OS X Mavericks, казалось бы, новая сверхскоростная система начинает некоторым образом подтормаживать, всё чаще появляется SPOD (Spinning Pinwheel of Death) — попросту, «пляжный мячик» или «лоллипоп». Ниже решение проблемы с подвисаниями системы, помогает в 99 случаях из ста!
Изменённое состояние курсора, выражающееся в появлении крутящегося разноцветного кружка — SPOD, означает, что какое-то приложение на вашем Mac занято или подвисло. Как правило, переключение к другому приложению или клик на пустом месте прекращают подобные безобразия. В крайнем случае, можно легко избавиться от полностью зависшего приложения, нажав комбинацию клавиш Command+Option+Escape и выбрав его из списка. Это работает всегда и везде. Но такой способ решения — это уже лечение. Давайте всё же займёмся профилактикой.
Весь процесс, описанный ниже, состоит из нескольких несложных действий, выполнить их будет легко даже новичку.
Исправляем диск (Repair Disk) и восстанавливаем права доступа к файлам (Repair Permissions):
-
Загружаем Mac в режиме восстановления (Recovery Mode). Для этого при включении зажимаем клавишу Option и выбираем диск с названием «10.9 Recovery», либо крепко зажимаем две клавиши сразу — Command и R, кому как удобнее
Перезагружаемся в обычный режим
-
Запускаем «Терминал», его можно найти через Spotlight или в папке Приложения/Утилиты
sudo update_dyld_shared_cache -force
-
После того как команда вставлена, нажимаем на Enter, вводим свой пароль на вход в систему. Внимание, вводимые символы никак не отображаются!
Команда выполнена, перезагружаемся!
С помощью подобных нехитрых действий можно избавиться от подвисаний и подтормаживаний в работе системы. Кстати, в профилактических целях советую проводить проверку диска и восстановление прав доступа, описанные в первом пункте инструкции, хотя бы раз в месяц. Здоровья вашему Mac!
Свободное общение и обсуждение материалов
Apple выпустила iOS 15 Release Candidate. Как установитьЛонгриды для вас
Apple представила седьмую бета-версию iOS 15. Если наши подсчёты верны, и всего бета-версий будет 10 (не считая сборки Release Candidate), то релиз состоится во вторник, 21 сентября
- snapshots.db 2,1 ГБ '/private/var/db/systemstats/snapshots.database'
- swapfile1 1,1 ГБ '/private/var/vm/swapfile1'
- sleepimage 1,1 ГБ '/private/var/vm/sleepimage'
general.svc 488 МБ '/System/Library/Speech/Recognizers/SpeechRecognitionCoreLanguages/en_US.SpeechRecognition/Contents/Resources/lm/combined/general.svc'
dyld_shared_cache_x86_64, dyld_shared_cache_i386 386 и 274 МБ '/private/var/db/dyld/dyld_shared_cache_x86_64'
Дело не в памяти (RAM), а в пространстве на жестком диске.
Также я буду рад, если кто-нибудь укажет мне, какие еще ненужные файлы я могу удалить с Mac. Я предпочитаю удалять файлы вручную, а не использовать какое-либо приложение, но если есть какое-нибудь простое служебное приложение без излишеств, которое работает, я с радостью воспользуюсь им.
Пользователь может безопасно удалить файл образа сна. Он будет воссоздан в следующий раз, когда Mac будет переведен в спящий режим из-за настройки по умолчанию, которую можно отключить. На этой странице TechRadar показано, как удалить файл образа сна, а также как отключить восстановление файла.
Файл образа сна - это снимок содержимого ОЗУ, сделанный непосредственно перед переводом Mac в режим сна. Когда Mac просыпается, этот файл используется для воссоздания содержимого ОЗУ, якобы для ускорения процесса.
Файлы подкачки будут всегда быть созданы, и вы мало что можете сделать, кроме увеличения объема физической оперативной памяти на вашем Mac.
- Так безопасно ли отключать изображение сна? Удаление кажется безопасным и удалил его. Кроме того, удаление файла подкачки вызовет какие-либо проблемы? кажется нормальным, если они перестроены, но это должно соответствовать требованиям. Если оперативной памяти достаточно, ее следует удалить автоматически. Просто думаю !!
- Файл образа сна можно удалить. Оставьте файлы подкачки в покое и найдите другие способы освободить место. Если вы обновляете свой iPhone и iPad через iTunes, а не через OTA, файлы установщика обновлений можно найти по адресу
/Library/iTunes/iPhone Software Updates или
/Library/iTunes/iPad Software Updates . В более старых версиях macOS эти файлы могут храниться здесь:
/Library/Application Support/iTunes/ . Заметка:
Честно удалить ничего в этих каталогах вручную. Скорее всего, вы сломаете свою систему, если она даже позволит вам удалить их. Придерживайтесь файлов в "пользовательском пространстве". который будет по пути / Users / [ИМЯ ПОЛЬЗОВАТЕЛЯ] / ".
Если у вас заканчивается место на диске (что полностью отличается от исчерпания объем памятиЯ бы использовал графический интерфейс, такой как Grand Perspective, а затем удалил бы файлы, которые вам больше не нужны, которые занимают места в вашем каталоге пользователя.
Я уверен, что есть команды оболочки для рекурсивного перечисления файлов в определенных каталогах в порядке их размера, но я не знаю, как это сделать, предпочитая инструменты с графическим интерфейсом, которые делают то же самое.
Если у вас заканчивается объем памяти в вашем MBA, тогда единственный выбор, который у вас есть (поскольку вся память MBA не подлежит обновлению), это проверить, работает ли у вас куча вещей при запуске (системные настройки> пользователи> [ВАШЕ ИМЯ ПОЛЬЗОВАТЕЛЯ]> элементы входа) и удалить некоторые из их или просто запускайте меньше приложений одновременно.
Я предлагаю вам приобрести такой инструмент, как CleanMyMac, который очень эффективен в этой ситуации. Я регулярно использую его для очистки всего мусора, который приложения / инструменты и другие материалы хранят на моем диске для кеширования, сборки приложений и т. Д.
Он имеет множество полезных функций, помимо удаления ненужных файлов, для оптимизации вашего Mac в целом.
Читайте также: