构建一个最简易的“OS(引导扇区【Boot Sector】)”
执行过程
Bios过程:
? 1.计算机上电后,加电自检
? 2.寻找启动盘,如果是选择从软盘启动,计算机就会检查软盘的0面0磁道1扇区,如果发现该扇区是以0xAA55?结尾,则该扇区被判定为引导扇区(必须包含少于512字节的执行码)
? 3.一旦发现引导扇区,512字节的内容装载到内存地址0000:7c00处
? 4.然后跳转到0000:7c00处控制权彻底交给这段引导代码
? 5.此时,BIOS中的固有程序不再控制计算机,而是由操作系统的一部分来控制。
解释:
? 1.整个过程BIOS就加载了0磁道0扇区的512Byte数据,也就是如果我们写的OS代码想让BIOS加载就必须把我们的代码放到磁盘的0道0区
? 2.内存地址是线性的, 如果总共1M内存,那么地址标识范围0X0000 - 0XFFFFF
? 3.CS和IP是汇编语言中的两个寄存器,cpu执行指令的依据就是去找CS:IP对应内存处的指令
- 先用汇编写一个asm文件
org 07c00h ;告诉编译器将程序加载到7c00处
mov ax,cs ;BIOS交出控制权时,cs=0x0
mov ds,ax ;数据段地址 ds=0x0
mov es,ax ;扩展段地址 ds=0x0
call DispStr ;调用显示字符串例程
jmp $ ;无限循环
DispStr:
mov ax,BootMessage
mov bp,ax ;ES:BP=串地址
mov cx,16 ;CX =串长度
mov ax,01301h ;AH=13,AL=01h
mov bx,000ch ;页号为0(BH=0),黑底红字
mov dl,0
int 10h ;10h 号中断
ret
BootMessage: db "HELLO,OS,WORLD!"
time 510-($-$$) db 0 ;填充剩余空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ;结束标志
2.使用Nasm的命令编译asm文件得到大小为512字节的bin文件
nasm boot.asm -o boot.bin
3.通过linux命令将bin文件写到空白软盘的第一个扇区
dd if=boot.in of=/dev/fd0 bs =512 count=1
4.创建软盘镜像
概念:软盘镜像可理解为系统盘,类似于重装操作系统自制的u盘;软盘也就是我们上面代码的载体
? 4.1打开bochs的bximage工具
? 4.2输入1,进行创建镜像
? 4.3输入fd,创建软盘
? 4.4选择软盘的大小
? 4.5给出软盘文件名
5.创建bochs的配置文件,第三方修改为 镜像名.img
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
floppya: 1_44=boot.img, status=inserted
boot: floppy
输入 bochs -f bochsConf 启动
选择6
输入c,可看到打印效果
7.效果
汇编知识点
-
$表示当前行被汇编后的地址 -
$$表示程序被编译后 -
?
-
?$表示本行距离程序开始处的相对距离 重点在操作系统,汇编其他点略过
Bochs重点
前面已经写了bochs基本操作
1.Bochs配置文件的作用:告诉Bochs我们构建的虚拟机长什么样子,例如设置内存,硬盘映像,软盘映像都是哪些文件
2.romimage:它指定的文件时真实机器的BIos
3.vgaromimage:它指的是真实机器的VGA BIOS
4.如果输入不带任何参数的Bochs(省略 “ -f bochsrc ”),并执行他,将在当前目录下寻找以下文件作为默认配置文件:
|