Некоторое время назад я приобрёл на Ebay б/у ноутбук Lenovo Thinkpad W520. Как известно, W-серия — это очень мощные ноутбуки, железки в которых дадут фору многим более современным машинам. Конечно же, я начал его обустраивать под себя, и, в частности, решил проапгрейдить имеющуюся память всем, что было в наличии, а в наличии было немало: 2 свободные планки DDR3-1600 из старого ноута — 4 и 8 гигабайт. Посмотрев на то, что было установлено продавцом, я обнаружил, что из 3 установленных планок 2 — DDR3-1600, а одна — 1333. Учитывая, что первые две были по 8 гигабайт, а последняя — 2 гигабайта, от неё я и решил избавиться. Рассчитывая получить после апгрейда 8+8+8+4=28 гигабайт DDR3-1600 в рабочем ноуте, я
После непродолжительных поисков я обнаружил, что как официально, так и неофициально W520 поддерживает только DDR3-1333, а владельцы более быстрой памяти зря тратили на неё деньги. Мне стало немного обидно за всех таких владельцев, и я решил попробовать избавиться от этой несправедливости, тем более, что контроллер памяти, нынче, как известно, в процессоре, и установленный в моей модели Intel Core i7 2720QM официально поддерживает DDR3-1600.
А теперь немного интересных подробностей.
Решение любой сложной задачи стоит начинать со сбора имеющейся информации. Тут мне довольно быстро повезло, нашлась интересная страничка на Thinkwiki, утверждавшая, что нужный мне модифицированный BIOS очень даже существует, но его делает какой-то ушлый мой соотечественник по имени Oleh, и просит за это 1500 рублей. Я не против, есть спрос — есть и предложение, но мы вроде сами с усами, и прошить и припаять, и в коде разобраться умеем, попробуем сэкономить полтора килорубля на мороженное.
Собственно, задачу за меня почти решили, страничка на Thinkwiki содержит ссылку на довольно известный ресурс BIOS-Mods, где патч фактически подан на блюдечке, надо сделать так:
8B 85 C8 FC FF FF 8B 48 09 66 C7 41 01 35 05 C6 85 C2 FC FF FF 0C
на
66 0F 1F 44 00 00 0F 1F 00 66 0F 1F 44 00 00 0F 1F 80 00 00 00 00
Но при попытке этим решением воспользоваться «в лоб» меня ждал облом — такой последовательности байт в прошивке не оказалось совсем, ни по этому смещению, ни по какому-то другому. Пришлось засучить рукава и копать глубже, то есть всё-таки разобраться, что же этот код делает и на что его надо исправить.
Прежде всего скажу, что последовательность 66 0F 1F 44 00 00 0F 1F 00 66 0F 1F 44 00 00 0F 1F 80 00 00 00 00 не делает ничего. То есть её с тем же успехом можно заменить на последовательность nop(0x90), как мне позже указал CodeRush, но это я забегаю вперёд. Пока примем к сведению, что эта последовательность именно отключает искомый код, а не меняет его.
Я исходил из того, что патч, который описан на BIOS-Mods — правильный, просто от другой модели ноутбука, и в моей что-то будет немного не так.
Исходный код для исправления в файле SandyBridgePhx.efi выглядит так:
hex | asm |
---|---|
8B 95 C8 FC FF FF | mov edx, [ebp+var_338] |
8B 42 09 | mov eax, [edx+9] |
66 C7 41 01 35 05 | mov word ptr [eax+1], 535h |
C6 85 C2 FC FF FF 0C | mov [ebp+var_33E], 0Ch |
535h здесь — не что иное, как тактовая частота в мегагерцах, 1333 в десятичной системе счисления. Поскольку это характерное значение, я выковырял SandyBridgePhx.efi из прошивки UEFI Tool-ом, взял radare2 и поискал 535h в этом файле (не забываем про little endian):
Листинг radare2
[0x00000000]> /x 3505
Searching 2 bytes in [0x0-0x2406]
hits: 2
0x000017d6 hit0_0 3505
0x00001839 hit0_1 3505
Почему-то наши 1333 мегагерца встречаются 2 раза совсем рядом. Смотрим, что же там такое:
Смещение | hex | asm |
---|---|---|
0x000017c9 | 8B 85 C8 FC FF FF | mov eax, dword [ebp — 0x338] |
0x000017cf | 8B 48 09 | mov ecx, dword [eax + 9] |
0x000017d2 ~ | 66 C7 41 01 35 05 | mov word [ecx + 1], 0x535 |
0x000017d8 | C6 85 C2 FC FF FF | mov byte [ebp — 0x33e], 0xc |
Тильдой помечена строчка с искомым значением. Видно, что код в целом соответствует искомому, единственное что отличается — это регистры. В общем, вроде бы всё просто, но есть же второе значение… Идем по смещению 0x00001839 и видим там точно такую же последовательность команд, 1 в 1. WTF? Что патчить-то? Да и самое главное, почему мне надо именно отключить этот код, а не поменять 1333 на 1600, скажем? Для объяснения этого моих рудиментарных знаний x86 ассемблера не хватало. Я обратился за помощью к приятелю-реверсеру Rumata888. Он, в силу профессии, имеет доступ к нормальной лицензионной версии IDA Pro, чем не преминул воспользоваться.
Буквально один скриншот из IDA, который объяснил мне всё:
42Bh, 535h, 640h и 74Bh это, как вы уже наверное догадались, частоты памяти: 1067, 1333, 1600 и 1867 МГц соответственно. То есть это, понятное дело, блоки, которые выставляют нужную частоту памяти (скорее всего, читая её из SPD и сохранённых настроек). А вот дальше происходит самое интересное: вне зависимости от того, что мы там навыставляли, происходит переход по смещению 182Сh. И выполняется та самая вторая последовательность команд, которая сбила меня с толку. Дамы и господа, перед нами самый обыкновенный костыль: сначала добросовестно анализируем, что же за частоту надо выставить, а затем берём кувалду и намертво прибиваем 1333 МГц. Естественно, от костыля надо избавиться (что и сделали на BIOS-Mods), и после этого всё заработает.
После того, как ясность наступила, я, дабы подкрепить уверенность, попросил CodeRush, как главного публичного специалиста по UEFI, проверить, всё ли я сделал как надо, на что получил уже упомянутый совет, что всё выглядит нормально, но лучше выкинуть хитромудрый участок (66 0F 1F 44 00 00 0F 1F 00 66 0F 1F 44 00 00 0F 1F 80 00 00 00 00) и просто забить ненужный костыль nop-ами. Ну и рекомендацию
Дальше были затруднения, из-за которых патч пришлось отложить почти на месяц. Сначала я ждал посылку с программатором и прищепку для прошивки SPI-Flash без выпаивания, потом пытался после бэкапа программатором прошить модифицированный файл прошивки при помощи виндового софта. Сразу сообщаю: ни фига не вышло. По-видимому, шить можно только в случае разницы версий, а 1.42 поверх 1.42 фирменный софт шить не будет. Пришлось сделать всё самым дубовым способом: поправить слитый из флэшки бэкап и залить его обратно программатором.
Краткая инструкция по самостоятельному исправлению фатального недостатка.
Теперь резюме, для тех, кому не хочется читать мою писанину выше, рабочий способ разблокировки памяти на Thinkpad W520(и других схожих моделях, в частности T520 и, вероятно, X220 и ещё какие-то модели на Sandy Bridge):
- Покупаем/ищем вышеупомянутые прищепку и программатор. Естественно, программатор можно использовать и другой, в частности очень популярные Raspberry Pi, а прищепку заменить выпаиванием-впаиванием микросхемы SPI Flash. Но это уж на ваше усмотрение — вдруг у вас навык пайки Grandmaster и паяльная станция всегда под рукой. Тем, кто с пайкой не дружит, прищепки очень рекомендую.
- Подключаем(или выпаиваем и подключаем) флэшку, не перепутайте подключение, 1-й провод на прищепке выделен, на микросхеме 1-й контакт отмечен точкой. Сама флэшка находится тут(отмечено стрелкой):
Инструкция, как туда добраться, с картинками - Сливаем бэкап флэшки, на всякий случай проверяем, что он не пустой и размер правильный, флэшка у W520 размером 64Мбита, т.е. 8 мебибайт
или мегабайт, если вы ретроград. Ещё лучше использовать функцию проверки у прошивальщика, если она есть. Если нет — может взять другой софт? - Открываем Hex-редактором бэкап, ищем Hex-последовательность байт
Вот такую8B 85 C8 FC FF FF 8B 48 09 66 C7 41 01 35 05 C6 85 C2 FC FF FF
Находим её в бэкапе 4 раза. Последние два, что ближе к концу, трогать не стоит — они для инициализации памяти в аварийном режиме(файл SandyBridgePhxCrisis.efi, если вдруг кому интересно). Из первых двух, как следует из текста выше, нас интересует второе вхождение этой последовательности. У меня на W520 искомое место начинается со смещения 53A834h. - Заменяем все указанные байты на nop(90h).
- Прошиваем свой бэкап обратно в флэшку, проверяем, что всё прошилось правильно(вот тут уж функция проверки абсолютно незаменима).
- Запаиваем флэшку обратно (или просто снимаем прищепку), собираем ноутбук, загружаемся, запускаем CPU-Z и делаем вот такой скриншот:
- PROFIT!
Выражаю благодарность CodeRush и Rumata888, без них бы этой заметки никогда бы не было, а я так и остался бы неучем.
Если кто-то возьмётся последовать моему примеру, готов опубликовать готовые рецепты (что менять, по какому смещению) для других моделей ноутбуков.
Комментарии (52)
molnij
19.06.2016 16:44+2Если не секрет, что вы делаете на ноутбуке, и действительно ли повысилась производительность после этого хака? Просто, на мой взгляд, частоты памяти — едва ли не последнее, что стоит тюнить в погоне за производительностью, вот и интересно, в какой области это актуально?
shogunkub
19.06.2016 16:46+4Вопрос не в том, полезно это или бесполезно. Производительность немного повысилась, в первую очередь, у встроенного видеоядра. Но вообще, я руководствовался не тем, какой это даст прирост, а просто «Почему нет, если это возможно?».
Evengard
19.06.2016 16:54может быть конечно у меня программатор гов о, но у меня прищепка не пашет. впрочем у меня и ноут другой… :(
shogunkub
19.06.2016 17:03Первое что надо проверить — правильность и надёжность(!) подключения. А то у меня в какой-то момент флэшка детектилась через раз. Можно мультиметром прозвонить, если есть возможность. Насчёт правильности — убедиться что на все ноги, на которые должно подаваться напряжение, оно подаётся. Это ноги 3,7,8. Ну и землю тоже стоит проверить.
Насчёт «ноут другой» — флэшки, по большому счёту, одинаковые. Говорят, бывают флэшки, в которых распиновка отличается от стандартной, но пока не встречал.Evengard
20.06.2016 13:25я честно говоря немного нуб. как её «прозвонить» и «проверить»?
shogunkub
20.06.2016 13:50Ну мультиметр-то у вас есть? Ставите его на «звонилку»-пробник, или, если такого положения нет, то на измерение сопротивления, с любым пределом шкалы, скажем 2 килоома. А дальше одним щупом касаетесь контакта на программаторе, а другим — соответствующей ему ноги микрухи(до ног обычно можно добраться с прицепленной прищепкой). Звенит или показывает 0 — хорошо, нет — значит нет контакта, пошевелите/поправьте прищепку и проверьте ещё раз. Земля, помимо этого, звонится вообще с любой землёй, в т.ч. обычно с рамой корпуса.
Можно ещё до подключения прозвонить аналогично саму прищепку, вдруг в ней проблема…Evengard
21.06.2016 04:36Всё равно что-то не помогает. Прищепка вроде в норме, прозвон во всяком случае успешен, цепляю вроде как всё надо, но программатор не распознаёт плату. Может всё же программатор не очень? Юзаю RT809F, плата W25Q64FVSSIG
shogunkub
21.06.2016 07:35Программатор шикарный! :) Там ZIF-сокет на программаторе 16-контактный, точно туда подключаете на ZIF-сокете?
25 серия подключается на дальние от рычага контакты, как на картинке показано. 1-й контакт — ближайший к рычагу. С 80-процентной вероятностью вы что-то не так подключаете, ещё 19% — плохой контакт где-то, или в сокете(попробуйте вставлять в него контакты не совсем до конца), или прищепка. И только в 1% случаев что-то не так с самим программатором.Evengard
21.06.2016 13:02да, я три часа вчера по разному пробовал именно так как описали… Он вроде даже тестировании пинов проходит, но при чтении выдаёт что ид оборудования 0х0, при чтении одни нули и ошибка чексуммы, ну а с записью я не рисковал.
JerleShannara
20.06.2016 16:27С прищепками дикая лотерея. Иногда надо укоротить длину кабеля от прищепки до программатора (порой приходится аж до 5 сантиметров и менее делать), иногда надо вообще заменить прищепку/программатор.
dartraiden
19.06.2016 17:05+1По-видимому, шить можно только в случае разницы версий, а 1.42 поверх 1.42 фирменный софт шить не будет :(
Ждём следующую статью, в которой будет описано отучение софта от такого поведения ;)shogunkub
19.06.2016 17:10Смысла особого нет, это ж одноразовая утилитка, которая подходит только в конкретном случае. Программатор на порядок универсальнее. Единственное, о чём жалею — что не могу сделать универсальную прошивку, но это задачка посложней, думается мне.
Chupaka
20.06.2016 06:51Если той же версией шить не получается — почему бы не попробовать у заливаемой прошивки номер версии слегка увеличить?
shogunkub
20.06.2016 06:55Там надо в тогда разбираться в двух вещах — в алгоритме присвоения версий прошивок(Там не просто 1.42, а 8BET62WW) и в алгоритме работы одноразовой утилитки. А самое главное, непонятно, чего ради.
oldcastor
20.06.2016 11:49На практике частенько не стоит изобретать костыли — они уже и так придуманы. Например, у AMI BIOS есть утилиты, которые позволяют проигнорировать сравнение версий при перепрошивке.
Я так разблокированный BIOS (взятый из интернетов) под ноутбук ASUS заливал, и родная утилита от ASUS меня, конечно же, посылала в ближний, но обидный путь. А вот с оф сайта AMI была скачана их универсальная утилита, которая обладает большим диапазоном настроек, что мне и пригодилось.dartraiden
20.06.2016 20:39Можно, конечно, и поискать утилиту, не спорю.
Впрочем, «защита» от даунгрейда прошивки, скорее всего, реализована одним-единственным условным переходом в программе. В своё время асусовскую AFUDOS именно так и «лечили» изменением всего лишь одного байта, после чего она уже прошивала прошивки любых версий.
beeruser
19.06.2016 18:08>> хитромудрый участок (66 0F 1F 44 00 00 0F 1F 00 66 0F 1F 44 00 00 0F 1F 80 00 00 00 00) и просто забить ненужный костыль nop-ами
Это и есть нопы. В х86 кроме однобайтных нопов с кодом 0x90 имеются коды для длин 2-15
66 0F 1F 44 00 00
0F 1F 00
66 0F 1F 44 00 00
0F 1F 80 00 00 00 00
6/3/6/7 байт соответственно
klirichek
20.06.2016 05:59Интересно…
А я взял с рук T420s. Комплектация без bluetooth.
Потом нашёл и купил соответствующую карту, разобрал, с удивлением обнаружил, что карта УЖЕ стояла в ноуте…
Вот теперь и гадаю: то ли комплектация «без bluetooth» была выставлена как-то софтом (и намертво прошита в BIOS — но тогда вопрос поставщику — нафига? Ведь железо уже установлено, стал быть издержки на это всё равно сделаны...), либо ещё что-то там повреждено, из-за чего тот порт физически не работает.shogunkub
20.06.2016 10:46У меня сейчас похожая проблема с 3G/4G-модемом от Dell — 5804, он определяется, драйвер я выдрал из родного инсталлятора и смог установить, даже SIM-карта видится, а подключаться ни в какую не хочет.
JerleShannara
20.06.2016 16:29Скорее всего в PM(power manager) ваш ноут распознается как безблютузный и оный PM (ну или EC) тупо не включает эту карту (а точнее питание на неё)
semmaxim
Мне очень интересно, чем руководствовались разработчики такой прошивки.
POS_troi
Разработчики ничем не руководствуются, чего маркетологи придумали того и реализовывают.
Иногда бывает что занижение параметров происходит при выходе новой прошивки БИОС, как правило такое бывает редко и в тех случаях когда выясняется что железо на предыдущих параметрах сбоит — поэтому подкручивают и рекомендуют обновиться.
shogunkub
Явно не тот случай, на более ранних версиях многие говорили, что у них работала DDR3-1600 без проблем, а потом зачем-то неофициальные характеристики привели к официальным.
ValdikSS
Нагрев сильнее. Использую на X220 1600-память на частоте 1333 МГц, т.к. при 1600 общая температура градусов на 5-7 выше, а у меня и так частый перегрев и троттлинг. Но производительность видеоподсистемы, конечно, выше при 1600 МГц.
shogunkub
Вот это может быть, хотя уже второй день гоняю, и пока перегрева не увидел…
POS_troi
Я просто к тому что урезание это не всегда следствие желания обдурить или заставить купить более дорогую модель.
Комп а в особенности ноуты это доволи сложные системы и не всегда есть возможность заставить работать все её компоненты на пределе.
Вот к примеру ValdikSS упомянул о перегреве, а для нынешних ноутов это критическая проблема — гонка за тонкостью пагубно влияет на возможности системы охлаждения. (хотя если ноут перегревается это выгодно производителю, но ноут года при постоянном перегреве не переживёт а это гарантия :) )
shogunkub
У W520 есть много комплектаций, и допускаю, что в связке Core i7 2920XM + Quadro 2000M + DDR3-1600 там действительно может быть печально с тепловыделением, но у меня пока проблем не отмечено. А у ValdikSS всё-таки X220, он меньше и там с теплоотводом проблем малость побольше.
knutov
У меня X220 и до какого-то одного из последних обновлений биоса он вполне так регулярно падал в синий экран после длительной нагрузки (две планки по 8 памяти, сотни открытых табов в браузере + танчики)
shogunkub
Мне тоже, если честно. Вообще, на забугорных форумах где-то читал, что в более ранних версиях этого костыля не было(но были некоторые другие проблемы), а в последних его добавили.
fidewu
Гарантией работоспособности.
shogunkub
Гарантирует в данном случае Intel, об этом в статье написано. Единственное, что может быть не так — недостаточное охлаждение, но судя по опыту эксплуатации, у W520, даже четырёхядерных, c этим всё в порядке. Возможно, есть исключение, имя которому Core i7 2920XM, но это не мой случай.
fidewu
Это ж ТинкПад. Там не простые требования к стабильности работы. Хочется надеяться. Ну не хочет Леново рисковать перегревами.
shogunkub
Если не заметно — костыль не совсем корректный, и при использовании DDR3-1066 будет пытаться запустить её на 1333 МГц. Правда, такую память ещё надо поискать, но если что — будет облом.
JerleShannara
А тут надо посмотреть на все возможные комплектации этих ноутбуков, которые оффициально продавали ленововцы. Скорее всего там DDR3-1066 просто не ставили (включая всякие xxxx-CTO). Отсюда и формат костыля «1066 мы не ставим, 1600 нестабильно, закостылим 1333, а если ушлый юзер поставит 1066 — сам олень», благо раньше у них было требование: если у вас что-то не работает и вы сдаёте ноут в гарантийный ремонт — извольте привести его к заводской конфигурации и поставить то железо, которое там стояло.
shogunkub
Скорей всего так и было, но про «не простые требования к стабильности работы» после этого язык не поворачивается говорить.
JerleShannara
Ну разработка платформы началась небось когда 1333 поддерживалось, под неё всё вылизали и получили чугунную стабильность. Далее вышел камень умеющий 1600, вроде заработал, прошел все тесты. Потом этот камень засунули в топовую конфигурацию и выяснили например, что система охлаждения на таких частотах через 4 часа под полной загрузкой всех вёдер, включая дискретную видеокарту начинает допускать нагрев камня например выше 95*С — шо есь не очень стабильно и не очень хорошо. «Айайай фсё прапало шеф», быстрый костыль " memclk = 1333;" и всё опять стабильно и греется только до 93*С.
Foolleren
Интел гарантирует одно, а на пути к ОЗУ есть ещё матплата, наводки и ёмкость дорожек могут вызывать ошибки.
shogunkub
А может и не вызывать. Прочитайте комментарий ниже.
Fandir
Мне тоже кажется, что производитель не стал заморачиваться с трассировкой на частоту 200МГц… Там разница в цикле 6 или 5 НС, возможно они просто не смогли гарантированно растрассировать для 200 МГц… Так что от плате к плате могут быть нюансы
CodeRush
Подозреваю, что на 1600 не проходит какой-то из тестов, которые в обычной жизни либо не встречаются совсем, либо встречаются крайне редко. Пример из моей практики прямо сейчас: на моей плате на AMD Merlin Falcon некоторые типы памяти SODIMM DDR4 (зависит от чипов, максимальной частоты и SPD, конкретнее я пока не знаю) откзываются определяться (и машина зависает с пост-кодом 0x5D, последним до начала тренировки памяти) во время теста «10000 инициированных ОС софт-ресетов с включенной сетевой картой и сохранением логов на сервере». Максимальная частота памяти на этой платформе — 2133 Мгц, если ограничить ее на 1866 Мгц — все хорошо, и почти любая память (за исключением прототипов с проблемами в SPD) проходит любые тесты. Т.к. сам тест длится кучу времени, а тренирувку памяти на этой платформе выполняет закрытый код PMU, на который может влиять только AMD, то мне, как автору прошивки, в миллион раз проще ограничить частоту сверху (еще и при ambient +80*C легче будет обеспечить работоспособность), чем отлаживать это поведение в обнимку с аппаратным отладчиком AMD Wombat в течение пары месяцев. Вот примерно из таких соображений и лимитируют, та же история с белыми списками совместимого оборудования, которые всех бесят, примерно та же — с QVL на модули памяти и остальным. А маркетологи были бы очень рады рекламировать совместимость с более быстрой памятью, но тут им слова не дали.
JerleShannara
Кстати вопрос — а что сейчас творится с SAGE-евскими отладчиками(а точнее с поддержкой их на текущем железе), а то два года назад хотелось оный заказать, а нынче контора алес капут и поехали.
CodeRush
Пока еще поддерживаются, но в будущем поддержка останется только у Wombat, скорее всего.
SAGE очень жаль, реально, прекрасная Gizmo2 осталась без прошивки, куча хороших людей потеряли работу, что будет с coreboot — совсем не ясно теперь, даже с учетом гугла…
JerleShannara
Похоже, что coreboot уйдет в arm. Ибо всё x86 в нём новое теперь в виде бинарных библиотек в лучшем случае стало. И интел с амд чесаться прекратили вообще.
CodeRush
У ARM'ов там с одной стороны U-boot, который развивается семимильными шагами, а с другой стороны — UEFI, который тоже уже практически готов и наберет свою долю так или иначе, просто потому, что UEFI Forum — не самая слабая организация. Что же до coreboot, то там из применений для «массового зрителя» одни хромобуки и остаются, пожалуй, на ARM или нет.