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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

如何读emmc里的引导程序_自制操作系统学习1 引导程序

發(fā)布時間:2025/10/17 102 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何读emmc里的引导程序_自制操作系统学习1 引导程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本系列學(xué)習(xí)有前面的匯編學(xué)習(xí)基礎(chǔ)最好,如果沒有影響也不大本系列學(xué)習(xí)主要資源來自《[30天自制操作系統(tǒng)].(川合秀實)》,《自己動手寫操作系統(tǒng)》兩本書

一、準(zhǔn)備工作

  • bochs
  • virtualbox,windows虛擬機(jī)
  • nasm

二、操作流程

回顧前文的程序,我們的引導(dǎo)程序已經(jīng)可以加載軟盤的10個柱面的數(shù)據(jù)到內(nèi)存的 0x0820 處,引導(dǎo)區(qū)本身的512字節(jié)由BIOS加載到0x8200處。
這一節(jié)讓程序從這些數(shù)據(jù)中找到軟盤上的程序,并運行其中的程序。

下面程序的重點是加載文件后,程序所在位置。通過前一節(jié)可以知道:

  • 文件名在磁盤的是 0x2600處
  • 文件內(nèi)容在磁盤的0x4200處
  • 磁盤的內(nèi)容加載到內(nèi)存的0x8000處
  • 所以磁盤的0x4200處的內(nèi)容在 內(nèi)存的 0x8000+0x4200=0xc200處

1. 修改程序

;%define _BOOT_DEBUG_ ; 做Boot Sector時把這行注釋掉 ; 啟用這行就用nasm Boot.asm -o Boot.com生成.com文件用于調(diào)試%ifdef _BOOT_DEBUG_ org 0100h%else org 07c00h%endifCYLS EQU 10 ; 一共讀取10個柱面, 共 10柱面*2面*18扇區(qū)*512字節(jié) = 184320 byte = 180K; 把軟盤按Fat12格式填充start: JMP init ; 跳轉(zhuǎn)指令 DB 0x90 ; 空 DB,DD用來寫單字節(jié) DB "NotOneOS" ; 廠商名,8字節(jié),DB用來寫雙字節(jié) DW 512 ; 每個扇區(qū)大小512字節(jié),DW用來寫4字節(jié) DB 1 ; 每個簇的扇區(qū)數(shù) DW 1 ; Boot占的扇區(qū) DB 2 ; 有2個FAT表 DW 224 ; 根目錄大小224 DW 2880 ; 磁盤扇區(qū)總數(shù) 2880 DB 0xf0 ; 介質(zhì)描述符,磁盤種類必須為0xf0 DW 9 ; 每個FAT扇區(qū)數(shù) DW 18 ; 每個磁道18個扇區(qū) DW 2 ; 2個磁頭 DD 0 ; 隱藏扇區(qū)數(shù) DD 2880 ; 同上,磁盤大小 DB 0, 0, 0x29 ; 0x29 擴(kuò)展引用標(biāo)記 DD 0xffffffff ; 無意義,固定這么寫 DB "NotOneOS " ; 磁盤名(卷標(biāo)),11字節(jié) DB "FAT12 " ; 磁盤格式名,8字節(jié) RESB 18 ; 空18個字節(jié),填充0x00init: MOV AX,0 MOV SS,AX MOV SP,0x7c00 ; 堆棧空間,從0x7c00向前 MOV DS,AX; 讀取磁盤 MOV AX,0x0820 ; 把磁盤數(shù)據(jù)加載到內(nèi)存0x0820處。 0x8000~0x81ff的512字節(jié)給啟動區(qū)用的,所以從0x8200開始 MOV ES,AX ; 注意 ES:BX 是指向的地址,后面還需要對BX賦值0; 初始化磁盤接口 MOV CH,0 ; 柱面 0 MOV DH,0 ; 磁頭 0 MOV CL,2 ; 扇區(qū) 2readloop: MOV SI,0 ; 記錄失敗次數(shù)retry: MOV AH,0x02 ; 0x02 讀磁盤 MOV AL,1 ; 讀1個扇區(qū) MOV BX,0 MOV DL,0x00 ; A驅(qū)動器 INT 0x13 ; BIOS 讀磁盤功能 JNC next ; 成功跳轉(zhuǎn) ADD SI,1 ; 失敗加一次 CMP SI,5 ; 到5次就跳到error JAE error MOV AH,0x00 ; 復(fù)位磁盤功能 MOV DL,0x00 ; A 驅(qū)動器 INT 0x13 ; 重置磁盤驅(qū)動器 JMP retry ; 重試 next: MOV AX,ES ; 內(nèi)存地址向后移動0x0020 ADD AX,0x0020 MOV ES,AX ; 通過AX給ES加0x0020 ADD CL,1 ; 扇區(qū)+1 CMP CL,18 ; 有沒有到18個扇區(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 ; 如果CH

2. 編譯,生成鏡像

make img

3. 在Win7虛擬機(jī)中打開A盤,裝載鏡像


把NotOneOs.sys拷到A盤:

再移除虛擬盤:

三、啟動鏡像

這時候boot.img里包含了啟動的NotOneOs.sys程序,使用bochs加載運行:

# 這里進(jìn)入調(diào)試狀態(tài),以確定是否運行了NotOneOs.sys程序make debug b 0x7c00cs

通過反匯編,可以找到我們的重點代碼位置:

u 0x7c00 0x7cff


在0x7cca處設(shè)置斷點: b 0x7cca


查看現(xiàn)在寄存器的值:

<21> rrax: 00000000_00000e00rbx: 00000000_0000000frcx: 00000000_00090a01rdx: 00000000_00000100rsp: 00000000_00007c00rbp: 00000000_00000000rsi: 00000000_000e7ce8rdi: 00000000_0000ffac21>

rdx的值里看到 DH確實為1,再次單步運行,程序跳轉(zhuǎn)到了0xc200:


而0xc200處正是NotOneOs.sys的程序:


后面的重心終于可以跳到C語言了。

總結(jié)

以上是生活随笔為你收集整理的如何读emmc里的引导程序_自制操作系统学习1 引导程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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