{"id":387323,"date":"2024-06-29T07:15:37","date_gmt":"2024-06-29T07:15:37","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=387323"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=387323","title":{"rendered":"<span>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 64-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e UEFI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Visual Studio<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u0417\u0438\u043c\u043e\u0439 \u0432 \u0431\u043b\u043e\u0433\u0435 RUVDS \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u0432 \u0434\u043b\u044f \u00ab\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e\u00bb BIOS, \u0432 \u0442.\u0447. <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/535600\/\">\u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0435\u043c\u043a\u0430<\/a>, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0432 VGA-\u0440\u0435\u0436\u0438\u043c\u0435 320\u00d7200. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u044b \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/536132\/#comment_22508110\">\u043e\u0442\u043c\u0435\u0447\u0430\u043b\u0438<\/a>, \u0447\u0442\u043e \u0432 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0435\u043c 2021 \u0433. \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043b\u044e\u0442\u043e\u0435 \u043b\u0435\u0433\u0430\u0441\u0438;   <\/p>\n<blockquote><p>\u0430 \u0432\u043e\u0442 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u201cHello, World\u201d \u043d\u0430 UEFI \u0434\u0430 \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0411\u043e\u043b\u044c\u0448\u0435 \u0442\u043e\u0433\u043e \u2014 \u044f \u0442\u0430\u043a\u0438\u0445 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u043f\u043e\u043c\u043d\u044e.\u00bb (<a href=\"https:\/\/habr.com\/ru\/users\/minimumlaw\/\" class=\"user_link\">MinimumLaw<\/a>) <\/p><\/blockquote>\n<p>\u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u043c\u044b \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0442\u0443 \u0431\u0443\u0442\u0441\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u0434\u0435\u043c\u043a\u0443 \u043f\u043e\u0434 UEFI, \u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0432\u0435\u0442\u043d\u043e\u043c \u0432\u0438\u0434\u0435\u043e\u0440\u0435\u0436\u0438\u043c\u0435 \u0441 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0432\u043c\u0435\u0441\u0442\u043e 512 \u0431\u0430\u0439\u0442 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u041a\u0411.<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/610d4f5ef2fa57a26f179fd6\" data-style=\"\" id=\"610d4f5ef2fa57a26f179fd6\" width=\"\"><\/div>\n<\/div>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2><font color=\"#3AC1EF\">\u258d 1. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0441\u0440\u0435\u0434\u044b<\/font><\/h2>\n<p>  \u0427\u0435\u0442\u044b\u0440\u0435 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 <a href=\"https:\/\/habr.com\/ru\/users\/darktiger\/\" class=\"user_link\">DarkTiger<\/a> \u043f\u043e\u0441\u0442\u0438\u043b <a href=\"https:\/\/habr.com\/ru\/post\/338264\/\">\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b<\/a> \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043e\u0434 UEFI \u0432 Visual Studio, \u0438 \u0434\u0430\u0436\u0435 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b <a href=\"https:\/\/github.com\/ProgrammingInUEFI\/FW\">\u0448\u0430\u0431\u043b\u043e\u043d \u0441\u0440\u0435\u0434\u044b<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u043d\u0435 \u043b\u043e\u043c\u0430\u044f \u0433\u043e\u043b\u043e\u0432\u0443 \u043d\u0430\u0434 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 edk2: <i>\u00ab\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>git clone ...<\/code> \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0434\u0438\u0441\u043a\u0430, \u0438 \u044d\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u0441\u0435, \u0441\u0440\u0435\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0438 \u0433\u043e\u0442\u043e\u0432\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435.\u00bb<\/i> \u0428\u0430\u0431\u043b\u043e\u043d \u044d\u0442\u043e\u0442 \u0431\u044b\u043b \u0436\u0451\u0441\u0442\u043a\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c\u0443 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0443, \u043d\u043e \u0438 \u043a Visual Studio 2015, \u043a \u0434\u0440\u0435\u0432\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 edk2, \u0438 \u043a 32-\u0431\u0438\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 Visual Studio 2019, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 edk2, \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043e\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u0438\u0442\u044c. \u0415\u0449\u0451 \u043e\u0434\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0437\u0430 \u044d\u0442\u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u0433\u043e\u0434\u0430 \u2014 \u0442\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 edk2 \u0441\u0442\u0430\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c Python.<\/p>\n<p>  \u041e\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d (170 \u041c\u0411 \u0442\u0440\u0430\u0444\u0438\u043a\u0430, 600 \u041c\u0411 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435) \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"bash\">git clone --depth 1 --recursive --shallow-submodules https:\/\/github.com\/tyomitch\/uefi<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<ol>\n<li>\u041a\u043e\u043f\u0438\u044f edk2 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u0430 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 (git submodule) \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439;<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 Python 3.5, \u0438 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u043d\u0443\u0442\u0440\u0438 NT32.vcxproj \u0437\u0430\u0434\u0430\u044e\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>PYTHON_HOME<\/code>, \u043d\u0443\u0436\u043d\u0443\u044e \u0434\u043b\u044f edk2;<\/li>\n<li>\u0417\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c <code>C:\\FW\\<\/code> \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 vcxproj \u0437\u0430\u043c\u0435\u043d\u0451\u043d \u043d\u0430 <code>$(SolutionDir)\\..\\;<\/code><\/li>\n<li>\u0421\u043a\u0440\u0438\u043f\u0442\u0443 edksetup.bat \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0430\u0432\u0448\u0435\u0433\u043e \u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>--nt32<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f <code>Rebuild VS2019<\/code>: \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>edk2\\BaseTools\\Bin\\Win32<\/code> (\u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e); \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0442\u0443\u043b\u0447\u0435\u0439\u043d.<\/li>\n<\/ol>\n<p>  \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u201cWin32\u201d; \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442.<\/div>\n<\/p><\/div>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 <code>edk2\\BaseTools\\Conf\\target.template<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>TARGET_ARCH<\/code> \u043d\u0430 <code>X64<\/code> \u0438 <code>TOOL_CHAIN_TAG<\/code> \u043d\u0430 <code>VS2019<\/code>; \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c <code>VS\\NT32.sln<\/code>, \u0436\u0430\u0442\u044c F5, \u0438 \u0432\u0441\u0451 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f. \u0427\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u0440\u0435\u0434\u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432 UEFI Shell \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>fs0:HelloWorld.efi<\/code>:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/7l\/s6\/-k\/7ls6-kjhed13i8wjrkv6inkpasm.png\" data-src=\"https:\/\/habrastorage.org\/webt\/7l\/s6\/-k\/7ls6-kjhed13i8wjrkv6inkpasm.png\"\/><\/p>\n<p>  \u041c\u043e\u0434\u0443\u043b\u044c HelloWorld \u043c\u044b \u0438 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0434\u0435\u043c\u043a\u0438.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d 2. \u0422\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u044f<\/font><\/h2>\n<p>  \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0434\u0435\u043c\u043a\u043e\u0439 \u043b\u0438\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u0442\u0430\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D1%80%D1%85%D0%B8%D0%BC%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0_%D1%81%D0%BF%D0%B8%D1%80%D0%B0%D0%BB%D1%8C\">\u0430\u0440\u0445\u0438\u043c\u0435\u0434\u043e\u0432\u0430 \u0441\u043f\u0438\u0440\u0430\u043b\u044c<\/a>, \u0438 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0435\u0451 \u0442\u043e\u0447\u0435\u043a <a href=\"https:\/\/github.com\/cfallin\">Chris Fallin<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>fcos<\/code> \u0438 <code>fsin<\/code>. \u0423\u0432\u044b, \u043d\u043e \u0442\u0440\u0438\u0433\u043e\u043d\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0421\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b: \u043e\u043d\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u0430 \u0435\u0451 \u0438\u0437 edk2 <a href=\"https:\/\/bugzilla.tianocore.org\/show_bug.cgi?id=1734\">\u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b\u0438<\/a>. \u041d\u0435\u0442 \u0432 MSVC \u0438 \u0438\u043d\u043b\u0430\u0439\u043d-\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u0434\u043b\u044f x64, \u0442\u0430\u043a \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>SinCos<\/code> \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u0441\u043b\u0435\u0434\u0443\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0443 <a href=\"https:\/\/gist.github.com\/bkietz\/c00c61e73f847d3cf4454c8c4cb4ced0#file-sincos-asm\">Benjamin Kietzman<\/a>. \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u0435 \u0435\u0433\u043e \u0444\u0430\u0439\u043b SinCos.asm \u0440\u044f\u0434\u043e\u043c \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u043c HelloWorld.c \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <code>edk2\\MdeModulePkg\\Application\\HelloWorld<\/code>, \u0430 \u0432 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 HelloWorld.inf \u0434\u043e\u043f\u0438\u0448\u0438\u0442\u0435 \u0441\u0435\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"dos\">[Sources.X64]   SinCos.asm <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"dos\">.code  PUBLIC SinCos ; void SinCos(double AngleInRadians, double *pSinAns, double *pCosAns);  angle_on_stack$ = 8  SinCos PROC    movsd QWORD PTR angle_on_stack$[rsp], xmm0 ; argument angle is in xmm0, move it to the stack   fld QWORD PTR angle_on_stack$[rsp]         ; push angle onto the FPU stack   fsincos   fstp QWORD PTR [r8]  ; store\/pop cosine output argument    fstp QWORD PTR [rdx] ; store\/pop sine output argument   ret 0  SinCos ENDP  END <\/code><\/pre>\n<\/div><\/div>\n<p>  \u041f\u043e\u043f\u0443\u0442\u043d\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 HelloWorld.inf \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0441\u0435\u043a\u0446\u0438\u0438 <code>[FeaturePcd]<\/code>, <code>[Pcd]<\/code>, <code>[UserExtensions.TianoCore.\"ExtraFiles\"]<\/code>, \u0438 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f HelloWorldStr.uni \u0438 PcdLib. \u0412\u0441\u0435 \u044d\u0442\u0438 \u0448\u0442\u0443\u043a\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441\u0442\u0440\u043e\u043a \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 (PCD \u2014 \u044d\u0442\u043e Platform Configuration Database), \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u044e\u0442, \u043d\u043e \u0438 \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438 <code>#include &lt;Library\/PcdLib.h><\/code>, \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <code>mStringHelpTokenId<\/code> \u0438\u0437 HelloWorld.c; \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">#include &lt;Library\/UefiBootServicesTableLib.h> #define M_PI 3.14159265358979323846 extern void SinCos(double AngleInRadians, double *pSinAns, double *pCosAns); int _fltused;<\/code><\/pre>\n<p>  \u0421\u0438\u043c\u0432\u043e\u043b <code>_fltused<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 MSVC-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0439 <code>double<\/code>. \u041e\u0431\u044b\u0447\u043d\u043e \u0435\u0433\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043d\u043e \u043d\u0430\u043c \u0435\u0433\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d 3. \u041f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430<\/font><\/h2>\n<p>  \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u043b\u044f UEFI \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 API \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f GOP (Graphics Output Protocol), \u0438 \u043e\u043d \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u0440\u043e\u0441\u0442: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430, <code>Blt<\/code>, \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438 \u044d\u043a\u0440\u0430\u043d\u043e\u043c. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c <code>UINT32<\/code> \u043f\u043e \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443. \u0421\u043f\u0438\u0440\u0430\u043b\u044c-\u0451\u043b\u043e\u0447\u043a\u0443 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">EFI_STATUS EFIAPI UefiMain (   IN EFI_HANDLE        ImageHandle,   IN EFI_SYSTEM_TABLE  *SystemTable   ) {     EFI_STATUS efiStatus;     EFI_GUID gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;     EFI_GRAPHICS_OUTPUT_PROTOCOL *gop;     double sin, cos;      \/\/ \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b     efiStatus = gBS->LocateProtocol(&amp;gopGuid, NULL, (void**)&amp;gop);     if (EFI_ERROR(efiStatus)) {         Print(L\"Unable to locate GOP\\n\");         return EFI_NOT_STARTED;     }     UINT32 *video = (UINT32*)(UINTN)gop->Mode->FrameBufferBase;      \/\/ \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043c \u043c\u0435\u0440\u0446\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441\u043e\u0440     gST->ConOut->EnableCursor(gST->ConOut, FALSE);      double tree_height_factor = gop->Mode->Info->VerticalResolution * .8;     double tree_width_factor = gop->Mode->Info->VerticalResolution * .5;     double tree_width_base = gop->Mode->Info->HorizontalResolution * .5;      \/\/ \u043a\u043e\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u0442 Chris Fallin      for (UINTN tick = 0; ; tick++) {         gST->ConOut->ClearScreen(gST->ConOut);          for (double t = 0; t &lt; 1; t += .001) {             double width = t * tree_width_factor;             double w = 2 * M_PI * 5;             double p = 2 * M_PI * tick \/ 36; \/\/ (0.5 revs \/ sec)             double angle = w * t + p;             SinCos(angle, &amp;sin, &amp;cos);             double x = width * cos + tree_width_base;             double z = width * sin;             double y = t * tree_height_factor;             UINTN x_disp = (UINTN)(x + z * .5);             UINTN y_disp = (UINTN)(y + z * .25);             if (y_disp &lt; gop->Mode->Info->VerticalResolution) {                 UINTN coord = gop->Mode->Info->PixelsPerScanLine * y_disp + x_disp;                 UINT32 pixel = ((int)(t * 1000) % 2) ? 0x00FF00 : 0xFF0000;                 video[coord] = pixel;             }         }          gBS->Stall((UINTN)(65536 \/ (105. \/ 88.))); \/\/ ~55 ms, to match IBM PC timer     } }<\/code><\/pre>\n<p>  \u0423\u0432\u044b, \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0439 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 edk2 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u0432 \u043f\u043e\u043b\u0435 <code>gop->Mode->FrameBufferBase<\/code> \u0431\u0443\u0434\u0435\u0442 <code>NULL<\/code>. \u0427\u0442\u043e\u0431\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/ionescu007\/VisualUefi\/tree\/master\/debugger\">\u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430<\/a>, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u0443\u044e Alex Ionescu: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:   <\/p>\n<pre><code class=\"bash\">qemu.exe -drive file=OVMF_CODE-need-smm.fd,if=pflash,format=raw,unit=0,readonly=on -drive file=OVMF_VARS-need-smm.fd,if=pflash,format=raw,unit=1 -drive file=fat:rw:\u2026\\edk2\\Build\\EmulatorX64\\DEBUG_VS2019\\X64,media=disk,if=virtio,format=raw -drive file=UefiShell.iso,format=raw -m 512 -machine q35,smm=on -nodefaults -vga std -global driver=cfi.pflash01,property=secure,value=on -global ICH9-LPC.disable_s3=1<\/code><\/pre>\n<p> \u2014 \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043a\u0430\u043a <code>fs1:<\/code><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/dn\/sp\/zw\/dnspzwcsryusbbjgyagpttesprw.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/dn\/sp\/zw\/dnspzwcsryusbbjgyagpttesprw.gif\"\/><\/p>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u0442\u0440\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0431\u0443\u0442\u0441\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0434\u0435\u043c\u043a\u0438:<\/p>\n<ol>\n<li>\u042d\u043a\u0440\u0430\u043d \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>gST->ConOut->ClearScreen<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430 \u043d\u0451\u043c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0437\u0430\u0436\u0438\u0433\u0430\u044e\u0442\u0441\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0441\u043f\u0438\u0440\u0430\u043b\u0438-\u0451\u043b\u043e\u0447\u043a\u0438. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u044d\u0442\u0438\u043c \u043c\u0435\u0440\u0446\u0430\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0434\u0430\u0436\u0435 \u043d\u0430 \u0433\u0438\u0444\u043a\u0435. \u0427\u0442\u043e\u0431\u044b \u043e\u0442 \u043d\u0435\u0433\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f, \u0451\u043b\u043e\u0447\u043a\u0443 \u043d\u0430\u0434\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>Blt<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u043e\u0434\u043d\u0438\u043c \u0446\u0435\u043b\u044b\u043c. \u041c\u044b \u0436\u0435 \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0435\u0440\u0446\u0430\u043d\u0438\u0435 \u0432\u043e\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0445 \u0433\u0438\u0440\u043b\u044f\u043d\u0434 \u0442\u0451\u043f\u043b\u043e\u0439 \u0438 \u043b\u0430\u043c\u043f\u043e\u0432\u043e\u0439 \u0444\u0438\u0447\u0435\u0439 \u0434\u0435\u043c\u043a\u0438, \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u043a\u0430\u043a \u0435\u0441\u0442\u044c.<\/li>\n<li>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0434\u0435\u043c\u043a\u0438 \u2014 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430. \u0414\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 Legacy BIOS \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e (\u043a\u0443\u0434\u0430 \u0436 \u0438\u0437 \u043d\u0435\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c?), \u043d\u043e \u0438\u0437 UEFI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0439\u0442\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 UEFI Shell. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0446\u0438\u043a\u043b\u0430, \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0431\u044b\u043b\u0430 \u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u0430\u043a\u0430\u044f-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u043b\u0430\u0432\u0438\u0448\u0430:\n<pre><code class=\"cpp\">    EFI_INPUT_KEY Key;     efiStatus = gST->ConIn->ReadKeyStroke(gST->ConIn, &amp;Key);     if (!EFI_ERROR(efiStatus)) {         return efiStatus;     }<\/code><\/pre>\n<\/li>\n<li>\u0412 \u0440\u0435\u0436\u0438\u043c\u0435 320\u00d7200 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0434\u0432\u0443\u0445 \u0446\u0432\u0435\u0442\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e; \u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u2014 \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0435\u0434\u043d\u043e: \u0438 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c, \u0438 \u0432 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u0445 \u0436\u0438\u0440\u043d\u0435\u0435 \u2014 \u043a\u0430\u0436\u0434\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0441\u043f\u0438\u0440\u0430\u043b\u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u00ab\u043f\u043b\u044e\u0441\u0438\u043a\u043e\u043c\u00bb \u0438\u0437 \u043f\u044f\u0442\u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439; \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0432\u0435\u0442\u043d\u043e\u0441\u0442\u044c\u044e GOP, \u0438 \u0431\u0443\u0434\u0435\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u0446\u0432\u0435\u0442 \u043e\u0442 \u0437\u0435\u043b\u0451\u043d\u043e\u0433\u043e \u043a \u043a\u0440\u0430\u0441\u043d\u043e\u043c\u0443 \u043f\u043b\u0430\u0432\u043d\u044b\u043c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u043c, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0441\u044f \u043f\u044f\u0442\u044c\u0434\u0435\u0441\u044f\u0442 \u0440\u0430\u0437 \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0441\u043f\u0438\u0440\u0430\u043b\u0438.\n<pre><code class=\"cpp\">    if (y_disp &lt; gop->Mode->Info->VerticalResolution) {         UINTN coord = gop->Mode->Info->PixelsPerScanLine * y_disp + x_disp;         double color = t * 50;         color -= (INTN)color;         UINT32 pixel = (UINT32)(color * 255) &lt;&lt; 8;         pixel |= (UINT32)((1. - color) * 255) &lt;&lt; 16;         video[coord] = pixel;         video[coord - 1] = pixel;         video[coord + 1] = pixel;         if (y_disp > 0)             video[coord - gop->Mode->Info->PixelsPerScanLine] = pixel;         if (y_disp &lt; gop->Mode->Info->VerticalResolution - 1)             video[coord + gop->Mode->Info->PixelsPerScanLine] = pixel;     }<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/if\/xm\/62\/ifxm62xzq6yly7s_2tqn680sbno.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/if\/xm\/62\/ifxm62xzq6yly7s_2tqn680sbno.gif\"\/><\/p>\n<h2><font color=\"#3AC1EF\">\u258d 4. \u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/font><\/h2>\n<p>  \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u043e\u0435 \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u043f\u0438\u0440\u0430\u043b\u044c\u044e-\u0451\u043b\u043e\u0447\u043a\u043e\u0439 \u0432 \u0431\u0443\u0442\u0441\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0434\u0435\u043c\u043a\u0435, \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043d\u044c\u044e \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439 <code>db<\/code>. \u042d\u0442\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e: \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c? \u0413\u043e\u0440\u0430\u0437\u0434\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 BMP-\u0444\u0430\u0439\u043b\u043e\u043c. \u0422\u0430\u043a\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u0451\u0442 HII Database (Human Interface Infrastructure), \u0432\u0441\u043a\u043e\u043b\u044c\u0437\u044c \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0430\u044f \u0432 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/users\/darktiger\/\" class=\"user_link\">DarkTiger<\/a> \u043a\u0430\u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0448\u0440\u0438\u0444\u0442\u043e\u0432, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 UEFI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c. \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u0438 \u0448\u0440\u0438\u0444\u0442\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0432 PE-\u043e\u0431\u0440\u0430\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u044b BMP-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432:<\/p>\n<ol>\n<li>\u041a\u043b\u0430\u0434\u0451\u043c \u0444\u0430\u0439\u043b ruvds.bmp \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u0440\u043e\u0435\u043a\u0442\u0430;<\/li>\n<li>\u0422\u0430\u043c \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u0430\u0439\u043b ruvds.idf \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 <code>#image IMG_LOGO ruvds.bmp<\/code> \u2014 \u043e\u043d\u0430 \u0437\u0430\u0434\u0430\u0451\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0432 \u043a\u043e\u0434\u0435;<\/li>\n<li>\u0412 \u0444\u0430\u0439\u043b\u0435 HelloWorld.inf \u0432 \u0441\u0435\u043a\u0446\u0438\u044e <code>[Sources]<\/code> \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u0430 \u0444\u0430\u0439\u043b\u0430 ruvds.idf \u0438 ruvds.bmp, \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0438\u0437 \u043d\u0435\u0451 HelloWorldStr.uni: <a href=\"https:\/\/bugzilla.tianocore.org\/show_bug.cgi?id=3517\">\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/a> \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 edk2 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u043c\u0435\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438 BMP, \u0438 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438;<\/li>\n<li>\u0412 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430 HelloWorld.inf \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e:\n<pre><code class=\"dos\">[Protocols]   gEfiHiiDatabaseProtocolGuid     ## CONSUMES   gEfiHiiImageProtocolGuid        ## CONSUMES   gEfiHiiPackageListProtocolGuid  ## CONSUMES<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0430\u0439\u043b\u0430 HelloWorld.c \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c:<\/p>\n<pre><code class=\"cpp\">#include &lt;Protocol\/HiiDatabase.h> #include &lt;Protocol\/HiiImage.h> #include &lt;Protocol\/HiiPackageList.h><\/code><\/pre>\n<p>  \u0410 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e <code>UefiMain<\/code> \u2014 \u043a\u043e\u0434 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">    EFI_HII_DATABASE_PROTOCOL *HiiDatabase;     EFI_HII_IMAGE_PROTOCOL *HiiImage;     EFI_HII_PACKAGE_LIST_HEADER *PackageList;     EFI_HII_HANDLE HiiHandle;     EFI_IMAGE_OUTPUT Output;      efiStatus = gBS->LocateProtocol(&amp;gEfiHiiDatabaseProtocolGuid, NULL, (VOID**)&amp;HiiDatabase);     if (EFI_ERROR(efiStatus)) {         Print(L\"Unable to locate HII Database\\n\");         return EFI_NOT_STARTED;     }      efiStatus = gBS->LocateProtocol(&amp;gEfiHiiImageProtocolGuid, NULL, (VOID**)&amp;HiiImage);     if (EFI_ERROR(efiStatus)) {         Print(L\"Unable to locate HII Image\\n\");         return EFI_NOT_STARTED;     }      efiStatus = gBS->OpenProtocol(ImageHandle, &amp;gEfiHiiPackageListProtocolGuid,                   (VOID**)&amp;PackageList, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);     if (EFI_ERROR (efiStatus)) {         Print(L\"HII Image Package not found in PE\/COFF resource section\\n\");         return efiStatus;     }      efiStatus = HiiDatabase->NewPackageList(HiiDatabase, PackageList, NULL, &amp;HiiHandle);     if (EFI_ERROR(efiStatus)) {         Print(L\"Unable to register HII Package\\n\");         return EFI_NOT_STARTED;     }<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 GOP \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>Output<\/code>:<\/p>\n<pre><code class=\"cpp\">    Output.Width = (UINT16)gop->Mode->Info->HorizontalResolution;     Output.Height = (UINT16)gop->Mode->Info->VerticalResolution;     Output.Image.Screen = gop;     UINTN logo_offset = 38;<\/code><\/pre>\n<p>  \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u0430, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u044d\u043a\u0440\u0430\u043d\u0430, \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u044d\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">        EFI_IMAGE_OUTPUT *pOutput = &amp;Output;         HiiImage->DrawImageId(HiiImage, EFI_HII_DIRECT_TO_SCREEN, HiiHandle,                   IMAGE_TOKEN(IMG_LOGO), &amp;pOutput, (UINTN)tree_width_base - logo_offset, 0);<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/7s\/b9\/ot\/7sb9otq3gcufof_2n_zaaybt5di.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/7s\/b9\/ot\/7sb9otq3gcufof_2n_zaaybt5di.gif\"\/><\/p>\n<h2><font color=\"#3AC1EF\">\u258d 5. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 <code>Blt<\/code><\/font><\/h2>\n<p>  <code>DrawImageId<\/code> \u0448\u043b\u0451\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d; \u043d\u0430\u043c \u0436\u0435 \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043c\u0438\u0433\u0430\u044e\u0449\u0435\u0433\u043e \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u0443\u0444\u0435\u0440 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0433\u0434\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043b\u0430\u0432\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">#include &lt;Library\/BaseMemoryLib.h><\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0434\u0430\u043b\u0438\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>Output<\/code> \u0438 \u0435\u0451 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0431\u0443\u0444\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">    EFI_IMAGE_INPUT Image;     EFI_PHYSICAL_ADDRESS Buffer;      efiStatus = HiiImage->GetImage(HiiImage, HiiHandle, IMAGE_TOKEN(IMG_LOGO), &amp;Image);     if (EFI_ERROR(efiStatus)) {         Print(L\"Unable to locate IMG_LOGO\\n\");         return EFI_NOT_STARTED;     }      UINTN size = Image.Height * Image.Width * sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL);     efiStatus = gBS->AllocatePages(AllocateAnyPages,                   EfiLoaderData, EFI_SIZE_TO_PAGES(size), &amp;Buffer);     if (EFI_ERROR(efiStatus)) {         Print(L\"Unable to allocate Buffer\\n\");         return EFI_NOT_STARTED;     }      EFI_GRAPHICS_OUTPUT_BLT_PIXEL *logo = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL*)(UINTN)Buffer;     CopyMem(logo, Image.Bitmap, size);<\/code><\/pre>\n<p>  \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0446\u0438\u043a\u043b\u0430 \u043d\u0435\u0442 \u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d: \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>Blt(EfiBltVideoFill)<\/code> \u043e\u0447\u0438\u0441\u0442\u0438\u043c \u043b\u0438\u0448\u044c \u0442\u0443 \u0447\u0430\u0441\u0442\u044c, \u0433\u0434\u0435 \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0440\u0430\u043b\u044c-\u0451\u043b\u043e\u0447\u043a\u0430.<\/p>\n<pre><code class=\"cpp\">        gop->Blt(gop, logo, EfiBltVideoFill, 0, 0,                  (UINTN)(tree_width_base - 1.2 * tree_width_factor), Image.Height,                  (UINTN)(2.4 * tree_width_factor),                  gop->Mode->Info->VerticalResolution - Image.Height, 0);<\/code><\/pre>\n<p>  \u0421\u0430\u043c\u0443 \u0441\u043f\u0438\u0440\u0430\u043b\u044c \u0441\u043c\u0435\u0441\u0442\u0438\u043c \u0432\u043d\u0438\u0437 \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0443 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"cpp\">            UINTN y_disp = (UINTN)(y + z * .25) + Image.Height;<\/code><\/pre>\n<p>  \u0418 \u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0445\u0443\u0434\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u2014 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0446\u0438\u043a\u043b\u0430, \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>Blt(EfiBltBufferToVideo)<\/code> \u043f\u043b\u0430\u0432\u043d\u043e \u043c\u0438\u0433\u0430\u044e\u0449\u0438\u0439 \u043b\u043e\u0433\u043e\u0442\u0438\u043f:<\/p>\n<pre><code class=\"cpp\">        for (UINTN i = 0; i &lt; Image.Width * Image.Height; i++) {             if (Image.Bitmap[i].Blue > Image.Bitmap[i].Red) {                 if (sin > 0) {                     \/\/ blend with (0,0,0)                     logo[i].Red = (UINT8)(Image.Bitmap[i].Red * (1 - sin));                     logo[i].Green = (UINT8)(Image.Bitmap[i].Green * (1 - sin));                     logo[i].Blue = (UINT8)(Image.Bitmap[i].Blue * (1 - sin));                 }                 else {                     \/\/ blend with (175, 224, 250)                     logo[i].Red = (UINT8)(175 - (175 - Image.Bitmap[i].Red) * (1 + sin));                     logo[i].Green = (UINT8)(224 - (224 - Image.Bitmap[i].Green) * (1 + sin));                     logo[i].Blue = (UINT8)(250 - (250 - Image.Bitmap[i].Blue) * (1 + sin));                 }             }         }         gop->Blt(gop, logo, EfiBltBufferToVideo,             0, 0, (UINTN)tree_width_base - logo_offset, 0,             Image.Width, Image.Height, Image.Width * sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL));<\/code><\/pre>\n<p>  \u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u0434\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <a href=\"https:\/\/github.com\/tyomitch\/uefi\/tree\/master\/HelloWorld\">HelloWorld<\/a>, \u0430 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u043d\u0430 \u0440\u043e\u043b\u0438\u043a\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 UEFI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442\u043b\u0430\u0436\u0435\u043d\u043e \u043f\u043e\u0434 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0436\u0438\u0432\u0443\u044e, \u0431\u0435\u0437 UEFI Shell \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0432\u0437\u044f\u0442\u044c \u0444\u043b\u0435\u0448\u043a\u0443, \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043a\u0430\u043a FAT; \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c HelloWorld.efi \u043f\u043e \u043f\u0443\u0442\u0438 <code>\\EFI\\BOOT\\bootx64.efi<\/code>; \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 BIOS \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c Secure Boot; \u0438 \u0432\u0443\u0430\u043b\u044f!<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/610d4f5ef2fa57a26f179fd6\" data-style=\"\" id=\"610d4f5ef2fa57a26f179fd6\" width=\"\"><\/div>\n<\/div>\n<p><a href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=oldtomi&amp;utm_content=razrabotka_64_bitnogo_graficheskogo_uefi_prilozheniya_v_visual_studio\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ou\/g5\/kh\/oug5kh6sjydt9llengsiebnp40w.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ou\/g5\/kh\/oug5kh6sjydt9llengsiebnp40w.png\"\/><\/a><\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/571624\/\"> https:\/\/habr.com\/ru\/articles\/571624\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u0417\u0438\u043c\u043e\u0439 \u0432 \u0431\u043b\u043e\u0433\u0435 RUVDS \u0431\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u0432 \u0434\u043b\u044f \u00ab\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e\u00bb BIOS, \u0432 \u0442.\u0447. <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/535600\/\">\u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0435\u043c\u043a\u0430<\/a>, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0432 VGA-\u0440\u0435\u0436\u0438\u043c\u0435 320\u00d7200. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u044b \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/536132\/#comment_22508110\">\u043e\u0442\u043c\u0435\u0447\u0430\u043b\u0438<\/a>, \u0447\u0442\u043e \u0432 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0435\u043c 2021 \u0433. \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043b\u044e\u0442\u043e\u0435 \u043b\u0435\u0433\u0430\u0441\u0438;   <\/p>\n<blockquote><p>\u0430 \u0432\u043e\u0442 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u201cHello, World\u201d \u043d\u0430 UEFI \u0434\u0430 \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0411\u043e\u043b\u044c\u0448\u0435 \u0442\u043e\u0433\u043e \u2014 \u044f \u0442\u0430\u043a\u0438\u0445 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u043f\u043e\u043c\u043d\u044e.\u00bb (<a href=\"https:\/\/habr.com\/ru\/users\/minimumlaw\/\" class=\"user_link\">MinimumLaw<\/a>) <\/p><\/blockquote>\n<p>\u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u043c\u044b \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0442\u0443 \u0431\u0443\u0442\u0441\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u0434\u0435\u043c\u043a\u0443 \u043f\u043e\u0434 UEFI, \u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0432\u0435\u0442\u043d\u043e\u043c \u0432\u0438\u0434\u0435\u043e\u0440\u0435\u0436\u0438\u043c\u0435 \u0441 \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0432\u043c\u0435\u0441\u0442\u043e 512 \u0431\u0430\u0439\u0442 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u041a\u0411.<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/610d4f5ef2fa57a26f179fd6\" data-style=\"\" id=\"610d4f5ef2fa57a26f179fd6\" width=\"\"><\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-387323","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/387323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=387323"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/387323\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=387323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=387323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=387323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}