• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            string

            string
            posts - 27, comments - 177, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            UEFI實戰(1)

            Posted on 2011-10-02 01:46 djx_zh 閱讀(18702) 評論(16)  編輯 收藏 引用
            本篇為UEFI實戰系列第一部分。
            UEFI實戰前10個部分計劃如下:
            UEFI 實戰(1) 開發環境 
            講述如何配置開發環境。
            UEFI 實戰(2)  HelloWorld
            講述dsc, inf文件的格式, application常用的變量,數據結構和函數。
            UEFI 實戰(3) C++
            講述如何用C++開發UEFI程序。
            UEFI 實戰(4) protocol
            講述UEFI中protocol的概念
            UEFI實戰(5) driver
            講述UEFI中driver模型
            UEFI實戰(6) 文件讀寫
            UEFI實戰(7) Hii interface 之 Form
            UEFI實戰(8) Hii interface 之 String 和Font
            UEFI實戰(9) GUI
            UEFI實戰(10) Network

            UEFI 實戰(1)
            配置開發環境
            1. 下載 Windows SDK
            2. 下載EDK2 
            3. 打開visual studio 2008 command prompt 
                cd EDK2
                edksetup.bat
            4. 編輯Conf\taget.txt, 修改 編譯工具TOOL_CHAIN_TAG        為
               TOOL_CHAIN_TAG        = VS2008x86
            5. build
                build命令有兩個參數, -a 和-p, -a 用來選擇平臺(IA32 X64,...) -p用來選擇要編譯的package,默認的package是Nt32Pkg, 所以build命令與 build -a IA32 -p Nt32Pkg\Nt32Pkg.dsc 等同,用來編譯UEFI模擬器。
            6. build run
                與build -a IA32 -p Nt32Pkg\Nt32Pkg.dsc run 命令等同,用來運行UEFI模擬器。
             
            制作UEFI USB啟動盤
            分兩種情況,如果目標平臺是UEFI平臺,按如下步驟來做:
            1。 格式化U盤為FAT(FAT,FAT16, FAT32)格式 
            2。 在U盤上建立目錄 efi\boot
            3。 將efi的應用程序 copy到 efi\boot 目錄,并改名為bootx64.efi 或者bootia32.efi。
                  因為UEFI的啟動文件是FAT盤內efi\boot目錄里的bootx64.efi 或bootia32.efi, 與legacy bios需要MBR來引導OS不同。
            如果目標平臺是legacy bios, 需要在U盤中制作MBR和引導文件, 按如下步驟來做:
            1。 編譯duet package
                  build -a IA32 -p DuetPkg\DuetPkgIa32.dsc 或者
                  build -a X64 -p DuetPkg\DuetPkgX64.dsc
            2。 生成引導文件
                  cd DuetPkg
                  postbuild.bat Ia32 或者 postbuild.bat X64
            3。 插入U盤,假設J:是U盤, 向U盤寫入MBR
                  createbootdisk usb J: FAT32 IA32 或者 createbootdisk usb J: FAT32 X64     
            4。拔出并重新插入U盤, 向U盤copy UEFI文件
                  createbootdisk usb J: FAT32 IA32 step2 或者 createbootdisk usb J: FAT32 X64 step2
                  此命令向U盤根目錄copy了efildr20, 該文件用于引導系統進入UEFI環境,并向efi\boot目錄copy了引導文件bootia32.efi或bootx64.efi
            接下來就可以用U盤來運行UEFI了。
             
            如何Debug
            UEFI有兩種debug方式,一是在模擬環境Nt32Pkg下debug,另一種是通過串口調試真實環境中的UEFI程序。我從來沒見過傳說中的利用串口調試,所以下面只能說說Nt32Pkg下的debug。
            在需要調試的代碼前面加入_asm int 3; 編譯,然后再模擬環境中(Nt32Pkg)中運行該程序,當模擬器執行到int 3;指令時,會彈出對話框,然后就可以調試了。

            Feedback

            # re: UEFI實戰(1)  回復  更多評論   

            2011-12-05 14:15 by 王子
            您好,看到你寫UEFI,知道你是這方面的專家,我這里有個問題需要請教 :怎么得到GPT分區表? 怎么讀寫里面的數據? 能用vs實現嗎?

            # re: UEFI實戰(1)  回復  更多評論   

            2011-12-06 00:00 by djx_zh
            UEFI會為每一個分區創建一個controller, 也會為每個硬盤創建一個controller. 通過安裝到controller上的DiskIo protocol可以讀寫每一個扇區。
            每個controller上有DevicePath protocol, 你可以通過DevicePath判斷該controller是一個扇區,還是一個硬盤。扇區的DevicePath的的最后一個有效Node是HD(SPEC 9.3.6.1)。
            當你獲得了GPT硬盤的DiskIo之后,可以利用DiskIo讀第一個扇區(第0個是MBR或者Protective MBR)得到GPT header,第2~33分區存放的是EFI_PARTITION_ENTRY。 GPT用到的數據結構在MdePkg/Include/Uefi/UefiGpt.h中,GPT的格式可以參考UEFI SPEC 第5章。
            可以用VS實現。

            # re: UEFI實戰(1)  回復  更多評論   

            2012-03-09 14:54 by ningle
            very very good,希望博主能把2、5、7、9、10部分也一同貼上來,特別第2,5部分,因為我沒有入門了,這方面的中文資料太少了,難得遇到博主這么精通的

            # re: UEFI實戰(1)  回復  更多評論   

            2012-03-12 07:20 by djx_zh
            @ningle
            謝謝關注。這幾部分還沒寫,我盡快寫吧。如果看到寫的有不準確的地方,也請告訴我啊。

            # re: UEFI實戰(1)  回復  更多評論   

            2012-10-04 15:05 by zboydong
            博主能不能寫一篇關于duet的

            # re: UEFI實戰(1)  回復  更多評論   

            2013-01-24 08:00 by howard
            Hi 博主,你的文章讓我受益匪淺!我按照你的流程做UEFI 的USB啟動盤,現在boot 成功了,可是發現shell 少了一些commands, 比如devices.之前我在OS上直接build run就可以看到那些指令,這是為什么?請博主指點!

            # re: UEFI實戰(1)  回復  更多評論   

            2013-01-24 09:24 by howard
            補充下,我的目標平臺是legacy bios

            # re: UEFI實戰(1)  回復  更多評論   

            2013-01-24 22:15 by djxzh
            @howard
            你用的是EDK2預先編譯好的shell,這個shell比較老。 你可以自己編譯ShellPKg,然后用shell.efi 覆蓋掉U盤上的bootx64.efi

            # re: UEFI實戰(1)  回復  更多評論   

            2013-01-25 06:23 by howard
            贊! 現在可以了。可是UEFI找不到設備,只能看到這個USB盤,其他attached的drives 和Pcie device 都看不到,是device驅動不對嗎?

            # re: UEFI實戰(1)  回復  更多評論   

            2013-01-25 22:36 by djxzh
            @howard
            不知你想找什么設備呢? EDK2 只提供了有限的幾種device driver, 部分網卡的driver可以到intel網站上下載。

            # re: UEFI實戰(1)[未登錄]  回復  更多評論   

            2013-11-12 15:15 by Jerry
            樓主是這方面的專家,我想問一下樓主,GPT磁盤中有MBR中所謂的活動分區概念嗎,GPT磁盤的系統啟動和MBR磁盤的啟動有什么區別嗎,GPT不是尋找活動分區來啟動操作系統嗎?謝謝樓主!

            # re: UEFI實戰(1)[未登錄]  回復  更多評論   

            2013-11-17 23:12 by djx_zh
            @Jerry
            UEFI 完成硬件初始化后,會遍歷GPT硬盤中的FAT分區,從FAT分區找到efi/boot/bootia32.efi 或efi/boot/bootx64.efi, 操作系統的啟動由bootx64.efi或bootia32.efi完成。
            MBR硬盤啟動代碼以二進制形式放在活動分區指定的地方。GPT硬盤的啟動代碼是完整的應用程序,存放在啟動分區即FAT分區的efi/boot目錄下

            # re: UEFI實戰(1)  回復  更多評論   

            2015-10-21 13:44 by 馬天橫
            我通過 build -a X64 -p Nt32Pkg\Nt32Pkg.dsc 命令創建但是出錯了!錯誤信息是:MSVCRTD.lib(crtexe.obj):error LNK2001:無法解析的外部符號__imp_EncodePointer

            # re: UEFI實戰(1)[未登錄]  回復  更多評論   

            2015-10-21 21:59 by djx_zh
            @馬天橫
            Nt32Pkg只支持-a IA32

            # re: UEFI實戰(1)  回復  更多評論   

            2015-12-21 12:20 by daisy
            為什么我build x64就成功了~build -p NT32Pkg\NT32Pkg.dsc -a X64

            # re: UEFI實戰(1)  回復  更多評論   

            2016-03-19 17:59 by yayake
            我運行 build命令沒報錯,可運行 build -a X64 -p Nt32Pkg\Nt32Pkg.dsc 命令時,出現了兩個uefi模擬器的窗口,而且shell階段打印了大量的亂碼,之后直接卡死了, 我用的edk版本是“UDK2015.Complete.MyWorkSpace”。
            久久久久久久精品妇女99| 久久久久九国产精品| 免费精品久久久久久中文字幕| 亚洲欧洲日产国码无码久久99| 久久精品国产只有精品66| 久久久国产精品福利免费| 久久无码人妻一区二区三区 | 波多野结衣AV无码久久一区| 国产日韩久久久精品影院首页| 国产精品天天影视久久综合网| 亚洲AV乱码久久精品蜜桃| 99久久无色码中文字幕人妻| 亚洲日韩欧美一区久久久久我 | 久久久久人妻精品一区三寸蜜桃| 国内精品久久九九国产精品| 国产一级做a爰片久久毛片| 青青青青久久精品国产h| 青青草原综合久久| 99久久亚洲综合精品成人| 国产麻豆精品久久一二三| 久久久久久久久无码精品亚洲日韩 | 久久国产精品成人影院| 国产成人无码久久久精品一| 日本道色综合久久影院| 久久本道久久综合伊人| 久久精品夜色噜噜亚洲A∨| 欧洲国产伦久久久久久久| 久久久这里有精品| 久久天天躁狠狠躁夜夜网站| 99热成人精品热久久669| 一本大道久久a久久精品综合| 久久99久久成人免费播放| 欧美久久久久久午夜精品| 久久婷婷五月综合国产尤物app | 狠狠综合久久综合中文88| 亚洲精品乱码久久久久久蜜桃| 日日躁夜夜躁狠狠久久AV| 91精品观看91久久久久久 | 久久久久久精品免费免费自慰| 欧美午夜精品久久久久免费视| 久久香蕉一级毛片|