在存儲介質(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兼容機的具體啟動過程如下: 在格式化硬盤安裝好Windows后,硬盤第一個扇區(qū)(引導區(qū))包含MBR引導代碼,BIOS在加載MBR代碼后,MBR開始檢查硬盤中是否存在活動分區(qū)(含引導程序的分區(qū)),如果存在活動分區(qū),則加載位于那個分區(qū)的引導程序(通常稱為VBR,與操作系統(tǒng)相關),然后執(zhí)行它。VBR的主要功能是加載操作系統(tǒng)的內(nèi)核。 了解了相關知識,我們?nèi)绾尉帉懸粋€打印Hello World的引導程序呢? 需要準備的工具: 具體步驟: ;------------------------------------------------------------.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文件的目錄)。鍵入下面命令: 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了!
相關資料: |
|