实验1的内容是“启动PC系统”——一个从开机到运行到OS的流程;看似一个很复杂的流程,为了很好的解剖这样的流程,需要充分的知识准备,而且更重要的是从代码的角度去解释该过程。所以我们将这一篇的内容定位与介绍一些概念与模拟代码,保证理解过程的顺利。换句话说,如果在理解实验1的内容有什么问题,可以参考该篇给出的内容或者相关资源。
本篇主要通过两个部分来做出详细的介绍:其一为BIOS编程空间;其一为C与汇编的互调。
一)BIOS编程空间
这里有一个很陌生的名词——编程空间,其实,这是我对编程环境的一个定义,一般用编程环境来描述,但是它强调的是编码的工具与使用的api等概念;但是用编码空间来代替它,因为它不仅仅包含这些内容,更多的是强调编程时更关心其代码运行的环境(内存空间,处理器状态,外设的资源使用),而且是在一个固定的环境中。
对于BIOS的编程空间,我们关注的点主要有如下几个方面:
1.处理器的状态
寄存器的长度为16位,处于8086的处理器状态,详情参考《64-ia-32-architectures-software-developer-manual-325462.pdf》20.1REAL-ADDRESS MODE
2.内存的使用
内存空间为0-1M的连续空间,地址访问方式为(DS<<4|BX);详情参考《64-ia-32-architectures-software-developer-manual-325462.pdf》20.1REAL-ADDRESS MODE
然而不是1M空间都能被任意使用,所以需要理解内存映像——内存地址区域的实际使用情况:
start |
end |
size |
type |
description |
Low Memory (the first MiB) |
||||
0x00000000 |
0x000003FF |
1 KiB |
RAM - partially unusable (see above) |
Real Mode IVT (Interrupt Vector Table) |
0x00000400 |
0x000004FF |
256 bytes |
RAM - partially unusable (see above) |
BDA (BIOS data area) |
0x00000500 |
0x00007BFF |
almost 30 KiB |
RAM (guaranteed free for use) |
Conventional memory |
0x00007C00 (typical location) |
0x00007DFF |
512 bytes |
RAM - partially unusable (see above) |
Your OS BootSector |
0x00007E00 |
0x0007FFFF |
480.5 KiB |
RAM (guaranteed free for use) |
Conventional memory |
0x00080000 |
0x0009FBFF |
approximately 120 KiB, depending on EBDA size |
RAM (free for use, if it exists) |
Conventional memory |
0x0009FC00 (typical location) |
0x0009FFFF |
1 KiB |
RAM (unusable) |
EBDA (Extended BIOS Data Area) |
0x000A0000 |
0x000FFFFF |
384 KiB |
various (unusable) |
Video memory, ROM Area |
由上表可以发现,目前0-0x4FF,0x9FC00-0xfffff这两段内存是被系统占用了,不能被我们编程使用。
3.外设的使用