Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Да вот незадача — производителям материнок платы снятые с производства становятся очень быстро не интересны. Поэтому обновления биоса со свежим микрокодом по них нет.Большинство пользователей не обновляет прошивку платы даже при наличии новых версий.
Например, линукс применяет это где-то на ранних этапах запуска ядра. Ему надо указать параметром загрузки путь до файла intel_ucode.img, или как-то так. Можно погуглить механизм того как линукс его применяет, скорее всего у процессора есть специальные фичи для таких фокусов.
А другие процессоры, к счастью, делает не интел…
В любой момент времени, находясь в привелегированном режиме, можно загрузить в память блоб с микрокодом и вызвать соответствующую инструкцию, передав ей указатель на начало блоба, возможно длину и другие параметры.
Procedure for Runtime Microcode Update
To load an update during runtime, software should synchronize all logical processors within the system (perform a rendezvous) to load the update in a coordinated manner.
Once all logical processors have been synchronized, one logical processor in each core should load the update while sibling logical processors wait in a spin loop of only basic instructions. Some guidelines are:
The spin loop should not contain MWAIT or HLT. PAUSE or LFENCE may be used to throttle the loop.
Software may load microcode on each core in parallel.
To help improve performance, software should check that the microcode is newer than what is already loaded immediately prior to doing the write. This may avoid redundant microcode updates, especially on processors where a microcode update also updates microcode on other cores.
You can see an example of the microcode update procedure below:microcode_update_sync() { primary_thread_done = 0 check in to MCU_GO barrier wait for MCU_GO barrier if (primary_thread_of_core) { // always true if no HT cpuid rev_id = rdmsr(0x8b).edx if (update_id < 0 || update_id > rev_id) { load_update() } primary_thread_done = 1 } else { // other HW threads (if they exist) while (primary_thread_done == 0) { pause //lfence is also acceptable } cpuid rev_id = rdmsr(0x8b).edx if (update_id != rev_id && (update_id < 0 || update_id > rev_id)) { load_update() } } check in to MCU_DONE barrier wait for MCU_DONE barrier }
Microsoft выпустила обновления для Windows 10 c исправлением микрокода Intel — патчи против уязвимости типа Platypus