日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

第一章--最小的“操作系统”

發(fā)布時間:2025/6/15 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一章--最小的“操作系统” 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、最簡單的“操作系統(tǒng)”

最最簡單的“操作系統(tǒng)”就是一個最最簡單的引導扇區(qū)(Boot Sector)。雖然它不具有任何功能,但是它卻能夠直接在裸機上運行,不依賴其他軟件。一個引導扇區(qū)是512個字節(jié),并且以0xAA55為結束標識的扇區(qū)。下面就是那個最最簡單的引導扇區(qū)。

[cpp] view plaincopy
  • org?07C00h??????????????????????????;?告訴編譯器程序加載到07C00處??
  • ???????mov?ax,?cs??
  • ???????mov?ds,?ax??
  • ???????mov?es,?ax??
  • ???????call?DispStr?????????????????????;?調用顯示字符串例程??
  • ???????jmp?$????????????????????;?無限循環(huán)??
  • DispStr:??
  • ???????mov?ax,?BootMessage??
  • ???????mov?bp,?ax???????????????????????;?es:bp?=?串地址??
  • ???????mov?cx,?16???????????????????????;?cx?=?串長度??
  • ???????mov?ax,?01301h???????????????;?ah?=?13,?al?=?01h??
  • ???????mov?bx,?000Ch????????????????;?頁號為0(bh?=?0)?黑底紅字?(bl?=?0Ch,高亮)??
  • ???????mov?dl,?0??
  • ???????int?10h??????????????????????????;?10h號中斷??
  • ???????ret??
  • BootMessage:??db?"Hello,OS?world!"??
  • times?510-($-$$)???db???0???????????????;?填充剩下的空間,使生成的二進制代碼恰好為512字節(jié)??
  • dw?0xaa55???????????????????????????????;?結束標志??
  • 1、org 07C00h

    org偽指令: org + 數(shù)值表達式

    其中,org是操作碼,不可省略。數(shù)值表達式給出偏移地址值,即org語句后的指令或數(shù)據(jù)以數(shù)值表達式給出的值作為起始的偏移地址。數(shù)值表達式必須是一個可計算得到的正整數(shù),數(shù)值范圍在0~65535之間。

    org偽指令用來指出其后的程序段或數(shù)據(jù)塊存放的起始地址的偏移量。匯編程序匯編時把語句中表達式的值作為起始地址,連續(xù)存放org語句之后的程序和數(shù)據(jù),直到出現(xiàn)一個新的org指令。若省略org語句,則從本段起始地址開始連續(xù)存放。

    在大多數(shù)情況下,不需要用org語句設置位置指針。由于段定義語句是段的起點,它的偏移地址為0000H,以后每分配一個字節(jié),位置指針自動加1,所以每條指令都有確定的偏移地址。只有程序要求改變這個位置指針時,才需要安排org語句。通常org語句可以出現(xiàn)在程序中任何位置上。 ??

    org示例:

    在數(shù)據(jù)段中依次定義以下變量,由于此時沒有使用org語句,則變量word1的偏移地址為0。
    word1 DW ?1234h
    byte1 ?DB ? 56h
    word2 DW ?abcdh
    其在數(shù)據(jù)段中word1,byte1,word2的存儲位置如下圖所示(采用小端存儲,按單字節(jié)對齊)。


    在數(shù)據(jù)段中依次定義以下變量,由于此時使用org語句,則變量word1的偏移地址為1。
    org 0001h
    word1 DW ?1234h
    byte1 ?DB ? 56h
    word2 DW ?abcdh
    其在數(shù)據(jù)段中word1,byte1,word2的存儲位置如下圖所示(采用小端存儲,按單字節(jié)對齊)。

    我們知道編譯器本身在匯編時對指令的地址計算是相對地址,而對于引導扇區(qū),是按絕對地址執(zhí)行,那么對于用相對地址編譯的執(zhí)行碼就要換算成絕對地址。一般而言,“真實開始執(zhí)行的引導扇區(qū)”都會固定裝載到07C00h處。

    由于編譯器在編譯時的地址是從第一行開始用0000h開始相對計算的,而且我們要寫的是“引導扇區(qū)”程序,所以我們要將下面的代碼加載到地址07C00h處,所以我們需要org 07C00h,通過該偽指令,將代碼和數(shù)據(jù)加載到07C00h地址。

    2、jmp $

    $被稱為當前位置計數(shù)器

    在匯編程序對源程序進行匯編的過程中,使用地址計數(shù)器來保證當前正在匯編的指令地址。地址計數(shù)器值可用“$”來表示,匯編語言也允許用戶直接用“$”來引用地址計數(shù)器的當前值,因此,org $+5可表示從當前地址開始跳過5個字節(jié)存儲單元,在指令和偽指令中,也可直接用“$”表示地址計數(shù)器的當前值。故jmp $進入了一個無限循環(huán)。

    3、int ?10h

    int ?10H號中斷

    int 10H 是由BIOS 對屏幕及顯示器所提供的服務程序。使用int 10H 中斷服務程序時,先指定 AH 寄存器為下表編號其中之一,該編號表示欲調用的功用,而其他寄存器的詳細說明,參考表后文字,當一切設定好之后再調用 int 10H。

    在這里我們只詳細講解本程序中的10號中斷。由于ah=13,故調用編號為13的功能:即顯示字符串。其中ES:BP=串地址,CX=串長度 ,AH=13,當AL=01h時,光標會跟隨顯示移動。BH為頁號,BH=0表示頁號為0,BL=0CH,表示屬性,即黑底紅字高亮。因此在調用10號中斷之前,無非就是對各個寄存器進行初始化。

    關于10號中斷的其他信息,請參考 http://blog.csdn.net/yes_life/article/details/6778834

    4、times 510-($-$$) ?db ?0

    times:重復指令或數(shù)據(jù)

    times前綴引起指令被匯編多次。其中

    執(zhí)510?($? )次。也就是用0來填充剩下的空間,達到510字節(jié)。

    二、如何運行該“操作系統(tǒng)”

    1、環(huán)境準備

    (1)計算機操作系統(tǒng)(Windows)
    (2)虛擬機(VMware)
    (3)匯編編譯器(NASM)
    (3)軟盤(虛擬軟盤RamDiskNT)
    (4)rawrite.exe/本書光盤自帶OS/Tools/FloppyWriter,負責將程序寫入到軟盤。

    2、編譯boot.asm

    將上述代碼文件命名為boot.asm,然后使用nasm命令編譯該文件。
    nasm boot.asm –o boot.bin

    3、虛擬軟盤A


    點擊Start之后,查看“我的電腦”里是否有虛擬軟盤A,如果沒有,重啟。

    4、將boot.bin寫入到軟盤A


    點擊Enter。(注意boot.bin與Rawrite.ext在同一文件目錄下)。

    5、創(chuàng)建虛擬機

    安裝VMware,在VMware創(chuàng)建一個虛擬機,命名為Tinix,并設置系統(tǒng)引導盤為軟盤A。


    啟動該系統(tǒng),得出結果圖為:


    三、本操作系統(tǒng)啟動流程

    打開計算機電源;加電自檢(POST);尋找啟動盤,該系統(tǒng)設置從軟盤啟動,計算機檢查軟盤的0面0磁道1扇區(qū),如果發(fā)現(xiàn)它以0xAA55結束,則BIOS會認為它是一個引導扇區(qū);BIOS將該512字節(jié)扇區(qū)內(nèi)容加載到內(nèi)存地址0000:7c00;跳轉到0000:7C00出將控制權交給這段引導代碼。到此為止,計算機不再由BIOS中固有的程序來控制,而變成由操作系統(tǒng)的一部分來控制。

    總結

    以上是生活随笔為你收集整理的第一章--最小的“操作系统”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。