TwoOceans
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: Для меня это новость и мало в нее верится, какой в этом смысл, если оператор отказался от сохранения данных? По моему дешевле тупо обрубить концы и освободить память. | К сожалению, все именно так - особенно это касается браузеров (которые не на Chromium) с большим числом открытых вкладок и других программ (игр, например), которые занимают большой объем оперативной памяти (напомню, что если оперативки много, Chromium не дает памяти уйти в подкачку). Причем следил по ProcessExplorer - процесс выгружается когда все еще показывает порядка 100 Мб занятой памяти. То есть обрубание имеет место, но похоже только для занятой оперативной памяти, не для подкачки. Цитата: Для чего в своп выгружать неизменяемый код, т.е. dll? | К сожалению, в библиотеке жестко прописаны адреса внутри самой библиотеки. Для того чтобы библиотека могла быть загружена по другому адресу, в библиотеку добавляется "директория" (в отдельном сегменте .reloc обычно), указывающая Windows какие места нужно изменить при загрузке библиотеке по другому адресу. Эти места могут быть не только в сегменте данных, но и в сегменте кода. То есть, если библиотека загружена по другому адресу, то код, загруженный в память, отличается от исходника библиотеки на диске. Такую библиотеку нельзя временно вытеснить обратно в исходник на диске, только в подкачку. В свое время мне пришлось с этим разбираться - мой компилятор не создавал .reloc (не работал режим релиза, а в отладочном .reloc не создается для упрощения отладки) и библиотека не загружалась, если базовый адрес уже был занят. Приходилось при компиляции вручную назначать разные базовые адреса своим библиотекам. Еще есть программа GNU, переписывающая базовый адрес на безконфликтный для текущего состояния компьютера и необязательное обновление для Windows, позволяющее системе как-то махинировать с адресами библиотек. (Точно не помню номер, кажется TAILORD его не рекомендует, но я таки поставил и после него антивирус пару часов обновлял кэш файлов - то есть видимо системные библиотеки были изменены, чтобы снизить число конфликтов адресных диапазонов. Сейчас правда системные не по базовому адресу снова есть). Если библиотека загружена по какому-то адресу, то изменить его "на ходу" без выгрузки с освобождением во всех программах и снова загрузки библиотеки система не сможет - так как для этого пришлось бы менять и данные программ библиотеку вызвавших и локальное хранилище потока (Thread Locale Storage) самой библиотеки. Это значит, что если у какой-то загружаемой библиотеки (условно назовем "новой") адресный диапазон пересекается с ранее загруженной библиотекой - система будет искать в "новой" секцию .reloc пытаться загрузить ее по другому адресу. Чем больше библиотека по размеру в памяти (наверно не нужно упоминать что размер на диске почти всегда меньше чем размер в памяти - из-за большего выравнивания и выделения памяти под "неинициализированные" сегменты), тем больше вероятность, что с чем-то пересечется и будет загружена по другому адресу. Если библиотека "частная", то ничего особо страшного, адрес ее загрузки может отличаться для разных процессов (и даже может отличаться версия библиотеки в каждом процессе) - то есть пересечение проверяется по одному процессу. А вот если библиотека Shared (как системные библиотеки, точно не скажу, похоже определяется по базовому адресу библиотеки выше некого предела, для win32 примерно 0x60000000), то она будет занимать этот адрес во всех процессах и соответственно пересечение проверяется по всем процессам. Если судить только по количеству библиотек на 32-разрядной системе - то примерно 20% загружено не по своему адресу. Если учесть, что не по своему адресу прежде всего большие библиотеки, то процент по размеру будет выше. Конечно не 100%, но асимпотически с течением времени стремится к 100%. На 64-разрядных адресов должно хватать всем, но это не меняет того, что для "частных" библиотек есть базовый адрес по умолчанию и его использование приведет к тому, что первая библиотека займет этот адрес, остальные загрузятся по другому адресу. Цитата: все упирается\всегда_упиралось в объем оперативки и чтения с диска. | К сожалению, не только. Без UWF(EWF) файл подкачки используется, его можно уменьшить до 20 Мб, но он остается. Поэтому хотелось бы какой-то пруф, что он действительно отключается, а не прячется в буфер. Конечно, я готов допустить, что в новых ОС он действительно отключается, но просто оперировать логикой, говоря о Майкрософт, недостаточно. Добавлено: Цитата: Есть страницы только для чтения, есть для чтения\записи, они уже помечены | С этим согласен - однако они есть только в загруженной с диска части (при этом нет прямого запрета пометить в файле исполняемый код для записи! хотя это может привлечь внимание антивируса) либо в данных полученных из другой программы/библиотеки (например, при чтении памяти другого процесса), а любая динамически выделенная память в самой программе будет помечена (для текущего потока) и для записи и для чтения, иначе ее нет смысла выделять - изначально в ячейке будут нестертые данные предыдущей программы, "мусор". А загрузчик системы, естественно, может изменять данные при загрузке, даже если для программы потом они будут "только чтение". Еще можно припомнить, что с этим всем тесно связана защита от выполнения в сегментах данных (запись, чтение, исполнение указываются в одном поле), только обычно она отключена для несистемных программ. То есть можно в секцию данных записать исполняемый код из внешнего файла и его прекрасно выполнить. В целом можно сказать, что вся эта защита весьма хрупкая и ненадежная вещь: к любой памяти кто-то да имеет доступ на запись. Цитата: не создаётся или затирается в момент нормального старта? | Именно не сознается - у меня тоже так бывало (ушел на перезагрузку - пока биос грузится отключаешь, загружаешься с диска восстановления - файла нет либо есть, но старый). Обычно это оказывались BSOD 7B и 7E. Нужно отключить перезагрузку по BSOD и увидеть код на синем экране. В случае 7B система при загрузке не находит загрузочный раздел, поэтому не может найти папку Windows и не может записать файл протокола или событие в журнал. Как лечить зависит от версии ОС. Обычно помогает принудительное включение всех драйверов из mshdc.inf в автоматический запуск (0), но бывает что дело просто во включении/выключении ahci или смене шлейфа/порта sata на материнке. Так как на XP нет стандартного msahci и он не переносится с семерки, надо отключить ahci, загрузится, поставить драйвер ahci от производителя материнки, потом включить. В новых материнках часто нет возможности отключить ahci, так что Xp на них без шаманства с реестром не пойдет. Короче, если у Вас эта ошибка, опишите подробнее как возникла проблема, производителя контроллера sata, разбирали ли ноут, какая ОС и так далее. Например, если из нового ноута (c процем N3000, неотключаемым ahci, без DVD привода и новыми Intel USB3 не позволяющими подключить внешний привод) вытащить жесткий диск, вставить в обычный комп с приводом и старыми USB, но без ahci, установить ос, потом вернуть диск в ноут - BSOD 7B гарантирован. В случае 7E (для ноута маловероятен - обычно при смене материки/процессора) конфликтует какой-либо драйвер (чаще всего intelppm, его нужно перевести в старт по требованию(3, рекомендуется, не стартует если проц AMD, и стартует, если проц Intel), но бывают и другие). Почему в журнале не фиксируется мне не понятно. | Всего записей: 9 | Зарегистр. 20-02-2017 | Отправлено: 05:24 06-04-2017 | Исправлено: TwoOceans, 07:57 06-04-2017 |
|