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,否则后面的参数的地址对不上那就出问题了。
写参数的时候注意每个参数所占的字节长度 不能错 ,错了会出问题,对着前面的偏移量来看。
这两天研究了下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,否则后面的参数的地址对不上那就出问题了。
写参数的时候注意每个参数所占的字节长度 不能错 ,错了会出问题,对着前面的偏移量来看。
相关文章推荐
- 30天自制操作系统第八天学习笔记(u盘软盘双启动版本)
- 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记
- 30天自制操作系统——用U盘启动自制系统
- 30天自制操作系统——用U盘启动自制系统
- 30天自制操作系统——用U盘启动自制系统
- 30天自制操作系统——用U盘启动自制系统
- 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记
- 《30天自制操作系统》U盘启动,真机运行(16天)
- 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)
- 30天自制操作系统——用U盘启动自制系统
- 关于U盘启动操作系统《30天自制操作系统》
- 《30天编写自己的操作系统》 关于如何让虚拟机从U盘启动
- 手写一个X86操作系统实战:从零开始构建一个U盘启动的自制操作系统(一)
- 《30天编写操作系统》 如何制作U盘启动
- 《30天自制操作系统》学习笔记(六)
- 30天自制操作系统第一天--helloworld
- 自制linux并U盘启动
- 为什么《30天自制操作系统》封面中的猫是两只尾巴
- 《30天自制操作系统》学习笔记——第9天 内存管理
- 《30天自制操作系统》学习笔记——第七天