POSIX-UEFI

Fórumok

A POSIX-UEFI egy minimális (~132K a forrás), ANSI C keretrendszer, ami kényelmesebbé és egyszerűvé teszi az UEFI alkalmazások fejlesztését Linux alatt. Szabad és Nyílt Forráskódú, a licensze MIT, így akár kereskedelmi termékekben is használható.

https://gitlab.com/bztsrc/posix-uefi

Kettős célja van:

- egyrészről biztosít egy fordítókörnyezetet (GNU/make Makefile), ami lehetővé teszi az UEFI alkalmazások fordítását POSIX kompatíbilis oprendszerek alatt (nincs szükség a bloated EDKII-re)

- másrészről szállít egy függvénykönyvtárat, ami biztosítja, hogy az UEFI alkalmazásodban szabványos POSIX libc hívásokat használhass UTF-8 sztringekkel (úm. fopen, fprintf, rmdir, malloc, setjmp/longjmp stb.)

- a függvénykönyvtár mellé jár egy C header fájl is, ami a libc definíciókon és prototípusokon túl az összes fontosabb UEFI definíciót is tartalmazza, de az ANSI C szabvány nevezéktan szabályainak megfelelően (pl. WCHAR helyett wchar_t, vagy EFI_BOOT_SERVICES helyett efi_boot_services_t a típus), ezért semmilyen további headerre nincs szükség.

- bónuszként jár hozzá pár függőség nélküli parancssoros segéd, amikkel UEFI szabványos ROM képek vagy GPT+ESP lemezképek állíthatók elő a lefordított programodból. Persze ezek nékül is használható, ezek csak grátisz toolok.

A Makefile úgy lett megírva, hogy autodetektálja a fordítót (Clang és host native gcc is támogatott), és hogy kell-e keresztfordítani, valamint tartalmazza a szükséges linker scripteket is (x86_64 és AArch64 platformok támogatottak, RISC-V experimental státuszú, új architektúra bármikor különösebb módosítás nélkül, egyszerűen hozzáadható). A függvénykönyvtár minimális (lefordítva pár Kb csak), nem teljes libc, inkább csak egy wrapper az UEFI GUID-es interfésze fölé. A repóban található jópár példaprogram, olyanok mint könyvtár listázása; diszkek alacsony, szektor szintű elérése; PNG kép megjelenítése GOP framebufferen; vagy éppen egy ELF bináris futtatása a boot környezet hátrahagyásával.

Ha valakinek kapóra jön (mert tudomisén épp rootkitet hegeszt a szabadidejében suttyomban :-) ), az használja egészséggel!

bzt

Hozzászólások

Elvileg megy FreeBSD alatt, legalábbis van olyan felhasználóm, aki BSD-n használja. Csak figyelj rá, hogy a GNU make-el hívd, a BSD-s make-nek tök más a szintaktikája és azzal igazoltan nem fog menni. A "MAKE" környezeti változóban megadható, melyik futtathatót használja (ez azért érdekes, mert a Makefile rekurzívan meghívhatja a make-et a lib lefordítására).

Nem is tudtam, hogy valaki foglalkozik innen ilyesmivel. Valójában ezt nem lenne hülyeség beemelni egy újabb POSIX verzióba, mert ugyebár lassan már minden modern rendszer UEFI-s. 32 bites UEFI-vel hogy áll (néhány régebbi szutyok gép használja sajnos)? Clang-gal is kompatibilis?

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

Igen, Clang-al annyira kompatíbilis, hogy az a default, és cross-compilerként egyből PE-t fordíttat vele. gcc esetén kicsit macerásabb a dolog, ott először egy shared libet generál (relokálható PIC címzések miatt kell így), majd azt konvertálja objconv-al PE-vé. (Az EFI futtathatók sima mezei Microsoft PE futtathatók, mint bármelyik Windows bináris, mindössze egyetlen bájt a különbség a fejlécben).

32 bitet nem támogat. Úgy voltam vele, hogy a 32 bit proci már évtizedek óta obsolete, meg évekkel ezelőtt már az EFI 32 bit is hivatalosan annak lett nyilvánítva, szóval így egyszerűen nem éri meg emiatt túlbonyolítani. Az egyszerűség miatt lett 64 bit only. (ARM-on meg ha jól tudom, sosem létezett hivatalos AArch32 EFI, csakis AArch64 EFI. Bár ebben nem vagyok 100%-ig biztos, csak abban, hogy rákeresve nem találtam ilyen hw-t)