Mac OS X на оборудовании x86 Технический архив 2008–2024
InfiniteMac OSx86 › Ядро OSx86 10.X и архитектура загрузки › Исправление сброса настроек BIOS (CMOS Reset) пр…
332,582 reads · 2009-07-13 – 2010-04-01
Отчёт Ядро 10.X DSDT

Исправление сброса настроек 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 ↗
Полный технический перевод на русский язык · Все команды терминала, имена кекстов, узлы ACPI и флаги загрузчика сохранены в оригиналеОткрыть оригинал на английском (Original English) →

Бета-сборки (а также финальный релиз) 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 исходных сообщений темы

Заметка #1 @uman 2009-07-30

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?

Заметка #2 @digital_dreamer 2009-08-01

uman,
Эта правка абсолютно безопасна для обеих версий ОС.
Значение 0x08 нужно изменить на 0x02 (в Leopard это ни на что не повлияет, а в Snow Leopard предотвратит сброс настроек CMOS).

Что касается строчек IRQNoFlags () {8} внутри секции RTC: их удаляют в том случае, если у вас не работает звук или происходят паники ядра на материнских платах ASUS (в таком случае прерывание IRQ 8 переносят в секцию таймера HPET).

С уважением,
MAJ

Заметка #3 @infinitek 2009-08-19

Простите за дилетантский вопрос, а какой программой вы декомпилируете и редактируете свои файлы DSDT?..

Заметка #4 @ariadri 2009-08-20

Удобный дроплет-декомпилятор и компилятор iASLMe можно скачать, например, на форуме AppleLife: appl elife.ru/poleznye_keksty_utility_i_solyusheny_dlya_osx86/9675/860.html#entry93244

Просто перетаскиваете свой бинарный файл dsdt.aml на иконку программы — и получаете текстовый исходник dsdt.dsl, который можно открыть и отредактировать в любом текстовом редакторе. А когда закончите правку, перетащите изменённый dsdt.dsl обратно на иконку приложения, и оно скомпилирует его обратно в готовый dsdt.aml ^_^

Заметка #5 @mwgdrwg 2009-08-21

Спасибо огромное — сброс BIOS при перезагрузке прекратился! Правда, система всё ещё падает в панику ядра дальше по ходу загрузки, продолжаю разбираться...

Заметка #6 @dgandra 2009-09-05

В моём DSDT в секции Device (RTC) параметр выравнивания Alignment равен 0x04, а в примере автора в первом посте указано 0x00. Мне нужно менять Alignment на 0x00 или трогать нужно только строку Length?

Заметка #7 @osxfr33k 2009-09-22

Подскажите, а в каком именно месте файла DSDT.dsl должна находиться эта секция? В начале, в середине или в конце? Я открыл свой дамп в программе DSDTSE, искал поиск по слову RTC, но такой секции у меня вообще не нашлось (хотя на моей плате ASUS Maximus Formula на чипсете X38 сброса CMOS вроде бы и не наблюдается — может, у ASUS это устройство называется иначе?).

Заметка #8 @MikeHunt79 2009-09-23

Привет! Вот как выглядит секция 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)
                        }
                    }
                }
Заметка #9 @Ianxxx 2009-11-27

Да, в конструкциях с двумя шаблонами ресурсов (или как ниже с 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 <-- ЭТОТ МОЖНО НЕ ТРОГАТЬ
)

Заметка #10 @spalek83 2009-12-06

Кстати, для тех, кто не хочет редактировать DSDT, появилось решение проблемы сброса CMOS в виде отдельного кекста (ElliottForceLegacyRTC.kext):

k exts.com/view/151-cmos_reset_fix_%28via_kext%29.html

Заметка #11 @SaCleoCheater 2010-01-29

К слову, длина регистра 0x02 в секции RTC — это не самодельный костыль хакинтошников: именно такое описание Device (RTC) использует сама Apple в оригинальной таблице DSDT ноутбука MacBook Air.

Заметка #12 @uman 2010-02-26

Как писал разработчик BuildSmart в комментариях у netkas (см.: http://netkas.org/?p=114#comment-45114 ↗), если в заводском DSDT вашей платы указаны длина 0x08 и выравнивание 0x01, это соответствует спецификации ASL. При этом на русскоязычном форуме (AppleLife) обсуждали, что в обновлении 10.6.2 с длиной 0x02 на некоторых платах могут возникать нюансы со сном. Кто-нибудь уже проверял поведение RTC в 10.6.2?

Заметка #13 @kizwan 2010-02-26 ↳ Re: @uman
@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

Заметка #14 @uman 2010-02-27 ↳ Re: @kizwan
@kizwanНа моём ноутбуке Acer Aspire 9420 сброс настроек BIOS в 10.6.0/10.6.1 происходил только при попытке ухода в режим глубокого сна (гибернации)...

Привет, kizwan!

Вот именно это я и пытался выяснить: нужно ли в 10.6.2 по-прежнему менять 0x08 на 0x02, или Apple изменила поведение драйвера AppleRTC.kext в 10.6.2. Буду очень признателен, если проверишь!

Заметка #15 @kizwan 2010-02-27 ↳ Re: @uman
@umanПривет, kizwan! Вот именно это я и пытался выяснить...

В 10.6.0 и 10.6.1 патч RTC (0x02) полностью спасал меня от сброса BIOS при гибернации. Сегодня вечером обновлю свой Acer Aspire 9420 до 10.6.2 и специально протестирую его с заводским значением 0x08 без патча RTC!

kizwan

Заметка #16 @uman 2010-02-28

Спасибо, что вызвался проверить на 10.6.2! А я пока сижу по уши в технической документации на южный мост Intel ICH7 и спецификациях ACPI, сверяя патчи выключения и сна. На днях приехал мой новый процессор Core 2 Duo, так что скоро тоже переберусь на Snow Leopard.

Заметка #17 @kizwan 2010-03-01 ↳ Re: @uman
@umanСпасибо, что вызвался проверить на 10.6.2!...

Привет, uman!

Докладываю по итогам серии тестов на 10.6.2: менять длину регистра в Device (RTC) с 0x08 на 0x02 по-прежнему обязательно! Стоило мне вернуть заводское значение 0x08, как при первой же перезагрузке после сна (в режиме hibernatemode 3) настройки BIOS снова сбросились.

Так что патч RTC до 0x02 актуален и для 10.6.2. Сейчас бьюсь только над тем, чтобы Wi-Fi-карта не отключалась после выхода из сна.

kizwan

Заметка #18 @uman 2010-03-01

Спасибо огромное за проверку, kizwan! Значит, без фикса 0x02 в DSDT никуда.

Я уже установил новый двухъядерный процессор и теперь готовлюсь к чистой (Retail) установке 64-битной Snow Leopard на новый жёсткий диск через внешний USB-бокс с загрузчиком Chameleon RC4 на скрытом разделе EFI. Правильно ли я понимаю порядок действий: разворачиваю образ Retail DVD на раздел, ставлю систему на новый диск в USB-боксе, устанавливаю туда Chameleon, DSDT и базовые кексты, проверяю загрузку по USB, а затем переставляю диск внутрь ноутбука и переношу данные со старого диска?

Заметка #19 @kizwan 2010-03-01 ↳ Re: @uman
@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

Заметка #20 @uman 2010-03-01 ↳ Re: @kizwan
@kizwanДа, всё верно! Более того, можно развернуть образ Retail DVD на небольшой 8-гигабайтный раздел...

Я так понимаю, установочный раздел должен быть на диске с загрузчиком? И позволит ли установщик Snow Leopard выбрать в качестве целевого диска мой новый накопитель, подключённый через внешний USB-бокс?

Кстати, у твоего ноутбука Acer ведь тоже южный мост ICH7-M? Я нашёл несколько полезных правок DSDT в документации Intel по ICH7, скоро протестирую их в SL и опубликую в разделе DSDT.

Заметка #21 @kizwan 2010-03-01 ↳ Re: @uman
@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

Заметка #22 @uman 2010-03-03

Эх, три первых способа из блога Prasys (pra sys.co.cc/2009/08/installing-snow-leopard-for-osx86/) у меня почему-то не пошли.

В итоге сейчас запустил установку Snow Leopard на свой новый жёсткий диск, подключив его к настоящему MacBook Pro. Правильно ли я понимаю, что после завершения установки мне достаточно поставить на его раздел EFI загрузчик Chameleon и скопировать в /Extra нужные кексты перед первым запуском на своём ноутбуке?

Должен признать, чистая Retail-установка Snow Leopard с непривычки даётся непросто!

Заметка #23 @kizwan 2010-03-04 ↳ Re: @uman
@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

Заметка #24 @uman 2010-03-04 ↳ Re: @kizwan
@kizwan...Поэтому обязательно пропиши в com.apple.Boot.plist внутри ключа Kernel Flags параметр arch=i386 для загрузки в 32-битном режиме.

Точно! А я-то по старой памяти писал устаревший флаг -x32, который в новых сборках Chameleon 2 больше не действует! Спасибо за помощь, создал отдельную тему по своей установке, чтобы не оффтопить в ветке по DSDT.

Заметка #25 @josefka 2010-04-01

Видеокарта GeForce Go 7300

kizwan,
увидел в твоём сообщении, что тебе удалось прописать мобильную видеокарту GeForce Go 7300 прямо в DSDT! Расскажи, пожалуйста, как именно ты это сделал: на моём ноутбуке ASUS F3Jc (с такой же Go 7300, заведённой через EFI-строку в boot.plist) после пробуждения из сна внешний монитор на порту DVI остаётся чёрным.

Заранее спасибо!

Заметка #26 @kizwan 2010-04-01 ↳ Re: @josefka
@josefkakizwan, увидел в твоём сообщении, что тебе удалось прописать мобильную видеокарту GeForce Go 7300 прямо в DSDT! Расскажи, пожалуйста, как именно ты это сделал...

Уточни: чёрный экран возникает при выходе из полноценного сна всей системы или после обычного гашения дисплея по таймеру бездействия? Если второе — у меня на Go 7300 точно такая же особенность при простом отключении подсветки монитора, поэтому в настройках энергосбережения я выставил таймер отключения дисплея на «Никогда» (используя вместо этого экранную заставку или полноценный сон ноутбука).

А сам пример инжекта GeForce Go 7300 и значения NVCAP в моём файле DSDT можно посмотреть здесь (ищи по строке "7300"):
media fire.com/?zmnbzhwq0mt
или
media fire.com/?mozqymgktyn

kizwan

Проверили и дополнили материал: @kizwan @uman @infinitek @ariyako
Источники и реестр соавторов (указано участников: 15 · Тема #3478)
УчастникРоль в досьеСообщенийПериод активности
@umanКлючевой участник92009-07-30 → 2010-03-04
@kizwanКлючевой участник82009-07-13 → 2010-04-01
@infinitekУчастник22009-08-19 → 2009-08-20
@ariyakoУчастник22009-11-20 → 2009-11-28
@candykaneОсновной автор12009-07-13
@digital_dreamerУчастник12009-08-01
@ariadriУчастник12009-08-20
@mwgdrwgУчастник12009-08-21
@dgandraУчастник12009-09-05
@osxfr33kУчастник12009-09-22
@MikeHunt79Участник12009-09-23
@IanxxxУчастник12009-11-27
@spalek83Участник12009-12-06
@SaCleoCheaterУчастник12010-01-29
@josefkaУчастник12010-04-01

Выберите язык · Choose your language