Pag-edit ng uefi mula sa windows 7. Paano hindi ito gagawin. Mga Kapaki-pakinabang na Tampok ng UEFI

  • Pagtuturo

Pinapangako ko mabilis na gabay". Heto na:

  1. Gumawa ng GPT partition table sa disk
  2. Gumawa ng FAT32 partition ng ilang daang megabytes
  3. Mag-download ng anumang UEFI bootloader mula sa Internet
    (kailangan natin ang bootloader mismo, isa itong binary file!)
  4. Palitan ang pangalan at ilagay ang file na ito sa ginawang partition sa /EFI/Boot/bootx64.efi
  5. Gumawa kami ng text config, ilagay ito kung saan inaasahan ng bootloader na makita ito
    (ang pagsasaayos at lokasyon ng config ay nakasalalay sa tiyak na pagpapatupad ng bootloader, ang impormasyong ito ay magagamit sa Internet)
  6. Pagkatapos ng pag-reboot, makikita natin ang menu ng bootloader
    (Kung ang Windows 8 o 10 ay naka-install sa disk, ang gabay na ito ay malamang na nabawasan sa mga punto 3 - 5.)

TL;DR hindi mo kailangang tukuyin ang path sa bootloader sa mga bagong UEFI boot records - kailangan mong ilagay ang bootloader file kasama ang standard na "default path", kung saan makikita ito ng UEFI, at sa halip na bootloader menu ng UEFI gamitin ang bootloader menu, na mas madali at mas ligtas na i-configure

Ano ang hindi dapat gawin

Mayroong, sa katunayan, ilang mga paraan upang i-configure ang UEFI boot. Magsisimula ako sa pamamagitan ng paglalarawan ng iba pang mga opsyon - upang malinaw kung paano (at bakit) hindi ito gagawin. Kung dumating ka para sa patnubay, mag-scroll sa pinakaibaba.

Hindi na kailangang pumunta sa NVRAM at pindutin ang mga efivar

Ang pinaka "popular" na pamamaraan para sa pag-install ng boot loader sa isang system ay ang mga sumusunod: ang OS installer ay lumilikha espesyal na seksyon, dito ay ang istraktura ng direktoryo at inilalagay ang mga file ng bootloader. Pagkatapos nito, gamit ang isang espesyal na utility (efibootmgr sa Linux, bcdedit sa Windows), nakikipag-ugnayan ito sa firmware ng UEFI chip, na nagdaragdag ng boot record dito. Tinukoy ng entry na ito ang path sa bootloader file (simula sa root file system) at, kung kinakailangan, mga parameter. Pagkatapos nito, ang opsyon na i-load ang OS ay lilitaw sa boot menu ng computer. Para sa Linux, posible na gawin nang walang bootloader sa kabuuan. SA boot entry ang landas nang direkta sa kernel ay ipinahiwatig kasama ang lahat ng mga parameter. Ang kernel ay dapat isama sa opsyon na EFISTUB (na matagal nang naging pamantayan para sa karamihan ng mga distribusyon), kung saan naglalaman ito ng header na "EFI executable", na nagpapahintulot sa firmware na patakbuhin ito nang walang panlabas na boot loader.


Kapag nagsimula ang system, kapag pinili ng user ang boot entry na kailangan niya, UEFI firmware una ay naghahanap ito ng isang espesyal na partisyon ng EFI sa disk na nakarehistro sa entry na ito, ina-access ang file system sa partisyon na ito (kinakailangan ang FAT o FAT32), at inilulunsad ang bootloader. Binabasa ng bootloader ang config nito mula sa file ng mga setting at nilo-load ang OS o nagbibigay boot menu. Wala kang napapansin? Oo, mayroon kaming dalawang boot menu - isa sa UEFI chip firmware level, ang isa sa bootloader level. Sa katotohanan, maaaring hindi alam ng mga gumagamit ang pagkakaroon ng pangalawa - kung mayroon lamang isang item sa menu, Windows boot loader magsisimula itong i-load nang walang anumang tanong. Maaari mong makita ang screen gamit ang menu na ito kung ilalagay mo ang pangalawa kopya ng Windows o muling i-install ito nang baluktot.


Karaniwan, upang pamahalaan ang mga rekord ng boot, iminumungkahi ng mga manual sa Internet na makipag-ugnayan sa firmware ng UEFI. Mayroong kasing dami ng limang pangunahing opsyon kung paano ito gagawin: efibootmgr sa ilalim ng Linux, bcdedit sa Windows, ilang uri ng software sa mga Mac, ang bcfg na utos ng uefi shell utility (tumatakbo mula sa ilalim ng UEFI, "sa bare metal" at walang isang OS, dahil pinagsama-sama sa napakaespesyal na format na iyon) at para sa partikular na mataas na kalidad na firmware - graphic na paraan UEFI (pagsasalita tanyag na wika, "V Mga setting ng BIOS").


Para sa lahat ng "multi-book" na nakasulat sa itaas, madali mong makaligtaan ang ideyang ito: ang gumagamit, upang baguhin ang mga setting ng bahagi ng software (halimbawa, magdagdag ng isang parameter ng pagsisimula ng OS), ay napipilitang muling isulat ang flash memory ng ang chip sa board. Mayroon bang anumang mga pitfalls dito? Ay oo! Minsan ang Windows ay may kakayahang gumawa ng isang brick mula sa isang laptop, at Linux din, at sa iba't ibang paraan. Ang kalidad ng firmware ay madalas na nag-iiwan ng maraming bagay na naisin - ang mga pamantayan ng UEFI ay ipinapatupad nang baluktot o hindi ipinatupad. Sa lohikal na paraan, ang firmware ay dapat makaligtas sa kumpletong pagtanggal ng lahat ng mga variable ng efivars nang walang mga kahihinatnan, hindi mag-imbak ng kritikal na data sa mga ito, at independiyenteng ibalik ang mga default na halaga - dahil lamang ang user ay may access sa mga ito, at ang posibilidad ng mga ito kumpletong pagtanggal malayo sa zero. Sa proseso ng pag-eksperimento, paulit-ulit kong personal (sa kabutihang palad, baligtarin) ang aking Lenovo - nawala ang lahat ng mga item mula sa menu ng boot, kabilang ang pagpipiliang "pumunta sa mga setting".


Ang pagtatrabaho sa UEFI boot records ay hindi rin madali. Halimbawa, ang efibootmgr utility ay walang opsyong "i-edit". umiiral na entry". Kung gusto mong baguhin ng kaunti ang isang kernel parameter, tatanggalin mo ang buong entry at idagdag itong muli, nabago na. Sa kasong ito, ang linya naglalaman ng doble at single quotes, pati na rin ang mga forward at backslash sa isang hindi partikular na malinaw na pagkakasunud-sunod. Nang sa wakas ay nakuha ko na ang magic na ito, nai-save ko ito sa anyo ng mga script ng bash, na nananatili pa rin sa aking root file system:


efibootmgr -c -L "Archlinux (debug)" -l "\EFI\archlinux\vmlinuz-linux" -u "root=/dev/mapper/vg1-lvroot rw initrd=\EFI\archlinux\initramfs-linux.img systemd .log_level=debug systemd.log_target=kmsg log_buf_len=1M na nagpapatupad=0"

Hindi na kailangang gumamit ng GRUB

Ito ay isang mapahamak na mastodon, 90% ng pag-andar nito ay inilaan para sa mga MBR drive. Upang i-configure, kailangan mong i-edit ang isang bilang ng mga file, at pagkatapos ay patakbuhin ang config generation command. Ang resulta ay isang malaking sheet na hindi maintindihan ng isang normal na tao. Naglalaman ito ng isang bundok ng mga executable na file. Ito ay itinakda ng isang utos na hindi mo basta-basta maalis sa iyong ulo - dapat mong tingnan ang dokumentasyon


grub-install --target=x86_64-efi --efi-directory=esp_mount --bootloader-id=grub

Para sa paghahambing, ang pinakasimpleng UEFI-bootloader, na bahagi ng systemd package, ay naka-install gamit ang command


bootctl install --path=/boot

Ang utos na ito ay gumagawa ng eksaktong dalawang bagay: mga kopya maipapatupad na file bootloader sa EFI partition at idinagdag ang boot entry nito sa firmware. At ang config para dito ay eksaktong PITONG linya.

"Ang Maikling Gabay" - kaunti pang detalye

Ang boot menu ay dapat ipatupad sa antas ng bootloader- mas madali at mas ligtas ang pag-edit ng mga text config.


Hindi namin kailangan ng boot record - ang katotohanan ay kapag itinakda sa mga setting boot ng BIOS mula sa disk, ang UEFI firmware ay unang naghahanap ng isang EFI partition dito, at pagkatapos ay sinusubukang isagawa ang file ayon sa mahigpit nakapirming address sa partisyon na ito: /EFI/Boot/BOOTX64.EFI


Ano ang isang "EFI partition"? Sa teorya, dapat itong isang espesyal na uri ng "EFI System" (ef00). Sa pagsasanay, Ang unang partition sa isang GPT disk na naka-format sa FAT32 at may sapat na espasyo ay angkop upang ilagay ang bootloader at mga sumusuportang file (kung mayroon man).


Point 3: "Mag-download ng anumang UEFI bootloader mula sa Internet". Ano ang ibig sabihin nito? Ang bootloader ay isang executable na file ng isang partikular na format, kung saan kasama config. Halimbawa, kung mayroon kang nasa kamay naka-install na pakete na may systemd - ang bootloader file ay matatagpuan sa /usr/lib/systemd/boot/efi/systemd-bootx64.efi, pinalitan ng pangalan sa bootx64.efi at kinopya sa /EFI/Boot/ sa EFI partition. Walang systemd sa kamay? I-download ang archive mula sa website ng Archlinux. O mula sa imbakan ng Ubuntu. O si Debian. Mayroon ka bang Windows system sa kamay? Kunin ang Windows bootloader mula doon, gagana rin ito)) Kung mai-set up mo ito, sa totoo lang hindi ko pa ito sinubukan.


Point 4: "I-set up ang config". Gaya ng regular na programa Kapag nagsimula ang bootloader, inaasahan nitong makahanap ng mga configuration file sa ilang partikular na landas. Ang impormasyong ito ay kadalasang madaling mahanap sa Internet. Para sa systemd-boot boot loader, kailangan naming lumikha ng isang "loader" na direktoryo sa ugat ng EFI partition, at sa loob nito ay isang "loader.conf" na file na may tatlong linya (ibibigay ko ang sarili ko):


default na archlinux timeout 10 editor 1

Ang parameter ng editor ay responsable para sa kakayahang i-edit ang item ng boot menu bago magsimula.


Sa tabi ng loader.conf kailangan mong lumikha ng isang direktoryo ng mga entry - isang file sa loob nito ang magiging responsable para sa isang boot entry sa boot menu. Mayroon akong isang arch.conf file doon na may sumusunod na nilalaman:


pamagat Arch Linux linux /efi/archlinux/vmlinuz-linux initrd /efi/archlinux/initramfs-linux.img options root=/dev/mapper/vg1-lvroot rw initrd=\EFI\archlinux\intel-ucode.img

Hindi ko ito binanggit, ngunit ito ay medyo halata - ang kernel at initramfs ay dapat na nasa parehong file system bilang bootloader, iyon ay, sa EFI partition. Ang mga landas patungo sa kanila sa mga config ay binibilang mula sa ugat ng file system na ito.

Iba pang mga bootloader

Ang systemd-boot ay napaka-simple at nagbibigay ng isang spartan na mukhang black and white na menu. Mayroong mas magagandang pagpipilian kung ang kaluluwa ay humingi ng kagandahan.


Ang rEFind ay isang napakagandang downloader. ay matatagpuan dito bilang isang deb package. Ginagamit ko ito sa aking laptop. Maaaring awtomatikong lumikha ng boot menu, nang walang config - sa pamamagitan lamang ng pag-scan ng mga file.

bootloader Magdagdag ng mga tag

  • System Programming
    • Pagtuturo

    Nagtatago sa likod ng semi-mythical na "security" at "protection" simpleng user mula sa bootkits” Ang mga tagagawa ng UEFI ay lalong humihigpit sa mga turnilyo sa bawat bagong henerasyon ng kanilang mga produkto. Kasabay nito, ang suporta para sa mga nakaraang henerasyon ay mabilis na nawawala, at ang kanilang mga gumagamit ay walang pagpipilian kundi ang kunin ang mismong suportang ito sa kanilang sariling mga kamay. Siyempre, sa kawalan ng source code medyo mahirap gumawa ng anumang mga pagbabago, ngunit kahit na wala ito marami kang magagawa.
    Sa tungkol sa UEFI, binalak kong ilarawan ang iba't ibang kapaki-pakinabang na mga pagbabago, na nakakatulong na malampasan ang ilan sa mga limitasyong itinakda ng mga tagagawa, ngunit pagkatapos ay hindi nila ito nagawa, ngunit ngayon na ang oras.
    Sa unang bahagi ng artikulong ito, ilalarawan ko ang pagtatrabaho sa isang tool na isinulat ko para sa pagbabago ng mga imahe ng UEFI, at ang pangalawa ay ilalaan sa mga pagbabago mismo.

    Panimula, disclaimer

    Naka-on ang firmware ng UEFI BIOS modernong mga board, sa kabila ng pagkakaroon ng iba't ibang teknolohiya tulad ng USB BIOS Flash pabalik, Dual BIOS, Flash Recovery, atbp. - lotto pa rin. Ang firmware ng binagong mga imahe ay dobleng lottery.
    Iyon ang dahilan kung bakit hinihiling ko sa iyo na gawin ito gamit ang isang hardware SPI programmer bago simulan ang anumang mga eksperimento sa firmware buong dump mga nilalaman ng chip, kung hindi man ay pagbawi pagkatapos hindi matagumpay na firmware(at ito ay mangyayari maaga o huli) ay magiging mahaba, mahal at masakit.
    SPI programmer sa sa sandaling ito ay maaaring tipunin sa bahay mula sa anumang bagay mula sa isang pares ng resistors at capacitors (SPIPGM) hanggang sa Arduino o Raspberry Pi. Ang aking bersyon ng isang mura at mabilis na SPI programmer ay inilarawan. Pinapayuhan ko ang mga gustong mag-ukit ng ilang mga board na bigyang-pansin ang proyektong ito, at para sa mga tagahanga ng mga all-in-one na device - sa isang ito.
    Dagdag pa sa teksto, ipinapalagay ko na mayroon kang isang programmer, ang kakayahang makabawi mula sa isang pagkabigo ng firmware, at isang kahandaang mag-eksperimento. Siyempre, ang mga kanta ay maaari ding kantahin sa kabaliwan ng matapang, ngunit huwag sabihin sa ibang pagkakataon na hindi kita binalaan.
    Ayon sa kaugalian, lahat ng iyong babasahin dito ay isinulat para sa mga layuning pang-edukasyon, ang may-akda ay hindi mananagot para sa posibleng pinsala sa iyong kagamitan, pagkawala ng kita, pagkawala ng oras at pananampalataya sa sangkatauhan, ginagamit mo ang ibinigay na software sa iyong sariling peligro at panganib , at iba pa.

    UEFITool

    Pagod na sa mga limitasyon ng umiiral na mga utility para sa pagtatrabaho sa mga imahe ng UEFI (well, natamaan sa core ng NIH syndrome), nagsulat ako ng isang cross-platform utility na may bukas source code- UEFITool.
    Ito ay isang UEFI image editor, nakasulat sa C++\Qt, na ipinamahagi sa ilalim ng lisensya ng BSD, handa na mga asamblea ay naka-post dito.
    Ang proyekto ay nasa ilalim ng aktibong pag-unlad, kaya ang code ay hindi masyadong maganda at may mga bug. Kung bigla kang makatagpo, matutuwa akong marinig ang iyong mga ulat.
    Para sa normal na operasyon kasama ang utility, sulit na basahin ang mga nakaraang artikulo tungkol sa istraktura ng imahe ng UEFI, kung hindi man ay hindi malinaw kung ano ang nangyayari, ngunit susubukan ko pa ring ipaliwanag ang ilang mga punto. Ipagpalagay namin na ito ay isang paghahanda para sa hinaharap na dokumentasyon.
    Bilang mga halimbawa sa parehong bahagi ng artikulo ay gagamit ako ng mga buong dump mula sa Zotac Z77-ITX WiFi (AMI Aptio4) at Dell Vostro 3360 (Phoenix SCT 2.3). Sa kasamaang palad wala ako test bench sa platform ng Insyde H2O, kaya wala akong gaanong masasabi tungkol dito. Marahil ang Falseclock ay may kaunti pang nalalaman tungkol sa kanila.
    Mula sa punto ng view ng UEFITool, ang mga pagkakaiba sa pagitan ng mga imahe ng UEFI iba't ibang mga tagagawa halos wala, kaya tututukan ko ito kapag inilalarawan ang mga patch.
    Kaya, ilunsad ang UEFITool, buksan ang imahe (Ctrl+O) at makakita ng ganito:

    Ang istraktura ay ipinapakita sa kaliwang bahagi ng window bukas na imahe sa anyo ng isang puno, sa kanan - impormasyon tungkol sa napiling elemento ng puno, sa ibaba - mga mensahe na nagpapahiwatig ng mga error sa format ng file, sa sa kasong ito- paggamit ng mga developer ng Phoenix ng mga seksyon na may uri na 0xF0, ang layunin nito ay hindi inilarawan sa detalye ng UEFI PI. Double-click batay sa mensahe, ay palawakin ang puno upang ang mismong elemento na naging sanhi ng mensaheng ito o ang pangunahing elemento nito ay makikita. Ang mga resulta ng paghahanap ay ipinapakita sa parehong window, na maaaring tawagan sa pamamagitan ng pagpindot sa Ctrl+F (parehong mga opsyon na may isang larawan):


    Dito dapat nating linawin ng kaunti ang terminolohiya. Halos lahat mga elemento ng istruktura sa isang imahe ng UEFI mayroon silang isang header, na nag-iimbak ng data ng serbisyo tulad ng GUID, mga katangian, mga checksum, atbp., at isang katawan, na nag-iimbak ng aktwal na data. Ang teksto sa mga header ay hindi naka-imbak, kaya ang gayong pagpipilian ay hindi kailangan para dito.
    Sa unang antas ng puno mayroong mga rehiyon ng Flash, sa kasong ito ang mga ito ay Descriptor, ME at BIOS:


    Kapag pumili ka ng isang rehiyon ng Descriptor, maaari mong malaman ang mga setting ng pag-access para sa mga rehiyon sa kasong ito, ganap na pag-access, ngunit ang mga naturang setting ay napakabihirang. Inirerekomenda ng Intel na harangan ng mga tagagawa ng kagamitan ang pag-access sa rehiyon ng ME para sa pagbabasa/pagsulat at sa rehiyon ng Descriptor para sa pagsusulat, kaya naman sa karamihan ng mga board ay halos imposibleng gumawa ng buong dump nang walang "pagsasayaw gamit ang tamburin" gamit ang mga built-in na tool. Kapag pinili mo ang rehiyon ng ME, maaari mong malaman ang bersyon ng firmware ng ME, ngunit kung hindi ito ipinapakita, hindi ito mabuti at mas mahusay na huwag tumahi ng gayong imahe.
    Bumaba tayo sa isang antas, sa mga nilalaman ng rehiyon ng BIOS:


    Sa antas na ito, dalawang uri ng mga elemento ang matatagpuan: mga volume at libreng lugar. Libre sa kasong ito ay hindi kinakailangang walang laman, halimbawa, sa larawang ito sa pinakadulo simula ng Padding ang EC firmware ay naka-imbak.
    Ang mga volume ay nahahati sa ordinaryo (alam ang format ng file system), boot (kilala ang format ng FS, naglalaman ang mga ito ng Security Core, dapat itong baguhin nang may matinding pag-iingat) at hindi alam (alinman sa format ng FS ay hindi alam, o ang pag-parse ay hindi pa ipinatupad). Sa aming kaso, ang unang volume pagkatapos libreng espasyo sa simula - isang regular, pagkatapos ay dalawang hindi alam (sa katunayan, ang una ay nag-iimbak ng NVRAM, at ang pangalawa ay nag-iimbak ng mga susi at database para sa SecureBoot, ngunit hindi ko pa ito ipinaliwanag sa programa), ang huling dami ay bootable.
    Magbukas tayo ng regular na volume sa kasong ito, nag-iimbak ito ng mga file na na-load sa yugto ng DXE.


    Ang istraktura na ito (ang pangunahing dami sa loob ng isang naka-compress na seksyon) ay ginagamit nang madalas; Mayroon ding isang pagpipilian upang i-compress hindi ang buong volume, ngunit ang bawat file nang hiwalay - ito ay medyo hindi gaanong matipid sa mga tuntunin ng espasyo, ngunit ang naturang UEFI ay magsisimula Mas mabilis ang BIOS, dahil walang kwenta ang pag-unpack ng mga file na hindi pa na-access.
    Ngayon tingnan natin ang loob ng file:


    Ang lahat ng data dito ay naka-imbak sa loob ng isang GUID-defined na seksyon (ang header ng naturang mga seksyon ay karaniwang nag-iimbak ng isang digital signature o isang checksum, sa kasong ito - 4 bytes, katulad ng isang CS, na, gayunpaman, walang sinuman ang nagsusuri), at nahahati sa 4 na seksyon: larawan PE32 - ang aktwal na maipapatupad na file sa PE/COFF na format, ang seksyong dependency ng DXE - tinutukoy ang pagkakasunud-sunod kung saan na-load ang mga driver ng DXE, ang seksyon ng UI - iniimbak nito ang tekstong "SystemCapsuleRt.efi" sa Unicode na format at isang hindi kilalang seksyon tulad ng 0xF0 (malamang, ang mga nilalaman nito ay kahit papaano Ito ay nauugnay sa paraang ito sa nabanggit na CS).
    Ang lahat ng ito ay mabuti, siyempre, ngunit ang pag-edit ay hindi pa nakikita. Walang problema, tumawag para sa anumang elemento menu ng konteksto, na nagpapakita kung ano ang maaaring gawin sa elementong ito.


    At maaari mong gawin ang sumusunod:

    • i-save ang elemento sa isang file nang buo (Extract as is) o ang data lang, nang walang mga header (Extract body)
    • muling itayo ang elemento (Muling itayo), sa kasong ito, habang sine-save ang binagong imahe para dito (at lahat ng nito mga elemento ng magulang) ang mga sukat ay muling kalkulahin, mga checksum, naitama ang pagkakahanay, ibig sabihin. ang istraktura ng imahe ay dadalhin sa pagsunod sa detalye ng UEFI PI
    • magpasok ng isang elemento mula sa file, alinman bago ang napili (Ipasok bago), o pagkatapos (Ipasok pagkatapos), o sa loob nito (Ipasok sa, sa kasong ito ay walang maipasok sa loob ng seksyon ng PE32)
    • palitan ang isang elemento ng isa pang elemento mula sa file, alinman sa kabuuan (Palitan kung ano) o katawan lang nito (Palitan ang katawan)
    Ang huling aksyon ay ang pinakakapaki-pakinabang dahil... nagbibigay-daan sa iyo na baguhin ang anumang bahagi ng UEFI nang hindi naaapektuhan ang istraktura ng buong imahe.

    Halimbawa ng paggamit

    Kumuha tayo ng isang halimbawa ng pagbabago na kapaki-pakinabang para sa mga gumagamit ng MacOS X sa mga PC: pag-bypass sa setting ng LOCK bit (0x0F) sa MSR_PMG_CST_CONFIG_CONTROL (0xE2) na rehistro. Ang bit na ito ay itinakda ng PowerManagement DXE driver upang pigilan ang OS na pamahalaan ang CPU multiplier sa pamamagitan ng pagsulat sa rehistrong ito. Para sa Windows at Linux ito ay hindi malaking problema, ngunit hindi maaaring tiisin ng MacOS X ang gayong kawalang-galang mula sa UEFI. Maaari mong, siyempre, i-patch ang driver ng AICPM.kext (sa 10.8) o ang kernel (sa 10.9), ngunit mas mahusay na i-patch ang driver ng DXE at huwag matakot na ang susunod awtomatikong pag-update masisira ang download. Ang patch na ito ay kailangan lamang para sa mga system na nakabatay sa Mga processor ng Intel SandyBridge, IvyBridge at Haswell at ang kanilang mga *-E na variant at ginagawa ito ng ganito:


    Pina-flash namin ang nagresultang imahe gamit ang parehong SPI programmer na ginamit upang gawin ito, at hindi kami nakakakuha ng kernel panic kapag naglo-load ng MacOS X.

    Mga detalye, iba pang mga pagbabago, konklusyon

    Kung nagtataka ka kung saan nagmula ang magic pattern na "75080FBAE80F" at kung ano ang iba pang mga patch na dapat bigyang pansin, basahin ang pangalawang bahagi ng artikulong ito, na mai-publish sa ibang pagkakataon. Sa loob nito ay susubukan kong maghanda higit pang mga halimbawa sa format na "anong uri ng pagbabago ito, bakit ito kailangan, kung paano ito gagawin, kung kanino at paano ito natagpuan", nang hindi malalim sa bawat oras sa eksaktong paraan kung paano alisin ang elementong babaguhin at kung paano ito ipasok pabalik.
    Umaasa ako na ang artikulo ay hindi mukhang masyadong boring at nakakapagod. Kung mayroon kang mga katanungan o mungkahi, ikalulugod kong makinig at sumagot sa abot ng aking makakaya. Lalo akong magpapasalamat para sa mga ulat ng bug. Salamat nang maaga at good luck sa firmware.

    P.S. Minamahal na administrasyon at UFO personal, mangyaring gumawa ng UEFI hub para sa mga post na tulad nito.

    • Pagtuturo

    Nagtatago sa likod ng semi-mythical na "seguridad" at "pagprotekta sa karaniwang gumagamit mula sa mga bootkit," ang mga manufacturer ng UEFI ay lalong humihigpit sa mga turnilyo sa bawat bagong henerasyon ng kanilang mga produkto. Kasabay nito, ang suporta para sa mga nakaraang henerasyon ay mabilis na nawawala, at ang kanilang mga gumagamit ay walang pagpipilian kundi ang kunin ang parehong suporta sa kanilang sariling mga kamay. Siyempre, sa kawalan ng source code medyo mahirap gumawa ng anumang mga pagbabago, ngunit kahit na wala ito marami kang magagawa.
    Sa aking mga nauna tungkol sa UEFI, pinlano kong ilarawan ang iba't ibang mga kapaki-pakinabang na pagbabago na makakatulong sa pagtagumpayan ang ilan sa mga limitasyon na ipinataw ng mga tagagawa, ngunit pagkatapos ay hindi ako nakalapit sa kanila, ngunit ngayon na ang oras.
    Sa unang bahagi ng artikulong ito, ilalarawan ko ang pagtatrabaho sa isang tool na isinulat ko para sa pagbabago ng mga imahe ng UEFI, at ang pangalawa ay ilalaan sa mga pagbabago mismo.

    Panimula, disclaimer

    UEFI BIOS firmware sa mga modernong board, sa kabila ng pagkakaroon ng iba't ibang mga teknolohiya tulad ng USB BIOS Flashback, Dual BIOS, Flash Recovery, atbp. - lotto pa rin. Ang firmware ng binagong mga imahe ay dobleng lottery.
    Iyon ang dahilan kung bakit hinihiling ko na bago simulan ang anumang mga eksperimento sa firmware, gumamit ng isang hardware SPI programmer upang makagawa ng isang kumpletong pag-dump ng mga nilalaman ng chip, kung hindi man ang pagbawi mula sa hindi matagumpay na firmware (at ito ay mangyayari maaga o huli) ay magiging mahaba, mahal at masakit.
    Ang isang SPI programmer ay kasalukuyang maaaring tipunin sa bahay mula sa anumang bagay mula sa isang pares ng resistors at capacitors (SPIPGM) hanggang sa isang Arduino o Raspberry Pi. Ang aking bersyon ng isang mura at mabilis na SPI programmer ay inilarawan. Pinapayuhan ko ang mga gustong mag-ukit ng ilang mga board na bigyang-pansin ang proyektong ito, at para sa mga tagahanga ng mga all-in-one na device - sa isang ito.
    Dagdag pa sa teksto, ipinapalagay ko na mayroon kang isang programmer, ang kakayahang makabawi mula sa isang pagkabigo ng firmware, at isang kahandaang mag-eksperimento. Siyempre, ang mga kanta ay maaari ding kantahin sa kabaliwan ng matapang, ngunit huwag sabihin sa ibang pagkakataon na hindi kita binalaan.
    Ayon sa kaugalian, lahat ng iyong babasahin dito ay isinulat para sa mga layuning pang-edukasyon, ang may-akda ay hindi mananagot para sa posibleng pinsala sa iyong kagamitan, pagkawala ng kita, pagkawala ng oras at pananampalataya sa sangkatauhan, ginagamit mo ang ibinigay na software sa iyong sariling peligro at panganib , at iba pa.

    UEFITool

    Pagod na sa mga limitasyon ng umiiral na mga utility para sa pagtatrabaho sa mga imahe ng UEFI (well, natamaan sa core ng NIH syndrome), nagsulat ako ng isang cross-platform na open source na utility - UEFITool.
    Ito ay isang UEFI image editor, nakasulat sa C++\Qt, ipinamahagi sa ilalim ng lisensya ng BSD, ang mga natapos na assemblies ay naka-post dito.
    Ang proyekto ay nasa ilalim ng aktibong pag-unlad, kaya ang code ay hindi masyadong maganda at may mga bug. Kung bigla kang makatagpo, matutuwa akong marinig ang iyong mga ulat.
    Upang gumana nang normal sa utility, dapat mong basahin ang mga nakaraang artikulo tungkol sa istraktura ng imahe ng UEFI, kung hindi man ay hindi malinaw kung ano ang nangyayari, ngunit susubukan ko pa ring ipaliwanag ang ilang mga punto. Ipagpalagay namin na ito ay isang paghahanda para sa hinaharap na dokumentasyon.
    Bilang mga halimbawa sa parehong bahagi ng artikulo, gagamit ako ng mga buong dump mula sa Zotac Z77-ITX WiFi (AMI Aptio4) at Dell Vostro 3360 (Phoenix SCT 2.3). Sa kasamaang palad, wala akong test bench sa Insyde H2O platform, kaya wala akong masasabi tungkol dito. Marahil ay may nalalaman pa tungkol sa kanila.
    Mula sa punto ng view ng UEFITool, halos walang pagkakaiba sa pagitan ng mga imahe ng UEFI mula sa iba't ibang mga tagagawa, kaya tututukan ko ito kapag inilalarawan ang mga patch.
    Kaya, ilunsad ang UEFITool, buksan ang imahe (Ctrl+O) at makakita ng ganito:

    Sa kaliwang bahagi ng window ang istraktura ng bukas na imahe ay ipinapakita sa anyo ng isang puno, sa kanan - impormasyon tungkol sa napiling elemento ng puno, sa ibaba - mga mensahe na nagpapahiwatig ng mga error sa format ng file, sa kasong ito - ang ginagamit ng mga developer ng Phoenix ng mga seksyon na may uri na 0xF0, ang layunin kung saan ay hindi inilarawan sa detalye ng UEFI P.I. Ang pag-double click sa isang mensahe ay magpapalawak sa puno upang ang alinman sa elementong naging sanhi ng mensahe o ang pangunahing elemento nito ay makikita. Ang mga resulta ng paghahanap ay ipinapakita sa parehong window, na maaaring tawagan sa pamamagitan ng pagpindot sa Ctrl+F (parehong mga opsyon na may isang larawan):


    Dito dapat nating linawin ng kaunti ang terminolohiya. Halos lahat ng elemento ng istruktura sa isang imahe ng UEFI ay may isang header, na nag-iimbak ng data ng serbisyo tulad ng GUID, mga katangian, mga checksum, atbp., at isang katawan, na nag-iimbak ng aktwal na data. Ang teksto sa mga header ay hindi nakaimbak, kaya ang pagpipiliang ito ay hindi kailangan para dito.
    Sa unang antas ng puno mayroong mga rehiyon ng Flash, sa kasong ito ang mga ito ay Descriptor, ME at BIOS:


    Kapag pumili ka ng isang rehiyon ng Descriptor, maaari mong malaman ang mga setting ng pag-access para sa mga rehiyon sa kasong ito, ganap na pag-access, ngunit ang mga naturang setting ay napakabihirang. Inirerekomenda ng Intel na harangan ng mga tagagawa ng kagamitan ang pag-access sa rehiyon ng ME para sa pagbabasa/pagsulat at sa rehiyon ng Descriptor para sa pagsusulat, kaya naman sa karamihan ng mga board ay halos imposibleng gumawa ng buong dump nang walang "pagsasayaw gamit ang tamburin" gamit ang mga built-in na tool. Kapag pinili mo ang rehiyon ng ME, maaari mong malaman ang bersyon ng firmware ng ME, ngunit kung hindi ito ipinapakita, hindi ito mabuti at mas mahusay na huwag tumahi ng gayong imahe.
    Bumaba tayo sa isang antas, sa mga nilalaman ng rehiyon ng BIOS:


    Mayroong dalawang uri ng mga item na makikita sa antas na ito: mga volume at libreng espasyo. Libre sa kasong ito ay hindi kinakailangang walang laman, halimbawa, sa larawang ito sa pinakadulo simula ng Padding ang EC firmware ay naka-imbak.
    Ang mga volume ay nahahati sa ordinaryo (alam ang format ng file system), boot (kilala ang format ng FS, naglalaman ang mga ito ng Security Core, dapat itong baguhin nang may matinding pag-iingat) at hindi alam (alinman sa format ng FS ay hindi alam, o ang pag-parse ay hindi pa ipinatupad). Sa aming kaso, ang unang volume pagkatapos ng libreng puwang sa simula ay normal, pagkatapos ay dalawang hindi kilalang mga bago (sa katunayan, ang una ay nag-iimbak ng NVRAM, at ang pangalawa ay nag-iimbak ng mga susi at isang database para sa SecureBoot, ngunit hindi ko ito ipinaliwanag. sa programa pa), ang huling volume ay bootable .
    Magbukas tayo ng regular na volume sa kasong ito, nag-iimbak ito ng mga file na na-load sa yugto ng DXE.


    Ang istraktura na ito (ang pangunahing dami sa loob ng isang naka-compress na seksyon) ay ginagamit nang madalas; Mayroong isa pang pagpipilian upang i-compress hindi ang buong volume, ngunit ang bawat file nang hiwalay - ito ay medyo hindi gaanong matipid sa mga tuntunin ng espasyo, ngunit ang UEFI BIOS na ito ay nagsisimula nang mas mabilis, dahil walang kwenta ang pag-unpack ng mga file na hindi pa na-access.
    Ngayon tingnan natin ang loob ng file:


    Ang lahat ng data dito ay naka-imbak sa loob ng isang GUID-defined na seksyon (ang header ng naturang mga seksyon ay karaniwang nag-iimbak ng isang digital signature o isang checksum, sa kasong ito - 4 bytes, katulad ng isang CS, na, gayunpaman, walang sinuman ang nagsusuri), at nahahati sa 4 na seksyon: larawan PE32 - ang aktwal na maipapatupad na file sa PE/COFF na format, ang seksyong dependency ng DXE - tinutukoy ang pagkakasunud-sunod kung saan na-load ang mga driver ng DXE, ang seksyon ng UI - iniimbak nito ang tekstong "SystemCapsuleRt.efi" sa Unicode na format at isang hindi kilalang seksyon tulad ng 0xF0 (malamang, ang mga nilalaman nito ay kahit papaano Ito ay nauugnay sa paraang ito sa nabanggit na CS).
    Ang lahat ng ito ay mabuti, siyempre, ngunit ang pag-edit ay hindi pa nakikita. Walang problema, tumawag kami ng menu ng konteksto para sa anumang elemento, na nagpapakita kung ano ang maaaring gawin sa elementong ito.


    At maaari mong gawin ang sumusunod:

    • i-save ang elemento sa isang file nang buo (Extract as is) o ang data lang, nang walang mga header (Extract body)
    • muling itayo ang elemento (Muling itayo), sa kasong ito, kapag nai-save ang binagong imahe para dito (at lahat ng mga elemento ng magulang nito), ang mga sukat at checksum ay muling kakalkulahin, ang pagkakahanay ay itatama, i.e. ang istraktura ng imahe ay dadalhin sa pagsunod sa detalye ng UEFI PI
    • magpasok ng isang elemento mula sa file, alinman bago ang napili (Ipasok bago), o pagkatapos (Ipasok pagkatapos), o sa loob nito (Ipasok sa, sa kasong ito ay walang maipasok sa loob ng seksyon ng PE32)
    • palitan ang isang elemento ng isa pang elemento mula sa file, alinman sa kabuuan (Palitan kung ano) o katawan lang nito (Palitan ang katawan)
    Ang huling aksyon ay ang pinakakapaki-pakinabang dahil... nagbibigay-daan sa iyo na baguhin ang anumang bahagi ng UEFI nang hindi naaapektuhan ang istraktura ng buong imahe.

    Halimbawa ng paggamit

    Kumuha tayo ng isang halimbawa ng pagbabago na kapaki-pakinabang para sa mga gumagamit ng MacOS X sa mga PC: pag-bypass sa setting ng LOCK bit (0x0F) sa MSR_PMG_CST_CONFIG_CONTROL (0xE2) na rehistro. Ang bit na ito ay itinakda ng PowerManagement DXE driver upang pigilan ang OS na pamahalaan ang CPU multiplier sa pamamagitan ng pagsulat sa rehistrong ito. Para sa Windows at Linux hindi ito isang malaking problema, ngunit hindi maaaring tiisin ng MacOS X ang gayong kawalang-galang mula sa UEFI. Maaari mong, siyempre, i-patch ang driver ng AICPM.kext (sa 10.8) o ang kernel (sa 10.9), ngunit mas mahusay na i-patch ang driver ng DXE at huwag matakot na ang susunod na awtomatikong pag-update ay masira ang boot. Ang patch na ito ay kailangan lamang para sa mga system na nakabatay sa Intel SandyBridge, IvyBridge at Haswell na mga processor at ang kanilang *-E na mga variant at ginagawa tulad nito:


    Pina-flash namin ang nagresultang imahe gamit ang parehong SPI programmer na ginamit para gawin ito, at hindi kami nakakakuha ng kernel panic kapag naglo-load ng MacOS X.

    Mga detalye, iba pang mga pagbabago, konklusyon

    Kung nagtataka ka kung saan nagmula ang magic pattern na "75080FBAE80F" at kung ano ang iba pang mga patch na dapat bigyang pansin, basahin ang pangalawang bahagi ng artikulong ito, na mai-publish sa ibang pagkakataon. Sa loob nito ay susubukan kong maghanda ng higit pang mga halimbawa sa format na "anong uri ng pagbabago ito, bakit kailangan ito, kung paano ito gagawin, kung kanino at paano ito natagpuan", nang hindi lumalalim sa bawat oras nang eksakto kung paano alisin ang elementong babaguhin at kung paano ipasok ito pabalik.
    Umaasa ako na ang artikulo ay hindi mukhang masyadong boring at nakakapagod. Kung mayroon kang mga katanungan o mungkahi, ikalulugod kong makinig at sumagot sa abot ng aking makakaya. Lalo akong magpapasalamat para sa mga ulat ng bug. Salamat nang maaga at good luck sa firmware.

    P.S. Minamahal na administrasyon at UFO personal, mangyaring gumawa ng UEFI hub para sa mga post na tulad nito.

    Interface sa pagitan ng operating system at mga microprogram na kumokontrol sa mababang antas ng mga function ng hardware, ang pangunahing layunin nito ay ang wastong pagsisimula ng hardware kapag ang system ay naka-on at ilipat ang kontrol sa operating system loader. Ang EFI ay inilaan upang palitan ang BIOS - isang interface na tradisyonal na ginagamit ng lahat IBM PC compatible mga personal na computer

    Ano ang ibig sabihin nito? Nangangahulugan ito na ang pamamaraang inilarawan sa Pag-install ng Ubuntu ay maaaring hindi gumana. Bukod sa, malalaking rims nangangailangan ng paggamit ng GPT (sa halip na lumang bersyon partition table sa MBR, na may disk addressable space limit na 2.2 TB = 2.2 × 10¹² bytes)

    Hindi posible na garantiya ang pagiging pandaigdigan ng mga tagubilin sa ibaba, ngunit ang may-akda ng artikulong ito ay nagbasa ng ilang mga paksa sa forum ng Ruso at Ingles at nakapag-install ng ubuntu 12.04.1 sa Lenovo B570 sa ikalawang araw. Inaasahan na ang artikulong ito ay makakatulong din sa iyo.

    Dahil ang EFI ay isang partikular na bootloader, dapat itong maiimbak sa isang lugar sa aming kaso, ang isang hiwalay na puwang ay inilalaan para dito sa hard drive na may GPT table mga seksyon. Kapag pumasa ang computer POST procedure, nakita ng BIOS ang isang partition na may naka-install na bootloader sa nakakonektang EFI media. Bilang resulta, sa BIOS mismo sa menu ng BOOT (maaaring may ibang pangalan ang sa iyo, naroon ang pagkakasunud-sunod ng boot ng mga device), lalabas ang mga distribution kit kasama ng mga device.

    paano i-install

    A. Una kailangan namin ng LiveCD (bakit LiveCD? Tingnan sa ibaba) larawan ng pag-install, kung paano nakasulat dito getting_ubuntu. Kung mayroon ka nang installation disk/flash drive, ang ibaba ay para sa iyo.

    B. Nag-boot kami, lahat ay tulad ng dati normal na pag-install→ loading_from_livecd . Pagkatapos, kung ang isang tao ay mabuti at graphic mode sa pagpili ng wika ito ay gumagana nang maayos, ang ilan ay maaaring makaranas ng isang bagay na hindi alam (ang screen ay nasa mga pixel, makikita mo kung paano gumagalaw ang laso ng pagpili upang piliin ang opsyon sa pag-download)

    P.S. //Personal, kapag naglo-load mula sa isang text alternative image, nangyari ito sa lahat ng oras, kahit sa panahon ng pagtatangka sa pag-install//

    Ang pagkakasunud-sunod ng mga inskripsiyon ay ang mga sumusunod:

    Subukan nang walang pag-install I-install Suriin ang disk para sa mga error

    Bilang resulta, piliin ang una at i-load sa graphical mode.

    C. Buksan ang application center, hanapin ang grub-pc, tanggalin ito, hanapin ang grub-efi na may kinakailangang bit depth (64 o 32) at i-install ito.
    UPD. maaari kang mag-iwan lamang ng grub-common, ang natitirang mga hornbeam ay mai-load nang mag-isa sa panahon ng pag-install (nagtrabaho ito para sa akin sa lahat ng mga ito (12.04-12.10 alpha 3), 12.10 beta 1 "imposibleng i-install ang bootloader.... ")\\ Ang opsyong ito ay hindi kailangan at maaaring makapinsala sa pag-install sa 12.04.1 at 12.10 beta 2 at mas luma.

    E. simulan ang pag-install mismo, piliin ang "iba pang pagpipilian" at manu-manong hatiin ang disk "disk_partition". Kaya ang lahat ay ayon sa plano:

    Ang unang partition na "tyk" ay boot seksyon ng efi- kung mayroon ka lamang isang sistema, 100 MiB ay sapat na. Pangalawang ext4, format, mount point "/". - Gumagawa kami ng mga systemic sa mga laki na gusto namin. Pangatlong linux-swap (swap partition) ~ RAM + ilang MiB Fourth, kahit anong FS na gusto mo (mayroon akong ext4), mount point "/home"

    Mahusay, malapit nang matapos ang komedya, sa pinakailalim ay pipiliin mo ang landas ng pag-install ng bootloader (dapat mayroong isang bagay tulad ng /dev/sda/

    piliin ang unang partition na may efi, i.e. sa aking kaso /dev/sda1/

    Nag-install kami, nag-reboot kapag tapos na, pumunta sa BIOS, naroon ang boot menu. Dapat na lumitaw ang mga bagong item na "Linux" "Ubuntu", maaaring mai-install muna ang Ubuntu

    I-download ang pamamahala ng listahan

    Ang pamamaraan ay angkop para sa pag-edit mula sa naka-install na sistema, at may LiveCD Kailangan natin ang mga sumusunod utility ng console bootmgr.

    Sudo apt-get install efibootmgr

    ang bootmgr ay pasadyang aplikasyon para sa pag-edit ng Intel Extensible Firmware Interface (EFI) Boot Manager. Pinapayagan ka nitong magdagdag, magbago at magtanggal ng mga pagpipilian sa boot.
    Pagkatapos ng pag-install, magbukas ng terminal at i-type ang:

    Sudo efibootmgr

    Ito ang ibibigay nito sa iyo (Sa aking mga komento)

    BootCurrent: 000A #currently load entry Timeout: 1 segundo #pause para ipakita ang selection menu bago mag-load sa pagkakasunud-sunod BootOrder: 000A,0002,0009,000B,0003,0004,0005,0006,0007,0008 #00don0 boot queue Setup Huwag pindutin ang tab ng BIOS transition na Boot0001 Boot Menu#Hindi rin namin ginagalaw ang menu ng pagpili. Ang BootXXXX ay mga seksyong Boot0002* USB FDD: #kami ay interesado sa mga numero, i.e. 0003, atbp. Boot0003* ATA SSD: Boot0004* ATA HDD: WDC WD5000BPVT-24HXZT3 Boot0005* ATAPI CD: TSSTcorp CDDVDW TS-L633F Boot0006* USB HDD: Kingston DT 101 G2 Boot0007*08 USB CD0: Boot0007*08 USB CD: Boot0* Windows Boot Manager Boot000A* Ubuntu Boot000B* Linux

    Tulad ng nakikita mo mula dito, mayroon akong 2 hindi kinakailangang mga entry (Windows, Linux), tingnan natin ang mga opisyal na tagubilin.
    hmm.. Wala akong naintindihan, pero pagkatapos ng kaunti pa, ito ang nakuha ko: Para tanggalin ang anumang entry, kailangan mong maglagay ng command tulad ng:

    Sudo efibootmgr --bootnum xxxx --delete-bootnum

    Pag-alis ng entry sa Windows Boot Manager

    Kung saan ang xxxx Ito ang hex number ng boot record, maaari itong paikliin, halimbawa sa aking kaso para sa i-uninstall ang Windows kailangan mong ipasok:

    Sudo efibootmgr --bootnum 9 --delete-bootnum

    Kaagad pagkatapos nito, iuulat ng console ang resulta:

    BootNext: 0009 Bootcurrent: 000a Timeout: 1 segundo Bootorder: 000a, 0002,000b, 0003,0004,0005,0006,0007,0008 Boot0000 Setup Boot0001 Boot Menu Boot0002* USB FDD: Boot0003* Ata SSD: Boot0004* Ata HDD W: DC WD5000BPVT-24HXZT3 Boot0005* ATAPI CD: TSSTcorp CDDVDW TS-L633F Boot0006* USB HDD: Kingston DT 101 G2 Boot0007* USB CD: Boot0008* PCI LAN: Realtek PXE B03 D00 Linux Boot000A*

    Pag-alis ng entry sa Linux

    Ngayon tanggalin ang Linux entry

    Sudo efibootmgr --bootnum B --delete-bootnum

    Pagkatapos ng pag-reboot makuha namin ang kagandahang ito:

    BootCurrent: 0009 Timeout: 1 segundo BootOrder: 0009,0004,0005,0008,0002,0003,0006,0007 Boot0000 Setup Boot0001 Boot Menu Boot0002* USB FDD: Boot0003* ATA ATA SSD: Boot0003* ATA Z T3 Boot0005 * ATAPI CD: TSSTcorp CDDVDW TS-L633F Boot0006* USB HDD: Boot0007* USB CD: Boot0008* PCI LAN: Realtek PXE B03 D00 Boot0009* ubuntu

    Pag-edit ng pause

    Kung kailangan mong mag-edit ng pause, gawin ang sumusunod:

    Sudo efibootmgr -t 5

    sa output:

    BootNext: 0009 BootCurrent: 000A Timeout: 5 seconds #as you can see the value has changed BootOrder: 000A,0002,000B,0003,0004,0005,0006,0007,0008 Boot0000 Boot0002 Boot0002 Boot0002 Boot0002 Boot0002 Boot0002 Boot0002 Boot0002 Boot0001 Booting ATA SSD: Boot0004 * ATA HDD: WDC WD5000BPVT-24HXZT3 Boot0005* ATAPI CD: TSSTcorp CDDVDW TS-L633F Boot0006* USB HDD: Kingston DT 101 G2 Boot0007* USB CD: Boot0008* PCIE Boot0008*

    Hindi pa tapos ang artikulong ito. Mangyaring, kung mayroon kang kaugnay na kaalaman at ilang libreng oras, subukang pagbutihin ang artikulong ito. * Dapat awtomatikong mag-install ang grub-efi, ngunit maaaring may mga glitches dito at 12.10 beta 1, hindi ko mai-install ang lahat (hindi nito mai-install ang bootloader), kaya sa pangkalahatan ay mas mahusay na i-install ito nang manu-mano sa pamamagitan ng application center *