笔者看了《30天编写操作系统》 之后,很想装一下B,所以一直很想让《30天编写操作系统》 的程序不只是在虚拟机里面运行,而且还希望将这个OS放到U盘上,从U盘启动,网上寻觅了各种方法均未实现我装B的伟大理想,所以只能自己动手了。下面是效果图,我的测试电脑屏幕坏掉了,不过还是看的清楚
下面的是步骤
1——首先到http://zhidao.baidu.com/share/cc93285a8dc709f2cbd8af39eaae61bd.html 下载U盘格式化成为软盘的工具,将U盘格式化
2——将下面的ipl的代码替换你的ipl代码(其实整个移植到U盘的核心是修改ipl代码)
; haribote-ipl
; TAB=4
CYLS EQU
10 ; 十个柱面
ORG 0x7c00
; MBR在内存中的位置为(DS=0,0x07c00=DS+0x7c00)
; 系统相关设置信息
JMP entry
DB 0x90
DB "HELLOIPL"
; name of boot sector
DW 512
; size of sector
DB 1
; f
DW 1
; FAT first sector
DB 2
; FAT number
DW 224
; root dir size
DW 2880
; disk size in sector
DB 0xf0
; disk type
DW 9
; FAT length
DW 18
; 18 sector each road
DW 2
; disk up down
DD 0
; no partition
DD 2880
; reclaim the disk size
DB 0,0,0x29
; reserve
DD 0xffffffff
; might be column
DB "HELLO-OS "
; disk name
DB "FAT12 "
; disk fs type
RESB 18
; reserve 18 byte
; init程序入口
entry:
MOV AX,0
;
MOV SS,AX
MOV SP,0x7c00
; heap stack init
MOV DS,AX
; 初始化代码段的基地址在0x00000
; 读取磁盘到内存0x08200的位置
MOV AX,0x0820
MOV ES,AX
MOV CH,0
; cylinder number
MOV DH,0
; disk head number
MOV CL,2
; sector number
readloop:
MOV SI,0
; failed times
; retry to read disk if failed, read one sector
retry:
MOV AH,0x02
; AH=0x02 : 读磁盘
MOV AL,1
; 1扇区
MOV BX,0
;MOV DL,0x00
; A驱动器
MOV DL,0x80
INT 0x13
; 调用BIOS的函数例程
JNC next
ADD SI,1
CMP SI,5
JAE error
MOV AH,0x00
;MOV DL,0x00
MOV DL,0x80
INT 0x13
JMP retry
next:
MOV AX,ES
ADD AX,0x0020 ;每读取一个扇区内存向后偏移(ES+=0x0020)<<4
MOV ES,AX
ADD CL,1
CMP CL,62
;62个扇区
JBE readloop
MOV CL,1
ADD DH,1
CMP DH,2
JB readloop
MOV DH,0
ADD CH,1
CMP CH,4
JB readloop
MOV [0x0ff0],CH
JMP 0xc200
error:
MOV SI,msg
JMP putloop
ok:
MOV SI,msg1
putloop:
MOV AL,[SI]
ADD SI,1
; SI设置为1
CMP AL,0
JE fin
MOV AH,0x0e
; 在teletype模式下显示字符
MOV BX,15
; 页码BH=0x00,前景色BL=0x0f
INT 0x10
; BIOS显示服务
JMP putloop
fin:
HLT ; 暂停处理器
JMP fin
msg1:
DB 0x0a, 0x0a
; 换行符
DB "READ OKKKK"
DB 0x0a
; 换行符
DB 0
msg:
DB 0x0a, 0x0a
; 换行符
DB "load error"
DB 0x0a
; 换行符
DB 0
RESB 0x7dfe-$
; (0x7dfe-当前位置)都填充0x00
DB 0x55, 0xaa
3——编译的到你的img文件
4——利用ubuntu或者其他系统的dd命令把你的img拷贝到U盘上( dd if=XXXX.img of=/dev/sdb)PS:/dev/sdb 这个是我的U盘在我的系统上的名称,也有可能是其他的名称,视具体情况而定
5——把你的U盘插在真机上,打开电源(我的电脑是F12选择启动项)选择U盘启动
6——就可以看到在真正的电脑上运行的效果了