Исправление сброса настроек BIOS (CMOS Reset) при перезагрузке в Mac OS X Snow Leopard через DSDT
Классический патч секции Device (RTC) в таблице DSDT (изменение длины блока портов ввода-вывода Length с 0x04 на 0x02), полностью устраняющий проблему сброса настроек BIOS (CMOS) при перезагрузке Mac OS X 10.6 Snow Leopard.
- Основной автор
- @candykane Опубликовано 2009-07-13
- Раздел архива
- Ядро OSx86 10.X и архитектура загрузки
- Охват в архиве
- 332,582 просмотров · 26 отобранных заметок (из 32 исходных сообщений) · 2009-07-13 – 2010-04-01
- Участники обсуждения (15)
- @uman (9)@kizwan (8)@infinitek (2)@ariyako (2)@candykane@digital_dreamer@ariadri@mwgdrwg@dgandra@osxfr33k@MikeHunt79@Ianxxx@spalek83@SaCleoCheater@josefka
- Справочник оборудования
- Workstation Coolers & Thermal Gear ↗ SATA III & NVMe SSDs ↗ USB 3.2 Boot Flash Drives ↗
Бета-сборки (а также финальный релиз) Mac OS X Snow Leopard обладают крайне неприятной особенностью: при каждой перезагрузке компьютера система сбрасывает настройки CMOS (BIOS) материнской платы. Эту проблему легко исправить путём редактирования файла таблицы DSDT (dsdt.aml).
В секции часов реального времени Device (RTC) значение параметра длины регистра Length необходимо изменить со стандартного 0x04 на 0x02:
Device (RTC)
{
Name (_HID, EisaId ("PNP0B00"))
Name (_CRS, ResourceTemplate ()
{
IO (Decode16,
0x0070, // Range Minimum
0x0070, // Range Maximum
0x00, // Alignment
0x02, // Length
)
})
}
Полевые заметки и отчёты сообщества
Отобрано 26 технических ответов из 32 исходных сообщений темы
candykane,
В моём файле DSDT под Leopard 10.5.6 секция RTC сейчас выглядит так:
Device (RTC)
{
Name (_HID, EisaId ("PNP0B00"))
Name (_CRS, ResourceTemplate ()
{
IO (Decode16,
0x0070, // Range Minimum
0x0070, // Range Maximum
0x01, // Alignment
0x08, // Length
)
IRQNoFlags ()
{8}
})
}
Подскажите, пожалуйста:
а) Безопасна ли предлагаемая вами замена Length на 0x02 при работе в Leopard 10.5?
б) Нужно ли оставлять или удалять строчки IRQNoFlags () {8} для Leopard и Snow Leopard?
uman,
Эта правка абсолютно безопасна для обеих версий ОС.
Значение 0x08 нужно изменить на 0x02 (в Leopard это ни на что не повлияет, а в Snow Leopard предотвратит сброс настроек CMOS).
Что касается строчек IRQNoFlags () {8} внутри секции RTC: их удаляют в том случае, если у вас не работает звук или происходят паники ядра на материнских платах ASUS (в таком случае прерывание IRQ 8 переносят в секцию таймера HPET).
С уважением,
MAJ
Простите за дилетантский вопрос, а какой программой вы декомпилируете и редактируете свои файлы DSDT?..
Удобный дроплет-декомпилятор и компилятор iASLMe можно скачать, например, на форуме AppleLife: appl elife.ru/poleznye_keksty_utility_i_solyusheny_dlya_osx86/9675/860.html#entry93244
Просто перетаскиваете свой бинарный файл dsdt.aml на иконку программы — и получаете текстовый исходник dsdt.dsl, который можно открыть и отредактировать в любом текстовом редакторе. А когда закончите правку, перетащите изменённый dsdt.dsl обратно на иконку приложения, и оно скомпилирует его обратно в готовый dsdt.aml ^_^
Спасибо огромное — сброс BIOS при перезагрузке прекратился! Правда, система всё ещё падает в панику ядра дальше по ходу загрузки, продолжаю разбираться...
В моём DSDT в секции Device (RTC) параметр выравнивания Alignment равен 0x04, а в примере автора в первом посте указано 0x00. Мне нужно менять Alignment на 0x00 или трогать нужно только строку Length?
Подскажите, а в каком именно месте файла DSDT.dsl должна находиться эта секция? В начале, в середине или в конце? Я открыл свой дамп в программе DSDTSE, искал поиск по слову RTC, но такой секции у меня вообще не нашлось (хотя на моей плате ASUS Maximus Formula на чипсете X38 сброса CMOS вроде бы и не наблюдается — может, у ASUS это устройство называется иначе?).
Привет! Вот как выглядит секция Device (RTC) на моём нетбуке Acer Aspire One — здесь два буфера (BUF0 и BUF1) со значением Length = 0x08. Мне нужно менять 0x08 на 0x02 в обоих местах?
Device (RTC)
{
Name (_HID, EisaId ("PNP0B00"))
Name (BUF0, ResourceTemplate ()
{
IO (Decode16,
0x0070, // Range Minimum
0x0070, // Range Maximum
0x01, // Alignment
0x08, // Length
)
})
Name (BUF1, ResourceTemplate ()
{
IO (Decode16,
0x0070, // Range Minimum
0x0070, // Range Maximum
0x01, // Alignment
0x08, // Length
)
})
Method (_CRS, 0, Serialized)
{
If (LEqual (HPTS, One))
{
Return (BUF0)
}
Else
{
Return (BUF1)
}
}
}
Да, в конструкциях с двумя шаблонами ресурсов (или как ниже с ATT0 / ATT1) достаточно изменить длину в первом активном буфере на 0x02 (либо в обоих буферах BUF0 и BUF1, чтобы не зависеть от флага HPTS):
Device (RTC)
{
Name (_HID, EisaId ("PNP0B00"))
Name (ATT0, ResourceTemplate
{
IO (Decode16,
0x0070, // Range Minimum
0x0070, // Range Maximum
0x00, // Alignment
0x02, // Length <-- МЕНЯЕМ ЗДЕСЬ НА 0x02
)
})
Name (ATT1, ResourceTemplate
{
IO (Decode16,
0x0070, // Range Minimum
0x0070, // Range Maximum
0x00, // Alignment
0x04, // Length <-- ЭТОТ МОЖНО НЕ ТРОГАТЬ
)
Кстати, для тех, кто не хочет редактировать DSDT, появилось решение проблемы сброса CMOS в виде отдельного кекста (ElliottForceLegacyRTC.kext):
k exts.com/view/151-cmos_reset_fix_%28via_kext%29.html
К слову, длина регистра 0x02 в секции RTC — это не самодельный костыль хакинтошников: именно такое описание Device (RTC) использует сама Apple в оригинальной таблице DSDT ноутбука MacBook Air.
Как писал разработчик BuildSmart в комментариях у netkas (см.: http://netkas.org/?p=114#comment-45114 ↗), если в заводском DSDT вашей платы указаны длина 0x08 и выравнивание 0x01, это соответствует спецификации ASL. При этом на русскоязычном форуме (AppleLife) обсуждали, что в обновлении 10.6.2 с длиной 0x02 на некоторых платах могут возникать нюансы со сном. Кто-нибудь уже проверял поведение RTC в 10.6.2?
@umanКак писал разработчик BuildSmart... если в заводском DSDT вашей платы указаны длина 0x08 и выравнивание 0x01, это соответствует спецификации ASL...
На моём ноутбуке Acer Aspire 9420 сброс настроек BIOS в 10.6.0/10.6.1 происходил только при попытке ухода в режим глубокого сна (гибернации), хотя с завода в его DSDT как раз прописано 0x08 и 0x01. Неужели в обновлении 10.6.2 сброс CMOS при гибернации прекратится даже без фикса RTC в DSDT?
kizwan
@kizwanНа моём ноутбуке Acer Aspire 9420 сброс настроек BIOS в 10.6.0/10.6.1 происходил только при попытке ухода в режим глубокого сна (гибернации)...
Привет, kizwan!
Вот именно это я и пытался выяснить: нужно ли в 10.6.2 по-прежнему менять 0x08 на 0x02, или Apple изменила поведение драйвера AppleRTC.kext в 10.6.2. Буду очень признателен, если проверишь!
@umanПривет, kizwan! Вот именно это я и пытался выяснить...
В 10.6.0 и 10.6.1 патч RTC (0x02) полностью спасал меня от сброса BIOS при гибернации. Сегодня вечером обновлю свой Acer Aspire 9420 до 10.6.2 и специально протестирую его с заводским значением 0x08 без патча RTC!
kizwan
Спасибо, что вызвался проверить на 10.6.2! А я пока сижу по уши в технической документации на южный мост Intel ICH7 и спецификациях ACPI, сверяя патчи выключения и сна. На днях приехал мой новый процессор Core 2 Duo, так что скоро тоже переберусь на Snow Leopard.
@umanСпасибо, что вызвался проверить на 10.6.2!...
Привет, uman!
Докладываю по итогам серии тестов на 10.6.2: менять длину регистра в Device (RTC) с 0x08 на 0x02 по-прежнему обязательно! Стоило мне вернуть заводское значение 0x08, как при первой же перезагрузке после сна (в режиме hibernatemode 3) настройки BIOS снова сбросились.
Так что патч RTC до 0x02 актуален и для 10.6.2. Сейчас бьюсь только над тем, чтобы Wi-Fi-карта не отключалась после выхода из сна.
kizwan
Спасибо огромное за проверку, kizwan! Значит, без фикса 0x02 в DSDT никуда.
Я уже установил новый двухъядерный процессор и теперь готовлюсь к чистой (Retail) установке 64-битной Snow Leopard на новый жёсткий диск через внешний USB-бокс с загрузчиком Chameleon RC4 на скрытом разделе EFI. Правильно ли я понимаю порядок действий: разворачиваю образ Retail DVD на раздел, ставлю систему на новый диск в USB-боксе, устанавливаю туда Chameleon, DSDT и базовые кексты, проверяю загрузку по USB, а затем переставляю диск внутрь ноутбука и переношу данные со старого диска?
@uman… Правильно ли я понимаю порядок действий: разворачиваю образ Retail DVD на раздел, ставлю систему на новый диск в USB-боксе...
Да, всё верно! Более того, можно развернуть образ Retail DVD на небольшой 8-гигабайтный раздел прямо на текущем диске, обновить загрузчик до Chameleon 2 RC4 и разложить кексты для Leopard и Snow Leopard по разным подпапкам:
Extra/10.5/Extensions Extra/10.5/Extensions.mkext Extra/10.6/Extensions Extra/10.6/Extensions.mkext
Затем перезагрузиться, выбрать в меню Chameleon раздел «Mac OS X Install DVD» и установить Snow Leopard на новый диск. Единственный нюанс: у меня штатный бинарник boot из пакета Chameleon RC4 зависал после выбора раздела, поэтому я заменил файл boot на проверенный бинарник от PC EFI 10.6 с сайта netkas.org.
kizwan
@kizwanДа, всё верно! Более того, можно развернуть образ Retail DVD на небольшой 8-гигабайтный раздел...
Я так понимаю, установочный раздел должен быть на диске с загрузчиком? И позволит ли установщик Snow Leopard выбрать в качестве целевого диска мой новый накопитель, подключённый через внешний USB-бокс?
Кстати, у твоего ноутбука Acer ведь тоже южный мост ICH7-M? Я нашёл несколько полезных правок DSDT в документации Intel по ICH7, скоро протестирую их в SL и опубликую в разделе DSDT.
@umanЯ так понимаю, установочный раздел должен быть на диске с загрузчиком? И позволит ли установщик Snow Leopard выбрать в качестве целевого диска мой новый накопитель, подключённый через внешний USB-бокс?
Да, установщик Snow Leopard спокойно позволяет устанавливать систему на внешний USB-диск (размеченный в GUID). Я сам держу внешний 80-гигабайтный USB-диск как универсальный установочный носитель с тремя разделами: первый (FAT32) под файлы, второй — загрузочный раздел с Chameleon 2 RC4 + PC EFI 10.6, а третий — с развёрнутым образом Retail DVD.
Да, в моём Acer Aspire 9420 тоже стоит южный мост ICH7-M! Кстати, проблему с отваливающимся после сна Wi-Fi (карта Dell/Broadcom 4315) я уже решил, обновив IONetworkingFamily.kext до версии из 10.6.2. А в самом DSDT для ноутбука я сделал четыре ключевые правки:
- прописал встроенные контроллеры USB 2.0 (EHCI) так, чтобы система считала их внутренними и не прерывала сон;
- добавил метод засыпания при закрытии крышки экрана (LID);
- прописал правильный NVCAP для видеокарты GeForce Go 7300 для работы двух экранов;
- обновил ConfigData кодека ALC883 для работы микрофона.
kizwan
Эх, три первых способа из блога Prasys (pra sys.co.cc/2009/08/installing-snow-leopard-for-osx86/) у меня почему-то не пошли.
В итоге сейчас запустил установку Snow Leopard на свой новый жёсткий диск, подключив его к настоящему MacBook Pro. Правильно ли я понимаю, что после завершения установки мне достаточно поставить на его раздел EFI загрузчик Chameleon и скопировать в /Extra нужные кексты перед первым запуском на своём ноутбуке?
Должен признать, чистая Retail-установка Snow Leopard с непривычки даётся непросто!
@uman… Правильно ли я понимаю, что после завершения установки мне достаточно поставить на его раздел EFI загрузчик Chameleon и скопировать в /Extra нужные кексты перед первым запуском на своём ноутбуке?
Да! Главные обязательные кексты для старта Snow Leopard — это fakesmc.kext (от netkas) и PlatformUUID.kext (старый AppleDecrypt.kext в SL больше не нужен и не работает).
И ещё один важный совет: по умолчанию Snow Leopard пытается грузиться в 64-битном режиме, что на многих ноутбуках вызывает проблемы с кекстами. Поэтому обязательно пропиши в com.apple.Boot.plist внутри ключа Kernel Flags параметр arch=i386 для загрузки в 32-битном режиме.
kizwan
@kizwan...Поэтому обязательно пропиши в com.apple.Boot.plist внутри ключа Kernel Flags параметр arch=i386 для загрузки в 32-битном режиме.
Точно! А я-то по старой памяти писал устаревший флаг -x32, который в новых сборках Chameleon 2 больше не действует! Спасибо за помощь, создал отдельную тему по своей установке, чтобы не оффтопить в ветке по DSDT.
Видеокарта GeForce Go 7300
kizwan,
увидел в твоём сообщении, что тебе удалось прописать мобильную видеокарту GeForce Go 7300 прямо в DSDT! Расскажи, пожалуйста, как именно ты это сделал: на моём ноутбуке ASUS F3Jc (с такой же Go 7300, заведённой через EFI-строку в boot.plist) после пробуждения из сна внешний монитор на порту DVI остаётся чёрным.
Заранее спасибо!
@josefkakizwan, увидел в твоём сообщении, что тебе удалось прописать мобильную видеокарту GeForce Go 7300 прямо в DSDT! Расскажи, пожалуйста, как именно ты это сделал...
Уточни: чёрный экран возникает при выходе из полноценного сна всей системы или после обычного гашения дисплея по таймеру бездействия? Если второе — у меня на Go 7300 точно такая же особенность при простом отключении подсветки монитора, поэтому в настройках энергосбережения я выставил таймер отключения дисплея на «Никогда» (используя вместо этого экранную заставку или полноценный сон ноутбука).
А сам пример инжекта GeForce Go 7300 и значения NVCAP в моём файле DSDT можно посмотреть здесь (ищи по строке "7300"):
media fire.com/?zmnbzhwq0mt
или
media fire.com/?mozqymgktyn
kizwan
Источники и реестр соавторов (указано участников: 15 · Тема #3478)
| Участник | Роль в досье | Сообщений | Период активности |
|---|---|---|---|
| @uman | Ключевой участник | 9 | 2009-07-30 → 2010-03-04 |
| @kizwan | Ключевой участник | 8 | 2009-07-13 → 2010-04-01 |
| @infinitek | Участник | 2 | 2009-08-19 → 2009-08-20 |
| @ariyako | Участник | 2 | 2009-11-20 → 2009-11-28 |
| @candykane | Основной автор | 1 | 2009-07-13 |
| @digital_dreamer | Участник | 1 | 2009-08-01 |
| @ariadri | Участник | 1 | 2009-08-20 |
| @mwgdrwg | Участник | 1 | 2009-08-21 |
| @dgandra | Участник | 1 | 2009-09-05 |
| @osxfr33k | Участник | 1 | 2009-09-22 |
| @MikeHunt79 | Участник | 1 | 2009-09-23 |
| @Ianxxx | Участник | 1 | 2009-11-27 |
| @spalek83 | Участник | 1 | 2009-12-06 |
| @SaCleoCheater | Участник | 1 | 2010-01-29 |
| @josefka | Участник | 1 | 2010-04-01 |