软件接力的第一棒,BIOS
- 实模式下的1MB内存布局
起始 | 结束 | 大小 | 用途 |
---|---|---|---|
FFFF0 | FFFFF | 16B | BIOS的入口地址,此地址也属于BIOS代码,同样属于顶部的640KB字节,只是为了强调其入口地址才单独贴出来的。此处16字节的内容是跳转指令jmp f000:e05b
|
F0000 | FFFEF | 64kb-16b | 系统BIOS范围是F0000~FFFFF共64B,为说明入口地址,将最上面的16字节从此处去掉,所以此处的终止地址是0xFFFFEF |
C8000 | EFFFF | 160KB | 映射硬件适配器的ROM或内存映射式I/O |
C0000 | C7FFF | 32KB | 显示适配器BIOS |
B8000 | BFFFF | 32KB | 用于文本模式显示适配器 |
B0000 | B7FFF | 32KB | 用于黑白显示适配器 |
A0000 | AFFFF | 64KB | 用于彩色显示适配器 |
9FC00 | 9FFFF | 1KB | EBDA(Extern BIOS Data Area)扩展BIOS数据区 |
7E00 | 9FBFF | 622080B约为608KB | 可用区域 |
7C00 | 7DFF | 512B | MBR被BIOS加载到此处,共512字节 |
500 | 7BFF | 30464B约30KB | 可用区域 |
400 | 4FF | 256B | BIOS Data Area |
000 | 3FF | 1KB | Interrupt vector Table 中断向量表 |
- 由低地址看,0~0x9FFFF处是DRAM(Dynamic Random Access Memory),是会定时刷新。
- BIOS的作用是检测,初始化硬件。硬件自己提供了一些初始化的功能调用,BIOS直接调用就好了,另外,BIOS还做了一个重要的事情,建立了中断向量表
BIOS是如何苏醒的
- BIOS是由硬件加载的,硬件就是只读存储器BIOS
- BIOS本身是个程序,程序要执行,只要有个入口地址才行,此入口地址就是0xFFFF0
- 在开机的瞬间,CPU的cs:ip寄存器被强制化初始化为:0xF000:0xFFF0
- 0xFFFF0只有16字节的空间,BIOS的真正代码不在这里,此处是跳转代码,跳到0xF000:0xe05b,这是BIOS代码真正开始的地方
初试MBR
-
如果报错为:
NO bootable device.
system03.png
需要执行命令:
bximage -hd -mode="flat" -size=60 -q hd60M.img
显示这个就成功了。
[haifei@localhost bochs-2.6.2]$ bximage -hd -mode="flat" -size=60 -q hd60M.img
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $
========================================================================
I will create a 'flat' hard disk image with
cyl=121
heads=16
sectors per track=63
total sectors=121968
total size=59.55 megabytes
The disk image 'hd60M.img' already exists. Are you sure you want to replace it?
Please type yes or no. [no] y
Writing: [] Done.
I wrote 62447616 bytes to hd60M.img.
The following line should appear in your bochsrc:
ata0-master: type=disk, path="hd60M.img", mode=flat, cylinders=121, heads=16, spt=63
- 将MBR的程序写入到引导盘中
dd if=/home/haifei/bochs2.6.2/bochs-2.6.2/systemCode/c2/a/boot/mbr.bin of=/home/haifei/bochs2.6.2/bochs-2.6.2/hd60M.img bs=512 count=1 conv=notrunc
if:要读取的文件
of:要写入的文件
bs:指定块的大小
count:指定拷贝的次数
seek:输出到文件要跳过多少块
conv:如何转换文件
上面的含义是:
将mbr.bin文件,输出到hd60M.img中,块大小为512,只操作一块,共1*512字节,以追加的形式
-
结果:
system04.png
简单MBR程序
;主引导程序
;------------------------------------------------
SECTION MBR vstart=0x7c00
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov sp,0x7c00
;清屏利用0x06号功能,上卷全部行,则可清屏
;------------------------------------------------
;INT 0x10 功能号:0x06 功能描述
;------------------------------------------------
;输入
;AH 功能号=0x06
;AL=上卷的行数,如果为0,就为全部
;BH=上卷的行属性
;(CL,CH)窗口左下角的(x,y)位置
;(DL,DH)窗口的右下角的(X,Y)位置
;无返回值
mov ax,0x600
mov bx,0x700
mov cx,0 ;左上角(0,0)
mov dx,0x184f ;右下角(80,25) 0x18=24 0x4f=80
int 0x10
;;;;;;;下面这三行获取光标的位;;;;;;;;;;
;.get_cursor获取当前光标的位置,在光标位置处打印字符
mov ah,3 ;输入:3号子功能是获取光标位置,需要存入ah寄存器
mov bh,0 ;bh寄存器存储的是待获取光标的页号
int 0x10 ;输入:ch=光标开始行,cl=光标结束行
;dh=光标所在行号,dl=光标所在列号
;;;;;;;;;获取光标的位置结束;;;;;;;;;;;;;;;
;;;;;;;;;打印字符串;;;;;;;;;;;;;;;;;;;;;;
;还是使用10h中断,不过这次调用13号子功能打印字符串
mov ax,message
mov bp,ax ;es:bp为串首地址,es此时同cs一致
;开头已经为sreg初始化
;将光标位置用到dx寄存器内容,cx中的光标位置可以忽略
mov cx,5 ;cx为串长度,不包括结束的0的字符个数
mov ax,0x1301 ;子功能号13显示字符及其属性,要存入ah寄存器
;al设置写字符的方式al=01:显示字符串光标跟随移动
mov bx,0x2 ;bh存储要显示的页号,此处为第一页
;bl中是字符属性,属性黑底绿字bl=02h
int 0x10 ;执行BIOS,0x10号中断
;;;;;;;;;;打印字符串结束;;;;;;;;;;;;;;;;;;
jmp $
message db '1 MBR'
times 510-($-$$) db 0
db 0x55,0xaa
网友评论