Share
Embed
Play with UEFI
Takuya ASADA
February 16, 2013
Transcript
47 slides
-
UEFIͱԿ͔ʁ • 90ʹIntelͱHPʹΑΓ։ൃ͞ΕͨɺIA32/IA64ڞ௨ͷϒʔτγεςϜ • PCʹґવͱͯ͠ΔϨΨγʔͳΈͰ͋ΔBIOSΛஔ͖͑ • CPUඇґଘͳΞʔΩςΫνϟ • CPUඇґଘͳυϥΠό •
128partitionɾover 2TBͷσΟεΫΛαϙʔτ͢ΔGPTΛ࠾༻ • ωοτϫʔΫରԠͳͲͷଟ࠼ͳػೳʹରԠ • ϞδϡϥʔܕͷσβΠϯ • ߴىಈʹد༩ -
(U)EFIͷྺ࢙̎ • EFI specificationIntel͔ΒUnified EFI ForumҠ ˠن໊͕֨UEFIʹɾ2.xܥ͕ϦϦʔε • 2009ࠒ͔Β2TBͷน͕ࢹ͞Ε࢝ΊɺUEFIࡌPC ͕ීٴ͠͡ΊΔɾOSඪ४ରԠ
• ී௨ʹͦͷลͷϤ˓όγͰUEFIରԠػങ͑ΔΑ͏ʹˡ ΠϚίίʂ -
MBRͱ2TBͷน • MBRͷύʔςΟʔγϣϯςʔϒϧͰɺ։࢝ηΫλͱηΫλ ͕32bit(4G sectors) • 4G sectors * 512byte
= 2TB! • ύʔςΟʔγϣϯςʔϒϧม͑Δ͔ηΫλαΠζม͑Δ͔͠ͳ͍ ˠޓੑແ͘ͳΔ • όουϊϋͰճආग़དྷͳ͍͜ͱແ͍͚Ͳ… • ͏͠ΜͲ͍͠GPTΛલఏͱ͍ͯ͠ΔUEFIʹҠߦ͠Α͏Α -
MBRͱGPTͷൺֱ • MBRͰύʔςΟʔγϣϯɿ4ݸˠ128ݸ • ηΫλΞυϨεɿ32bit→64bit • ύʔςΟʔγϣϯλΠϓɿ1byte→16byte GUID • ϒʔτϑϥάɿ1byte→ଐੑϑϥάɿ8bytes
• ύʔςΟʔγϣϯ໊ɿ72bytes UTF-16 • όοΫΞοϓͷύʔςΟʔγϣϯςʔϒϧྖҬ -
UEFIͷݟͨ • ී௨ͷBIOSΈ͍ͨͳىಈը໘Ͱ͋Δࣄ͕ଟ͍ • σϑΥϧτઃఆͰOS͕ࣗಈతʹϒʔτ͞ΕΔݶΓɺಛʹBIOSϒʔ τͱͷݟ্ͨͷҧ͍ͳ͍ • ୠ͠ɺΑ͘ݟΔͱશવҧ͏ɿ • Boot
Managerͱ͍͏GRUBͷϒʔτϝχϡʔͷΑ͏ͳͷ͕͋Δ • UEFI Shellͱ͍͏ίϚϯυϓϩϯϓτͷΑ͏ͳγΣϧ͕͋Δ -
EFI SYSTEM PARTITION • ύʔςΟʔγϣϯλΠϓGUID͕EFI System Partitionͳ FATϑΝΠϧγεςϜ • GPTʹϒʔτηΫλແ͍
• ͔͜͜ΒUEFIΞϓϦέʔγϣϯΛϩʔυ͢ΔࣄʹΑΓ ىಈ -
UEFI APPLICATION • 64bit protected modeͷPEόΠφϦ ʢUEFI͕x64൛ͷ߹ʣ • ֦ுࢠɿ.EFI •
UEFI APIΛར༻֤ͯ͠छॲཧΛ࣮ -
UEFI͔Βͷϒʔτ ݫີʹͲ͏ͳ͍ͬͯΔ͔ ҎԼͷΑ͏ͳUEFI NVRAM variablesʹΑΓىಈॲཧ੍͕ޚ͞ΕΔ • Boot####ɿϩʔυ͢ΔUEFI applicationͷPATHɾ ຢσΟεΫͷσόΠεPATH •
BootOrderɿBoot####ͷࢼߦॱংʢྻͰࢦఆʣ • BootNextɿ࣍ճىಈ࣌ʹϩʔυ͢ΔBoot####ʢBootOrderΑΓ༏ ઌɺҰىಈ͢Δͱআʣ • Timeoutɿઃఆඵ͚ͩBoot MenuΛදࣔʢࣗಈىಈΛԆʣ -
/SYS/FIRMWARE/EFI/EFIVARS syuu@ubuntu:~$ ls /sys/firmware/efi/efivars Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c Boot0001-8be4df61-93ca-11d2-aa0d-00e098032b8c Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8c Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8c BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c
… $ sudo cat /sys/firmware/efi/efivars/ Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c @EFI VMware Virtual SCSI Hard Drive (0.0) ?A ? -
UEFIͷ෦ߏ PEI CPU init Chipset init Board init DXE Load
drivers %FWJDF %SJWFST Boot Manager 4FSWJDFT UEFI Apps UEFI Bootl oader UEFI APIs OS Load UEFI apps UEFI specification PI specification -
UEFIͷ෦ߏ PEI CPU init Chipset init Board init DXE Load
drivers %FWJDF %SJWFST Boot Manager 4FSWJDFT UEFI Apps UEFI Bootl oader UEFI APIs OS Load UEFI apps UEFI specification PI specification ࠓ͜͜Λݟ͍͖ͯ·͢ -
UEFI APPLICATIONͷछྨ • ೋछྨͷUEFI Application • ௨ৗͷUEFI Applicationɿऴྃ࣌ʹExit()Λίʔϧ͠ɺ UEFI ShellͳͲʹ੍ޚΛ͢
• OS Loaderɿऴྃ࣌ʹExitBootServices()Λίʔϧ͠ɺ UEFI͕ར༻͍ͯͨ͠ࢿݯΛ։์੍ͯ͠ޚΛOSҠ͢ -
MAIN() IN UEFI APPLICATION EFI_STATUS HelloMain ( IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable) ! Ҿ̎ݸʢImageHandleɺSystemTableʣ ImageHandleϩʔυ͞ΕͨUEFI ApplicationͷΠϝʔδϑΝΠϧʹର͢Δϋϯυϧ SystemTableΛܦ༝ͯ͠શͯͷUEFI APIΞΫηε -
UEFI SYSTEM TABLE UEFI Applicationʹରͯ͠ެ։͢ΔΠϯλϑΣʔε͕શͯ ٧Ίࠐ·Εͨߏମ 80 June 27, 2012
Version 2.3.1, Errata C #define EFI_2_30_SYSTEM_TABLE_REVISION ((2<<16) | (30)) #define EFI_2_20_SYSTEM_TABLE_REVISION ((2<<16) | (20)) #define EFI_2_10_SYSTEM_TABLE_REVISION ((2<<16) | (10)) #define EFI_2_00_SYSTEM_TABLE_REVISION ((2<<16) | (00)) #define EFI_1_10_SYSTEM_TABLE_REVISION ((1<<16) | (10)) #define EFI_1_02_SYSTEM_TABLE_REVISION ((1<<16) | (02)) #define EFI_SYSTEM_TABLE_REVISION EFI_2_30_SYSTEM_TABLE_REVISION #define EFI_SPECIFICATION_VERSION EFI_SYSTEM_TABLE_REVISION #define EFI_SYSTEM_TABLE_REVISION EFI_2_31_SYSTEM_TABLE_REVISION typedef struct { EFI_TABLE_HEADER Hdr; CHAR16 *FirmwareVendor; UINT32 FirmwareRevision; EFI_HANDLE ConsoleInHandle; EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn; EFI_HANDLE ConsoleOutHandle; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut; EFI System Table EFI_HANDLE StandardErrorHandle; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr; EFI_RUNTIME_SERVICES *RuntimeServices; EFI_BOOT_SERVICES *BootServices; UINTN NumberOfTableEntries; EFI_CONFIGURATION_TABLE *ConfigurationTable; } EFI_SYSTEM_TABLE; Parameters Hdr The table header for the EFI System Table. This header contains the EFI_SYSTEM_TABLE_SIGNATURE and EFI_SYSTEM_TABLE_REVISION values along with the size of the EFI_SYSTEM_TABLE structure and a 32-bit CRC to verify that the contents of the EFI System Table are valid. FirmwareVendor A pointer to a null terminated string that identifies the vendor that produces the system firmware for the platform. -
CONOUT, CONIN, STDERR #include <Library/UefiApplicationEntryPoint.h> #include <Library/UefiLib.h> EFI_STATUS EFIAPI UefiMain
(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) { SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello World\r\n"); return EFI_SUCCESS; } •ίϯιʔϧͷೖग़ྗAPI •จࣈΤϯίʔσΟϯάUTF-16Λ༻ -
RUNTIME SERVICES • ExitBootServices()ޙUEFI͕OSʹରͯ͠ఏڙ͢ΔαʔϏε • ࠷ݶͷػೳͷΈ • Time (GetTime, SetTime...)
• Virtual Memory (SetirtualAddressMap...) • Variable Services (GetVariable...) • Miscellaneous Services(ResetSystem...) -
BOOT SERVICES • ExitBootServices()·ͰUEFI Applicationʹఏڙ͢ΔαʔϏε • Task Priority Services (RaiseTPL...)
• Memory Services (AllocatePages...) • Event & Timer Services (CreateEvent, SetTimer...) • Protocol Handler Services (HandleProtocol...) • Image Services (LoadImage, StartImage...) • Miscellaneous Services (Stall, CopyMem...) • Open and Close Protocol Services (OpenProtocol...) • Library Services (LocateProtocol...) • 32bit CRC Services (CalculateCrc32...) -
ఆٛ͞Ε͍ͯΔPROTOCOL • EFI Loaded Image • Device Path Protocol •
UEFI Driver Model • Console Support • Media Access • PCI Bus Support • SCSI Driver Models and Bus Support • iSCSI Boot • USB Support • Debugger Support • Compression Algorithm • ACPI Protocols • TCP/IP, IPSec, FTP • ARP & DHCP • UDP & MTFTP • etc... -
PROTOCOLར༻ྫ #define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \ { \ 0x964e5b22, 0x6459, 0x11d2, {0x8e,
0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} \ } EFI_GUID gEfiSimpleFileSystemProtocolGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol; EFI_FILE_HANDLE Root; EFI_FILE_HANDLE CurDir; EFI_FILE_HANDLE FileHandle; CHAR16 *FileName = L”hoge.txt”; ! gBS->HandleProtocol ( DeviceHandle, &gEfiSimpleFileSystemProtocolGuid, &Vol ); ! Vol->OpenVolume (Vol, &Root); ! CurDir->Open ( CurDir, &FileHandle, FileName, EFI_FILE_MODE_READ, 0 ); •ProtocolͷHandleΛܦ༝ͯ͠APIίʔϧ -
UEFIͷSDK • EDK IIɿΦʔϓϯιʔεͰ։ൃ͞Ε͍ͯΔUEFI࣮ͰɺσϑΝΫτελϯμʔυ άά͙ͬͯ͢ग़ͯ͘Δͷ͜Εɻ ୠ͠ɺϏϧυํ๏ͷυΩϡϝϯτΛΑ͘ݟΔͱtrunkΛνΣοΫΞτ͍ͯ͠Δɻ ͦͯ͠ɺtrunkͩͱ৭ʑͱཕ͕͋ͬͯසൟʹ౿Ή… • UDK2010ɿIntel͕࡞͍ͬͯΔEDK IIͷstableϦϦʔεɻ
ཕΛ౿Έͨ͘ͳ͔ͬͨΒͬͪ͜Λͬͨ΄͏͕ྑ͍ͷ͕ͩɺEDK IIʹ͔͠ແ͍ػೳ ৭ʑͱଘࡏɻ • gnu-efiɿEDK IIUEFIϑΝʔϜΣΞͷιʔείʔυΛશؚͯΜͰ͍Δ͕ɺͪ͜ΒUEFI ApplicationΛ࣮͢ΔͨΊ͚ͩͷLightweightͳ࣮ɻ γϯϓϧ؆୯͓खܰͰී௨ͷMakefile͑Δ͠ɺLinuxOSXϢʔβʹͱͬͯͬͪ͜ͷ ํ͕͍ͦ͢͏ɻɹ…͕ͩɺ͜ΕͰ৭ʑͱ౿Μͩ… -
OVMF FOR QEMU/KVM • EDK II্ͰϏϧυͰ͖ΔQEMUɾKVM༻ͷUEFI࣮ • ίϚϯυҰൃͰϏϧυˍ࣮ߦ·Ͱ؆୯ʹग़དྷΔ • QEMUͰdebugconΛ༗ޮʹ͢ΔͱUEFI͔Βͷσόοάग़ྗ͕ಘΒΕΔ
• γϦΞϧίϯιʔϧΛ༗ޮʹ͢ΔͱVGAଆͱಉͷग़ྗ͕ಘΒΕΔ • ͪΐͬͱઃఆ͢Εgdbܨ͕Δͣ • stable൛͡Όͳ͍ͷ͕ܹ͘͠ؾʹͳΔ͚ͲͦΜͳΜଘࡏ͠ͳ͍ͷͰݟͳ ͔ͬͨ͜ͱʹ͢Δ͔͠… -
EDK IIʹ͔͠ͳ͍ͷ • ͜͜·Ͱݟ͖ͯͨΑ͏ʹɺUEFIͷAPIඪ४CͷAPIͱޓ ੑ͕ͳ͍ • ௨ৗͷOSͰಈ࡞͍ͯ͠ΔΞϓϦέʔγϣϯΛҠ২͢Δͷ ͕໘ • libcͱPOSIX
APIͷҰ෦ͱBSD SocketΛҠ২ͯ͠͠·͑ʂ ˠPythonҠ২Ͱ͖ͪΌ͍·ͨ͠ ˠmrubyҠ২Ͱ͖ͪΌ͍·ͨ͠ -
EDK IIͬͯTWITTERΫϥΠΞ ϯτΛҠ২ͯ͠Έͨ • ΈࠐΈͱ͔Ͱ͍ͦ͢͏ͳPureC࣮ͷTwitterΫϥ ΠΞϯτʮTwitter4CʯΛར༻ https://github.com/Plemling138/Twitter4C • Makefile͡Όͳͯ͘ಠࣗܗࣜͷ.infͱ͍͏ϏϧυεΫϦϓ τΛఆٛ
• μϝͦ͏ͳͱ͜ΖΛҰͭͮͭ௵ͯ͠ߦͬͨΒಈ͍ͨ https://gist.github.com/syuu1228/4965390 -
μϝϙΠϯτ̍ • ͜ͷϓϩάϥϜɺϝοηʔδ͕ຊޠͩ… if(access_token == NULL) { //ϦΫΤεττʔΫϯऔಘ if(errcode =
Twitter_GetRequestToken(c, r), errcode < 0) { - printf("ϦΫΤεττʔΫϯͷऔಘͰΤϥʔ͕ൃੜ͍ͯ͠·͢\n"); - printf("Τϥʔίʔυ:%d\n", errcode); + printf("error occured during get request token\n"); + printf("error code:%d\n", errcode); exit(0); } -
μϝϙΠϯτ̏ • ඍົͳܕͷζϨ //࣌ؒΛऔಘͯ͠λΠϜελϯϓͱҰҙͳΛηοτ gettimeofday(&tv, NULL); - sprintf(tstamp, "%ld", tv.tv_sec);
+ sprintf(tstamp, "%d", tv.tv_sec); - sprintf(nonce_tmp, "%ld", tv.tv_usec); + sprintf(nonce_tmp, "%d", tv.tv_usec); base64_encode(nonce_tmp, strlen(nonce_tmp), nonce, 128); URLEncode(nonce, nonce_urlenc); -
μϝϙΠϯτ̐ • ͳΜ͔ΒΜ͚ͲϦΫΤεττʔΫϯͷऔಘʹࣦഊͯ͠͠·ͬͯɺೝূͷͱ͜Ζ·Ͱߦ͚ͳ͍ • ΊΜͲ͔ͤ͐͘ΒΞΫηετʔΫϯͱ͔ҰΛιʔείʔυʹϕλຒΊࠐΈͯ͠Έͨ a->user_id = "΄͛΄͛"; a->access_token =
"΄͛΄͛"; a->access_secret = "΄͛΄͛"; a->pin = "2630697"; -
ϋϚΓϙΠϯτ • X64Ͱࢼͯͨ͠ΒɺUEFI ApplicationଆͷόΠφϦͷABIʹޡΓͰ ͋Δͷ͔ɺgethostbyname()͢ΔͱUEFIଆ͕ṖͷࢮΛ͛Δͱ͔͍ ͏൵ࢂͳʹ͋ͬͨ • άάͬͯͨΒϏϧυΦϓγϣϯม͑ͨΒಈ͍ͨͱ͔ɺIA32ͳΒߦ ͚ͨͱ͔ॻ͍ͯ͋ͬͨͷͰॱʹࢼͨ͠ Re:
[edk2] OVMF x64 - CR has Bad Signatureɿhttp://bit.ly/Yi3N8Y • ϏϧυΦϓγϣϯม͑ͯμϝͩͬͨͷͰɺIA32ʹͨ͠ʢ͜Εͩ ͱ࣮ػͷUEFIX64ͳͷͰࠔΔΜ͕ͩɻɻɻɻ