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