日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[reprint]如何编写引导程序 Hello World

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [reprint]如何编写引导程序 Hello World 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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

了解了相關知識,我們如何編寫一個打印Hello World的引導程序呢?

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

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

;------------------------------------------------------------ .286 ; CPU type ;------------------------------------------------------------ .model TINY ; memory of model ;------------------------------------------------------------ ;----------------------- CODE SEGMENT ----------------------- .code org 07c00h ; for BootSector main:jmp short start ; go to mainnop ;--------------------- Print a char on the screen ------------ PrintChar PROCmov 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 backgroundint 10h ;Call video interruptret PrintChar ENDP ;------------------- Print a String on the screen ------------- PrintStr PROC next_character: ;Lable to fetch next character from stringmov al, [si] ;Get a byte from string and store in AL registerinc si ;Increment SI pointeror al, al ;Check if value in AL is zero (end of string)jz exit_function ;If end then returncall PrintChar ;Else print the character which is in AL registerjmp next_character ;Fetch next character from string exit_function: ;End labelret PrintStr ENDPstart: cli ; Clear interrupt flagsmov ax,cs ; Setup segment registersmov ds,ax ; Make DS correctmov es,ax ; Make ES correctmov ss,ax ; Make SS correct mov bp,7c00hmov sp,7c00h ; Setup a stackstihelloString BYTE 'Hello World!', 0 mov si, offset helloString call PrintStr ; Print the 'Hello World!' stringretBYTE 510 - ($ - main) DUP(0) ; Fill the reminder of the first sector with zerosBYTE 55h, 0AAh ; Fill the last two bytes with 55h, 0AAh int the first sector END main ; End of program

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

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

  4. 打開NtExplorer軟件,先進入Tools->Options,將安全模式改為Virtual Write。然后點擊菜單File->Drive,選擇Z盤。按F3鍵,進入16進制編輯模式。可以看到扇區0已經有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

?

作者:?pzxbc 出處:?http://pzxbc.cnblogs.com/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

轉載于:https://www.cnblogs.com/hualiu0/p/5743872.html

總結

以上是生活随笔為你收集整理的[reprint]如何编写引导程序 Hello World的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。