久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    如何編寫引導程序 Hello World

     絲廣里 2019-01-21

      在存儲介質(zhì)(硬盤、軟盤、光盤)中有一塊特殊的區(qū)域,叫做引導區(qū)。在計算機啟動后,BIOS會讀取引導區(qū)內(nèi)的代碼到內(nèi)存中去,然后將執(zhí)行這些代碼。引導區(qū)的位置和大小與計算機的平臺有關,對于IBM-PC兼容機,引導區(qū)位于存儲介質(zhì)的第一個扇區(qū),大小為512字節(jié)。位于引導區(qū)內(nèi)的代碼就稱為引導程序。引導區(qū)內(nèi)是否含有引導程序由引導區(qū)內(nèi)的標記標識。對于IBM-PC兼容機,如果引導區(qū)內(nèi)的最后兩個字節(jié)為0x55,0xAA,則BIOS檢測程序認為引導區(qū)內(nèi)包含引導程序。引導程序并不一定要實現(xiàn)加載操作的功能,它可以是任何程序。

    IBM-PC兼容機的具體啟動過程如下:
      1.按下計算機的電源鍵后,x86 CPU就開始在實模式下運行位于物理地址0xFFFFFFF0(通常這個地址是指向的是位于ROM中的BIOS的入口點)處的指令,這個指令是一個跳轉(zhuǎn)指令,跳轉(zhuǎn)到BIOS的啟動程序。啟動程序運行硬件檢測和初始化操作。
      2.在初始化所需要的硬件后,BIOS就依據(jù)設定的啟動順序遍歷存儲設備,直到找到一個可引導的設備。一個可引導的存儲設備是引導區(qū)內(nèi)包含引導程序。BIOS通過檢查引導區(qū)的最后兩個字節(jié)是否為0x55,0xAA來判斷引導區(qū)內(nèi)是否包含引導程序。
      3.一旦BIOS找到了可引導的設備,它就加載引導區(qū)代碼到內(nèi)存物理地址的0x7C00(通常是Segment:Offset 0000h:7C00h,也有些BIOS07C0h:0000h),之后BIOS將控制權交給引導程序,CPU開始執(zhí)行引導程序,引導程序開始加載操作系統(tǒng)內(nèi)核或者其他。

      在格式化硬盤安裝好Windows后,硬盤第一個扇區(qū)(引導區(qū))包含MBR引導代碼,BIOS在加載MBR代碼后,MBR開始檢查硬盤中是否存在活動分區(qū)(含引導程序的分區(qū)),如果存在活動分區(qū),則加載位于那個分區(qū)的引導程序(通常稱為VBR,與操作系統(tǒng)相關),然后執(zhí)行它。VBR的主要功能是加載操作系統(tǒng)的內(nèi)核。

    了解了相關知識,我們?nèi)绾尉帉懸粋€打印Hello World的引導程序呢?

    需要準備的工具:
      文本編輯軟件、MASM編譯器(我采用的是VS2008自帶的ML 9.0)、16位Link程序、VMWare、PE(用于格式化VMWare創(chuàng)建的虛擬磁盤)、NtExplorer

    具體步驟:
      1. 打開你習慣使用的文本編輯器,編寫下面代碼。因為BIOS會將我們的引導程序加載到內(nèi)存地址的7C00h處,所以我們需要org指令設置我們代碼指令的地址值。

    復制代碼
    ;------------------------------------------------------------.286 ; CPU type;------------------------------------------------------------.model TINY ; memory of model;------------------------------------------------------------ ;----------------------- CODE SEGMENT -----------------------.code org 07c00h ; for BootSectormain: jmp short start ; go to main nop;--------------------- Print a char on the screen ------------PrintChar PROC mov ah, 0Eh ;Tell BIOS that we need to print one charater on screen. mov bh, 0h ;Page no. mov bl, 07h ;Text attribute 0x07 is lightgrey font on black background int 10h ;Call video interrupt retPrintChar ENDP;------------------- Print a String on the screen -------------PrintStr PROCnext_character: ;Lable to fetch next character from string mov al, [si] ;Get a byte from string and store in AL register inc si ;Increment SI pointer or al, al ;Check if value in AL is zero (end of string) jz exit_function ;If end then return call PrintChar ;Else print the character which is in AL register jmp next_character ;Fetch next character from stringexit_function: ;End label retPrintStr ENDPstart: cli ; Clear interrupt flags mov ax,cs ; Setup segment registers mov ds,ax ; Make DS correct mov es,ax ; Make ES correct mov ss,ax ; Make SS correct mov bp,7c00h mov sp,7c00h ; Setup a stack sti helloString BYTE 'Hello World!', 0 mov si, offset helloString call PrintStr ; Print the 'Hello World!' string ret BYTE 510 - ($ - main) DUP(0) ; Fill the reminder of the first sector with zeros BYTE 55h, 0AAh ; Fill the last two bytes with 55h, 0AAh int the first sectorEND main ; End of program
    復制代碼

      2. 假設第一步中的代碼保存為BootLoader.asm,在BootLoader.asm的目錄下按住Shift,點擊鼠標右鍵,選擇在此處打開命令行(Windows 7系統(tǒng),其他系統(tǒng)請通過CD指令轉(zhuǎn)到BootLoader.asm文件的目錄)。鍵入下面命令:
                      ml /AT /omf /Fl /Fm /c BootLoader.asm
                      C:\Irvine\link6.exe /T /NOD BootLoader.obj
      如果提示找不到ml,請?zhí)砑悠渎窂降江h(huán)境變量(我的路徑為C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\ml.exe)。執(zhí)行完后,我們將得到BootLoader.com文件。

    編譯鏈接BootLoader.asm

       3. 使用VMware創(chuàng)建一個虛擬機,并新建一塊虛擬磁盤(大小1G,預先分配磁盤空間,存儲為單文件格式)。將新建的虛擬磁盤格式化為NTFS格式(使用PE或者其他工具)。右擊VMWare界面左邊的我們新建的虛擬機,進入設置->選中我們新建的磁盤->工具->映射(或者也可以通過菜單的文件->映射虛擬磁盤->映射),出現(xiàn)下面的對話框。去掉read-only的選項,然后點擊OK。

      4. 打開NtExplorer軟件,先進入Tools->Options,將安全模式改為Virtual Write。然后點擊菜單File->Drive,選擇Z盤。按F3鍵,進入16進制編輯模式。可以看到扇區(qū)0已經(jīng)有MBR代碼了。

      將光標位于00位置處,然后選擇菜單Edit->Paste from file,選擇我們之前生成的BootLoader.com文件。然后選擇Tools->Options,點擊Write->OK。

      5. 再次選擇我們新建的虛擬機,進入設置,取消磁盤的映射。然后點擊啟動虛擬機,你就可以看到Hello World了!

     

    相關資料:
      1. How to develop your own Boot Loader
      2. Writing Hello World Bootloader
      3. Boot sector

      本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
      轉(zhuǎn)藏 分享 獻花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 日本欧美大码a在线观看| 免费观看的AV毛片的网站| 又大又粗又硬又爽黄毛少妇| 无码人妻少妇久久中文字幕蜜桃| 中文字幕人妻精品在线| 亚洲性日韩精品一区二区三区 | 精品久久久久久无码国产| 99久久亚洲综合精品成人网| 国产中年熟女大集合| 猫咪AV成人永久网站在线观看| 国产成人午夜福利院| 激情综合婷婷色五月蜜桃| 中出人妻中文字幕无码| 亚洲中文精品一区二区| 亚洲精品无码成人AV电影网| 精品一区二区中文字幕| 成码无人AV片在线电影网站| 国产美女高潮流白浆视频| 高大丰满熟妇丰满的大白屁股| 久久AV无码精品人妻糸列| AV喷水高潮喷水在线观看COM| 内射毛片内射国产夫妻| 四川丰满少妇A级毛片| 亚洲AV永久无码精品主页| 久久天天躁狠狠躁夜夜2020老熟妇| 无码乱人伦一区二区亚洲| 无码成人午夜在线观看 | 又大又粗又硬又爽黄毛少妇| 无码AV无码免费一区二区| 国产高清不卡一区二区| 国产MD视频一区二区三区| 国产精品国产三级国快看| 久久精品国产免费观看三人同眠| 美乳丰满人妻无码视频| 亚洲国产成人无码网站| 亚洲自偷自拍另类小说| 亚洲中文精品一区二区| 国产综合AV一区二区三区无码| 少妇太爽了在线观看免费视频| 亚洲欧美日韩在线码| 色婷婷婷亚洲综合丁香五月|