您的位置:首页 > 其它

30天自制操作系统U盘启动

2016-11-13 16:30 369 查看
之前在看这本书的时候,就想着做U盘启动,但是那时候知识有限,也是借助软驱从U盘启动的,实质上还是软盘启动。

这两天研究了下U盘启动,总算是成功了。晒张图,这张图是我从U盘启动后读取dx寄存器的二进制值:



方法一:

将启动区的代码编译好,用dd直接写进U盘的第一扇区,插入电脑启动。

方法二:

将启动区代码写好,用winhex打开我们编译后的映像文件,将512字节的代码复制到U盘的第一扇区(winhex打开U盘,将我们的512字节代码复制到第一扇区,然后保存,开机启动)

不过这两种方法,U盘在电脑上都会变成不可用的状态,打不开,也不能再存储任何文件,但是可以启动。

方法三:

在启动代码头部写入fat32文件系统信息,然后编译成映像文件,用UltraISO(启动盘制作工具)写入U盘,这种方法的好处是,因为我们写入了fat32的文件系统信息,系统便能识别这个设备是U盘,因而我们可以打开U盘也可以往里面存储其他文件而不影响启动。

注意:再启动的时候可能会出现一大串如下信息而导致不能启动:

 The system found unauthorized changes on the fimware, operating system or UEFI drivers...............

进入bios设置一下,选项卡“启动”里面有一栏“安全启动”选项,设置成其他操作系统就可以了。如图:



代码:

;miOS
ORG 0X7C00
JMP ENTRY
NOP

;文件系统设置
;BIOS PARAMETER BLOCK
DB "MSDOS5.0" ;OEM
DW 512 ;Bytes_per_sector
DB 32 ;Sectors_per_cluster
DW 38 ;Reserved_sectors
DB 2 ;Number_of_FATs
DW 0 ;Root_entries
DW 0 ;Sectors_small
DB 0XF8
DW 0
DW 63
DW 255
DD 0
DD 65536000

;FAT32 SECTION
DD 15993
DW 0
DW 0
DD 2
DW 1
DW 6
RESB 12
DB 0
DB 0
DB 0X29
DB 0X07
DB 0XD1
DB 0X99
DB 0X00
DB "HU-OS "
DB "FAT32-HU"

ENTRY:
MOV AX,0
MOV SS,AX
MOV SP,0X7C00
MOV DS,AX
MOV ES,AX
MOV SI,0

CALL GetDiskParam
JMP FIN

GetDiskParam:
MOV AH,0X08
INT 0X13

push dx
push ax
push bx
push si
PUSH SI
CALL SHOW16
pop si
pop bx
pop ax
pop dx
ret

SHOW16:
ROL DX,1
push ax
MOV AX,DX
AND AX,1
CMP AX,1
JE AA1
MOV AL,0x30
JMP BB1
AA1: MOV AL,0x31
BB1: MOV AH,0X0E
MOV BX,15
INT 0X10
pop ax
ADD ax,1
CMP ax,16
JB SHOW16
ret

FIN:
HLT
JMP FIN

RESB 510-($-$$)
DB 0X55,0XAA 头部的fat32文件信息是我通过winhex查看我自己的U盘得出的,不知道你们用你们自己的U盘用此代码能否正常启动,这里只授之以渔。
查看方法:

打开winhex=》查看=》模板管理=》boot sector fat32,弹出的便是你自己的U盘的参数,将这些参数写进代码就好了,不能写错,写错了可能会导致后面的程序不能正常运行。



另外还要注意的一点就是:头部必须要有一个jmp和一个nop,为什么呢 下面来看下U盘的第一扇区(U盘标识自己文件系统的代码):



EB是jmp,58是你函数的偏移量,90是nop(空指令),后面接着的便是哪些fat32的参数,所以必须要有一个jmp和一个nop,否则后面的参数的地址对不上那就出问题了。

写参数的时候注意每个参数所占的字节长度 不能错 ,错了会出问题,对着前面的偏移量来看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: