Рассказ Джокера о рисках преждевременной оптимизации
25 мая 2025 г., 01:24
—Ну, слушайте, ребятки, эту трагикомедию в кремниевых тонах. Был у нас Бэтмен. Да не тот, что уши мышиные нацепил и по крышам скачет, как угорелый. А Бэтмен Чёртов Добряк. Тот, который каждую инструкцию по ГОСТу выверяет, каждую переменную документирует, и прежде чем `rm -rf /` нажать, трижды перекрестится и бэкап на три разных континента сделает.
—И вот, значит, решил наш Добряк, что его новенький, только что из коробки, 256-ядерный "Bat-Threadripper-Extreme-Edition-For-Justice" работает... ну, недостаточно эффективно для анализа паттернов чихания Пингвина в реальном времени. "Нужно больше контроля!" – провозгласил Бэтмен, поправляя идеально завязанный галстук-бабочку (да, он даже в Бэтпещере его носил, такой уж он Добряк).
—"Альфред, – говорит, – принеси-ка мне NASM, компилятор Си с поддержкой `__asm__ volatile` и пару литров крепчайшего кофе без сахара. Будем оптимизировать ядро!"
—Альфред, который повидал на своем веку всякое, только тяжело вздохнул: "Сэр, может, лучше сначала патент на новый бэтаранг дооформим? А то с этими вашими низкоуровневыми экспериментами..."
"Ничего, Альфред, я всё рассчитал! – Бэтмен Чёртов Добряк уже сидел, окруженный распечатками Intel Manuals, томами Таненбаума и священным писанием Кнута. – Я просто хочу написать кастомный обработчик прерываний для более быстрого переключения контекста между слежкой за Джокером и анализом котировок акций Уэйн Энтерпрайзес. Чистая экономия наносекунд! Использование каждого такта с пользой!"
—И вот он, наш герой, в режиме ядра, ring 0, все дела. Загрузил свой крошечный модуль, написанный на чистейшем, как слеза младенца, NASM. Никаких тебе C-шных обёрток, только суровый ассемблер, только хардкор!
—"Так, – бормотал Бэтмен, – сейчас мы запишем в MSR (Model Specific Register) 0x199 (IA32_PERF_CTL) новое значение, чтобы динамически управлять частотой процессора. Максимальная производительность, когда Джокер что-то замышляет, и энергосбережение, когда он просто рисует смайлики на стенах Аркхема."
Он тыкал пальцем в распечатку, сверяясь с битами. "Ага, бит 16 – 'Disable Turbo'. Хм, нет, турбо нам нужен! Бит 32... ой, стоп, регистр-то 64-битный, а я смотрю описание для старой архитектуры! Ну ничего, тут они совместимы... почти."
И вот он пишет свою роковую инструкцию:
mov ecx, 0x199 ; MSR-адрес
mov eax, 0x0000FFFF ; Нижние 32 бита нового значения (тут он хотел что-то умное прописать)
mov edx, 0x0000000F ; ВЕРХНИЕ 32 бита! И вот тут-то собака и порылась!
Бэтмен Чёртов Добряк, в своей педантичности, решил, что если старшие биты не используются для его текущей задачи, их можно просто... ну, чем-нибудь "безопасным" заполнить. И он выбрал 0x0000000F. Звучит безобидно, правда? Как имя для котенка.
Он нажал Enter.
wrmsr
В Бэтпещере на мгновение стало тихо. Даже летучие мыши перестали шуршать.
А потом...
Сначала появился тонкий, едва уловимый запах. Запах паленой пластмассы и разочарования.
—"Сэр, мне кажется, или запахло горелым?" – Альфред принюхался.
—"Ерунда, Альфред, это просто... э-э-э... новый освежитель воздуха 'Запах Победы над Преступностью'!"
Но тут "Bat-Threadripper-Extreme-Edition-For-Justice" издал тихий, жалобный "пшик". Маленькое облачко сизого дыма лениво поднялось из вентиляционных отверстий системного блока, выполненного в форме головы Бэтмена (светящиеся глаза погасли первыми). На всех 27 мониторах разом появилось... ничего. Чёрный экран отчаяния.
Бэтмен Чёртов Добряк замер. Его лицо, обычно выражающее лишь праведный гнев и глубокую задумчивость, на секунду исказилось чем-то похожим на детскую обиду.
"Так... Кажется, значение `0x0000000F` в старшей части IA32_PERF_CTL на этой конкретной ревизии процессора... активировало секретный режим 'Самоуничтожение при несанкционированном доступе к сверхсекретным настройкам напряжения ядра номер 128', о котором я забыл прочитать в приложении Q, пункт 7, подпункт "гамма", мелким шрифтом," – пробормотал он, снимая галстук-бабочку, который вдруг стал ему жать.
Альфред подошёл, взял дымящийся системный блок двумя пальцами и брезгливо отнёс его к мусорному баку с логотипом Лиги Справедливости.
—"Сэр, может, в следующий раз просто купите новый процессор помощнее? И оставите настройки по умолчанию? А для анализа чихания Пингвина воспользуемся старым добрым Python. Он, знаете ли, реже вызывает экзистенциальный кризис у аппаратного обеспечения."
Бэтмен Чёртов Добряк молча кивнул. Урок был усвоен. Даже самые благие намерения, помноженные на прямой доступ к MSR и недосып, могут привести к катастрофе эпического масштаба. И к незапланированным тратам на новый флагманский процессор.
—"И, Альфред, – добавил он чуть позже, уже заказывая новый CPU (и на всякий случай, небольшой огнетушитель для серверной), – в следующий раз, когда я скажу 'я всё рассчитал', пожалуйста, просто ударь меня по голове ближайшим бэтарангом. Мягким, тренировочным, разумеется."
Так Бэтмен Чёртов Добряк узнал, что иногда лучший код – это тот, который ты *не* написал. Особенно в режиме ядра. И особенно, если ты немного перепутал биты. История умалчивает, поймал ли он Пингвина в тот день, но его банковский счет точно стал немного легче.