如何读emmc里的引导程序_自制操作系统学习1 引导程序
本系列學(xué)習(xí)有前面的匯編學(xué)習(xí)基礎(chǔ)最好,如果沒(méi)有影響也不大本系列學(xué)習(xí)主要資源來(lái)自《[30天自制操作系統(tǒng)].(川合秀實(shí))》,《自己動(dòng)手寫(xiě)操作系統(tǒng)》兩本書(shū)
一、準(zhǔn)備工作
- bochs
- virtualbox,windows虛擬機(jī)
- nasm
二、操作流程
回顧前文的程序,我們的引導(dǎo)程序已經(jīng)可以加載軟盤(pán)的10個(gè)柱面的數(shù)據(jù)到內(nèi)存的 0x0820 處,引導(dǎo)區(qū)本身的512字節(jié)由BIOS加載到0x8200處。
這一節(jié)讓程序從這些數(shù)據(jù)中找到軟盤(pán)上的程序,并運(yùn)行其中的程序。
下面程序的重點(diǎn)是加載文件后,程序所在位置。通過(guò)前一節(jié)可以知道:
- 文件名在磁盤(pán)的是 0x2600處
- 文件內(nèi)容在磁盤(pán)的0x4200處
- 磁盤(pán)的內(nèi)容加載到內(nèi)存的0x8000處
- 所以磁盤(pán)的0x4200處的內(nèi)容在 內(nèi)存的 0x8000+0x4200=0xc200處
1. 修改程序
;%define _BOOT_DEBUG_ ; 做Boot Sector時(shí)把這行注釋掉 ; 啟用這行就用nasm Boot.asm -o Boot.com生成.com文件用于調(diào)試%ifdef _BOOT_DEBUG_ org 0100h%else org 07c00h%endifCYLS EQU 10 ; 一共讀取10個(gè)柱面, 共 10柱面*2面*18扇區(qū)*512字節(jié) = 184320 byte = 180K; 把軟盤(pán)按Fat12格式填充start: JMP init ; 跳轉(zhuǎn)指令 DB 0x90 ; 空 DB,DD用來(lái)寫(xiě)單字節(jié) DB "NotOneOS" ; 廠商名,8字節(jié),DB用來(lái)寫(xiě)雙字節(jié) DW 512 ; 每個(gè)扇區(qū)大小512字節(jié),DW用來(lái)寫(xiě)4字節(jié) DB 1 ; 每個(gè)簇的扇區(qū)數(shù) DW 1 ; Boot占的扇區(qū) DB 2 ; 有2個(gè)FAT表 DW 224 ; 根目錄大小224 DW 2880 ; 磁盤(pán)扇區(qū)總數(shù) 2880 DB 0xf0 ; 介質(zhì)描述符,磁盤(pán)種類(lèi)必須為0xf0 DW 9 ; 每個(gè)FAT扇區(qū)數(shù) DW 18 ; 每個(gè)磁道18個(gè)扇區(qū) DW 2 ; 2個(gè)磁頭 DD 0 ; 隱藏扇區(qū)數(shù) DD 2880 ; 同上,磁盤(pán)大小 DB 0, 0, 0x29 ; 0x29 擴(kuò)展引用標(biāo)記 DD 0xffffffff ; 無(wú)意義,固定這么寫(xiě) DB "NotOneOS " ; 磁盤(pán)名(卷標(biāo)),11字節(jié) DB "FAT12 " ; 磁盤(pán)格式名,8字節(jié) RESB 18 ; 空18個(gè)字節(jié),填充0x00init: MOV AX,0 MOV SS,AX MOV SP,0x7c00 ; 堆棧空間,從0x7c00向前 MOV DS,AX; 讀取磁盤(pán) MOV AX,0x0820 ; 把磁盤(pán)數(shù)據(jù)加載到內(nèi)存0x0820處。 0x8000~0x81ff的512字節(jié)給啟動(dòng)區(qū)用的,所以從0x8200開(kāi)始 MOV ES,AX ; 注意 ES:BX 是指向的地址,后面還需要對(duì)BX賦值0; 初始化磁盤(pán)接口 MOV CH,0 ; 柱面 0 MOV DH,0 ; 磁頭 0 MOV CL,2 ; 扇區(qū) 2readloop: MOV SI,0 ; 記錄失敗次數(shù)retry: MOV AH,0x02 ; 0x02 讀磁盤(pán) MOV AL,1 ; 讀1個(gè)扇區(qū) MOV BX,0 MOV DL,0x00 ; A驅(qū)動(dòng)器 INT 0x13 ; BIOS 讀磁盤(pán)功能 JNC next ; 成功跳轉(zhuǎn) ADD SI,1 ; 失敗加一次 CMP SI,5 ; 到5次就跳到error JAE error MOV AH,0x00 ; 復(fù)位磁盤(pán)功能 MOV DL,0x00 ; A 驅(qū)動(dòng)器 INT 0x13 ; 重置磁盤(pán)驅(qū)動(dòng)器 JMP retry ; 重試 next: MOV AX,ES ; 內(nèi)存地址向后移動(dòng)0x0020 ADD AX,0x0020 MOV ES,AX ; 通過(guò)AX給ES加0x0020 ADD CL,1 ; 扇區(qū)+1 CMP CL,18 ; 有沒(méi)有到18個(gè)扇區(qū) JBE readloop ; CL<=18,就跳到 readloop MOV CL,1 ADD DH,1 CMP DH,2 JB readloop ; 如果 DH < 2 ,則跳到readloop MOV DH,0 ADD CH,1 CMP CH,CYLS JB readloop ; 如果CH2. 編譯,生成鏡像
make img3. 在Win7虛擬機(jī)中打開(kāi)A盤(pán),裝載鏡像
把NotOneOs.sys拷到A盤(pán):
再移除虛擬盤(pán):
三、啟動(dòng)鏡像
這時(shí)候boot.img里包含了啟動(dòng)的NotOneOs.sys程序,使用bochs加載運(yùn)行:
# 這里進(jìn)入調(diào)試狀態(tài),以確定是否運(yùn)行了NotOneOs.sys程序make debug b 0x7c00cs通過(guò)反匯編,可以找到我們的重點(diǎn)代碼位置:
u 0x7c00 0x7cff
在0x7cca處設(shè)置斷點(diǎn): b 0x7cca
查看現(xiàn)在寄存器的值:
rdx的值里看到 DH確實(shí)為1,再次單步運(yùn)行,程序跳轉(zhuǎn)到了0xc200:
而0xc200處正是NotOneOs.sys的程序:
后面的重心終于可以跳到C語(yǔ)言了。
總結(jié)
以上是生活随笔為你收集整理的如何读emmc里的引导程序_自制操作系统学习1 引导程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows7专业版_windows7
- 下一篇: ifs 报表开发手册_房地产开发资质要求