1. 主引导扇区的作用以及开机之后的大致流程:
1) 为了学习实模式下的编程而不受操作系统的影响,因为在正常的开机后,经过主引导扇区的对操作系统的加载就会把计算机的控制权交给操作系统从而进入保护模式,因此就只有运行主引导扇区程序时系统处于实模式状态;
2) 内存逻辑地址空间:
i. 实模式下CPU有20根地址线,能访问的地址空间有1MB,但是这1MB并不全部都指向DRAM;
ii. 在体系结构中CPU将这1MB空间映射到了多个存储设备上,其中:
iii. ROM占据顶部64KB空间,F0000~FFFFF;
iv. DRAM占据底部640KB的1MB中最大的空间,00000~9FFFF;
v. 中间空出来320KB用于分配给外围设备的存储空间,其中最重要的就是字符界面的显示器,这是一种古老的显示模式,80(个字符) × 25(行)为一屏,一屏总共能满满显示2000个字符,由于每个字符包括其ASCII码和颜色等属性,因此一个字符占两个字节,因此一屏占4000个字节,而留个其的地址空间时B8000~BFFFF这32768个字节(即刚好一个段64KB),总共可以容纳8屏多一点点儿,而在屏幕上显示字符的过程仅仅就是向显存中存放字符的过程那么简单;
3) 开机加电后系统的运作流程:
i. 卡机加电后cs:ip自动指向0xFFFF0的BIOS固件处;
ii. 该处只有一条指令:jmp far 0xF000:0x0000,然后跳转到了BIOS固件的起始位置,运行BIOS的程序;
iii. 在BIOS程序中会先在0x00000处加载BIOS自己的中断向量表,然后再执行一些硬件初始化和自检程序;
iv. 完成自检和初始化后调用BIOS的int19中断例程将控制权交给操作系统(实质上该例程是读取磁盘0号逻辑扇区的MBR主引导扇区程序,而传统上MBR是属于操作系统的,虽然该程序仍然运行于实模式);
4) MBR:
i. 即主引导扇区程序,位于逻辑0号扇区内,作用是加载操作系统代码,使程序从实模式变换到保护模式,真正将系统的实权交给操作系统,即扮演一个接力手的角色;
ii. int19BIOS例程会从磁盘的0面0道1扇区(也是逻辑0号扇区)的512B内容加载到0x0000:0x7C00处;
iii. BIOS判断该扇区是MBR的标准就是检测512字节的最后两个字节是否是0x55和0xAA,这是规范!如果检测符合规范,则执行跳转指令jmp far 0x0000:0x7C00转到主引导程序处执行操作系统引导工作,否则就会开机失败转去执行错误处理中断例程报告本次开机失败!
5) 在这里我们不介绍如何引导操作系统,只介绍一个简单的MBR程序,让其在屏幕上显示一定的内容,并学会如何使用BOCHS单步调试,这也是调试操作系统内核的基础;
; 此程序用于显示标号target的汇编地址的十进制形式
; 注意,此时跳到了0x0000:0x7C00处
; 因此cs=0x0000而ip=0x7C00
jmp start
stack times 20 db 0 ; 定义一个栈,程序中需要使用
len_stack equ $ - stack
VIDEO_SEG_BEGIN equ 0xB800 ; 显存起始段地址
THIS_SEG equ 0x7C00 ; 整个程序自成一段,起始偏移地址为0x7C00但起始汇编地址是0x0000
str_info db 'Label offset: ' ; 要显示的信息
len_str_info equ $ - str_info ; 上面字符串的长度
target db 0
start:
; es指向显存,ds指向str_info
mov ax, VIDEO_SEG_BEGIN
mov es, ax
mov ax, cs ; 此时cs=0x0000
mov ds, ax
; 显示字符串"Label offet: "
mov ah, 0007H ; 设置字的颜色属性,ASCII码存放在al中,颜色属性存放在ah中
mov bx, 0
mov bp, 0
mov cx, len_str_info
.lp1: mov al, [THIS_SEG + str_info + bx]
mov [es:bp], ax
inc bx
add bp, 2
loop .lp1
; 初始化栈段
mov ax, cs
mov ss, ax
mov sp, THIS_SEG + stack + len_stack
; 将target分解成5位十进制数的ASCII码并倒序入栈
mov ax, target