作業系統全部筆記目錄見:
作業系統筆記整理
load_setup: //載入setup模組
mov dx,#0x0000 mov cx,#0x0002 mov bx,#0x0200
mov ax,#0x0200+setuplen int 0x13 //bios中斷
jnc ok_load_setup
mov dx,#0x0000
mov ax,#0x0000 //復位
int 0x13
j load_setup //重讀
0x13是bios讀磁碟扇區的中斷: ah=0x02-讀磁碟,al= 扇區數量(setuplen=4), ch=柱面號,cl=開始扇區(即cx的低八位,這裡是2,因為第乙個扇區是引導扇區,要從第2個扇區開始讀), dh=磁頭號,dl=驅動器號, es:bx=記憶體位址
讀磁碟讀到**?肯定是bootset的上面,bootset從90000開始,偏移512位元組,為90200。es:bx從上面的程式確實可以看出,是90200。
讀完四個扇區還需要讀進去作業系統。
ok_load_setup: //載入setup模組
mov dl,#0x00 mov ax,#0x0800 //ah=8獲得磁碟引數
int 0x13 mov ch,#0x00 mov sectors,cx
mov ah,#0x03 xor bh,bh int 0x10 //讀游標
mov cx,#24 mov bx,#0x0007
mov bp,#msg1 mov ax,#1301 int 0x10 //顯示字元
mov ax,#sysseg //sysseg=0x1000
mov es,ax
call read_it //讀入system模組
jmpi 0,setupseg
int 0x10 是顯示字元,bp告訴你要顯示的東西在記憶體中什麼區域,例如:
bootsect.s中的資料 //在檔案末尾
sectors: .word 0 //磁軌扇區數
msg1:.byte 13,10
.ascii 「loading system...」
.byte 13,10,13,10
肯定是要把字元列印到游標位置,所以前面有乙個讀游標位置的操作。
如果我們想替換一下字串,還需要改一些配置,例如如果mov cx,#24這裡的24表示要輸出的字元個數,則把前面的mov cx,#24修改一下。
boot的工作:讀setup, 讀system。注意,為什麼讀入 要跨越磁軌! system模組還需要定義乙個函式?
因為system模組可能很大,讀入要跨越磁軌。
read_it: mov ax,es cmp ax,#endseg jb ok1_read
retok1_read:
mov ax,sectors
sub ax,sread //sread是當前磁軌已讀扇區數,ax未讀扇區數
call read_track //讀磁軌...
endseg=sysseg+syssize syssize=0x8000 //該變數可根據 image大小設定(編譯作業系統時)
引導扇區的末尾 //bios用以識別引導扇區:
.org 510
.word 0xaa55 //扇區的最後兩個位元組
.org 510 指定乙個位址,後面的程式或資料從這個位址值開始分配,即以後語句從位址510(0x1fe)開始存放
.word 0xaa55 表示有效引導扇區標誌,供bios載入引導扇區使用
可以轉入setup執行了:
jmpi 0, setupseg
自己動手寫作業系統 編寫引導扇區
計算機電源開啟時,會先進行加點自檢 post 然後尋找啟動盤,如果選擇是從軟盤驅動,計算機就會檢查軟盤的0面0磁軌1扇區,如果它以0xaa55結束,則bios則認為它是乙個引導扇區。這一段 總共為512位元組。一旦bios發現來引導扇區,就會將這512位元組的內容裝載到記憶體中0000 7c00去,...
作業系統引導
1.系統開機或者重啟。2.bios 加電自檢 power on self test post bios執行記憶體位址為ffff 0000h 處的跳轉指令,跳轉到固化在rom中的自檢程式處,對系統硬體 包括記憶體 進行檢查。3.當bios檢查到硬體正常並與cmos 中的設定相符後,按照cmos 中對啟...
作業系統引導
作業系統是如何引導的呢?當系統加電自檢通過以後,硬碟被復位,bios 將根據使用者指定的啟動順序從軟盤 硬碟或光碟機進行啟動。以從硬碟啟動為例,系統 bios 將主引導記錄讀入記憶體。然後,將控制權交給主引導程式,然後檢查分割槽表的狀態,尋找活動的分割槽。最後,由主引導程式將控制權交給活動分割槽的引...