日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2025/10/17 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何读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 ; 如果CH

2. 編譯,生成鏡像

make img

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


把NotOneOs.sys拷到A盤:

再移除虛擬盤:

三、啟動鏡像

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

# 這里進入調試狀態,以確定是否運行了NotOneOs.sys程序make debug b 0x7c00cs

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

u 0x7c00 0x7cff


在0x7cca處設置斷點: b 0x7cca


查看現在寄存器的值:

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

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


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


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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。