汇编里总是糊涂内存和bios的关系

      2005-11-7 12:44
汇编里总是糊涂内存和bios的关系,找到篇文章,好像明白了些
BIOS扮演的最重要的角色之一就是启动系统。当PC被打开时,它的系统内存中是空的,它需要马上找到一条代码以启动机器。这些代码就在BIOS中,因为BIOS被放置在ROM中,所以即使系统内存的其它部分是空的,但BIOS中的程序却总是可以使用的。

我们来看一看在Power-on之后的“硬件”Booting阶段,系统到底都做了些什么。同时,也看一看通过硬盘启动OS和软盘启动OS之间究竟存在着哪些不同。



第一推动力:CPU的第一条指令

CPU从物理地址FFFFFFF0h取出并执行硬件Reset之后的第一条指令。这个地址到最大物理地址4 GB之间只有16 Bytes的空间,包含软件初始化代码的EPROM必须被影射到这个地址。在Real Mode下,地址FFFFFFF0h超过了1 MB的物理地址范围。CS寄存器被分为两部分:可见的“Segment Selector”部分和隐藏的"Base Address"部分。



在Real Address Mode下,"Base Address"部分的值,等于将16-bit的"Segment Selector"左移4-bit所形成的20-bit地址,"Segment Selector"部分并不参与物理地址的计算,在Real Mode下,它仅仅被用来计算"Base Address"部分。而"Base Address"部分被真正的用于实际物理地址的计算。

在硬件Reset期间,CS中的"Segment Selector"部分被初始化为F000h,而"Base Address"部分被初始化为FFFF0000h,这与上述的原则不相符,但没有关系,因为"Base Address"已经有一个值了。所以,第一条指令的地址为Base Address + EIP = FFFF0000h + FFF0h = FFFFFFF0。

EPROM中放置着PC厂商所编写的代码(BIOS),被影射在地址FFFFFFF0h的代码必须为一条"far jump"或者"far call"指令或者产生一个中断,这样CS的"Segment Selector"的值将会被改变,从而"Base Address"部分的值也按照上述计算原则被改变为BIOS代码的影射地址。

POST - Cold Boot / Power On Self Test Activities
POST - 冷启动、开机自检
- power supply starts Clock Generator (8284) with Power
通电后8284时序发生器开始工作
Good signal on BUS
总线产生正常信号
- CPU reset line is pulsed resetting CPU
CPU的复位引脚被触发,CPU复位
- DS, ES, and SS are cleared to zero
DS,ES,SS初始值为0(CPU处于实模式下)

Cold and Warm Boot both execute the following sequence
冷启动和热启动都会执行一下序列
- CS:IP are set to FFFF:0000 (address of ROM POST code)
CS:IP初始值为FFFF:0000(该地址为BIOS的ROM POST代码)
- jump to CS:IP (execute POST, Power On Self test)
CPU工作,开始取第一条指令(执行POST,开机自检)
- interrupts are disabled
关中断
- CPU flags are set, read/write/read test of CPU registers
设置CPU标志位,用读、写、读来测试CPU寄存器
- checksum test of ROM BIOS
检测ROM BIOS的校验和
- Initialize DMA (verify/init 8237 timer, begin DMA RAM refresh)
初始化DMA(校验、初始化 8237时钟控制器,开始DMA 内存刷新)
- save reset flag then read/write test the first 32K of memory
保存复位标志,然后对内存的前32K字节进行读写测试
- Initialize the Programmable Interrupt Controller (8259)
and set 8 major BIOS ~interrupt~ vectors (interrupts 10h-17h)
初始化8259可编程中断控制器,设置好8个主要的BIOS中断向量(INT 10h-17H)
- determine and set configuration information
检测并设置好CMOS配置信息
- initialize/test CRT controller & test video memory (unless 1234h
found in reset word)
初始化/测试CRT控制器,测试显存(除非在复位字的位置找到1234h)
- test ~8259~ Programmable Interrupt Controller
测试8259可编程中断控制器
- test Programmable Interrupt Timer (~8253~)
测试8253可编程时钟中断控制器
- reset/enable keyboard, verify scan code (AAh), clear keyboard,
check for stuck keys, setup interrupt vector lookup table
复位、激活键盘,校验扫描码,清除键盘缓冲区,检查是否有卡住的键,设置中断查找表
- hardware interrupt vectors are set
设置硬件中断向量
- test for expansion box, test additional RAM
测试扩展设备,测试扩充内存
- read/write memory above 32K (unless 1234h found in reset word)
读写测试32K字节以上的内存(除非在复位字的位置找到1234h)
- addresses C800:0 through F400:0 are scanned in 2Kb blocks in
search of valid ROM. If found, a far call to byte 3 of the ROM
is executed.
以2K字节大小的块为单位,从c800:0到f400:0扫描,查找有效映射的ROM。找到后,对ROM的第3个字节进行远程调用。
- test ROM cassette BASIC (checksum test)
检测ROM BASIC(校验和测试,现在的BIOS已取消ROM BASIC了……)
- test for installed diskette drives & ~FDC~ recalibration & seek
检测安装了的硬盘驱动器、软盘控制器。
- test printer and RS-232 ports. store printer port addresses
at 400h and RS-232 port addresses at 408h. store printer
time-out values at 478h and Serial time-out values at 47Ch.
检测打印机口和RS-232串口。把打印口地址保存在内存的400h,串口地址保存在408h。打印机超时值保存在478h,串口超时值保存在47Ch。
- NMI interrupts are enabled
激活NMI中断
- perform ~INT 19~ (bootstrap loader), pass control to boot record
or cassette BASIC if no bootable disk found
执行INT 19h(引导装载程序),把控制权转交给引导程序
- ~WARM BOOT~ procedure is now executed
现在热启动已经执行完毕了
标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commenttime}{commentauthor}

{CommentUrl}
{commentcontent}