Data publikacji: May 01, 2011 4:41:37 PM
Cel:
posiadania grub z możliwością załadowania microkodu procesora przed zabootowaniem systemu operacyjnego
Wykonanie:
Pobieramy źródła grub2:
# apt-get source grub2
# apt-get builddep grub2
Zostanie utworzony katalog grub-*, w którym są źródła aplikacji wraz z katalogiem debian zawierającym reguły budowania pakietów.
Ze strony http://biosbits.org/download/ pobieramy najnowszy pakiet, aktualnie to http://biosbits.org/downloads/bits-372.zip.
Wypakowujemy bits-372.zip#uzip/bits-372/bits-372.iso#iso9660/boot/src/bits-372.tar.gz.
Z pliku bits-372.tar.gz katalog bits/rc kopiujemy do katalogu debian/grub-extras, gdzie rozpakowane zostały źródła grub2.
W katalogu debian/grub-extras/rc/conf zmieniamy common.mk na i386-pc.mk a common.rmk na i386-pc.rmk.
W tym samym katalogu tworzymy plik common.mk:
# -*- makefile -*-
-include $(GRUB_CONTRIB)/rc/conf/$(target_cpu)-$(platform).mk
i common.rmk:
# -*- makefile -*-
-include $(GRUB_CONTRIB)/rc/conf/$(target_cpu)-$(platform).mk
Przystępujemy do przebudowywania pakietu:
# dpkg-builddep -b
Instalujemy nowe pakiety:
# dpkg -i grub-common*.deb
# dpkg -i grub-pc*.deb
Pobieramy najnowszy mikokod: http://downloadcenter.intel.com/confirm.aspx?httpDown=http://downloadmirror.intel.com/19611/eng/microcode-20101123.tgz.
Zwartość rozpakowujemy do katalogu /boot/mcu.
Teraz, aby załadować sprawdzić aktualny microkod należy w prompcie gruba wykonać:
mcu_status /boot/mcu/
Aby załadować nowy mikokod:
mcu_load /boot/mcu/
Całość można zautomatyzować, tworząc plik /etc/grub.d/01_mcu z następującą zawartością:
cat << EOF
mcu_load /boot/mcu/
EOF
Należy pamiętać, aby nadać atrybut wykonywalności stworzonemu plikowi! Teraz, po wykonaniu grub-update aktualizacja mikokodu będzie ładowana zaraz po starcie gruba.
Jeszcze jedna uwaga. Plik z microkodem jest dość duży, bo zawiera uaktualnienie dla wszystkich mikroprocesorów. Aby skrócić czas wykonywania mcu_load można usunąć z pliku zbędne dane. Komenda /etc/init.d/microcode.ctl (pakiet microcode.ctl) generuje do /var/log/kern.log następujące informacje:
[ 18.517768] microcode: CPU0 sig=0x106c2, pf=0x4, revision=0x218
[ 18.517784] platform microcode: firmware: requesting intel-ucode/06-1c-02
Interesuje nas ciągi sprefiksowane przez sig=, pf= i revision=, który składamy do ciągu M04106C2218 (M-pf(2)-sig(5)-revision(3), w nawiasach liczba cyfr, jak brakuje należy wypełnić zerami po lewej stronie). Ciąg wyszukujemy w pliku z mikrokodem i zostawiamy tylko blok poprzedzony tylko tym ciągiem, tj,:
/* M04106C2218.inc */
0x00000001, 0x00000218, 0x04102009, 0x000106c2,
0x8fb7c1ba, 0x00000001, 0x00000004, 0x000013d0,
0x00001400, 0x00000000, 0x00000000, 0x00000000,
....
Pozostawienie tylko tego bloku znacznie skraca aktualizację mikrokodu.