計(jì)算機(jī)通電后為什么可以啟動(dòng)裕菠?
BIOS(Basic Input and Output System)
第一條指令
在通電的一瞬間,PC等相關(guān)寄存器的值是固定的數(shù)字赋咽,也就對(duì)應(yīng)了一個(gè)特定的地方。在那個(gè)地方,我們可以放入這個(gè)計(jì)算機(jī)要執(zhí)行的第一條指令了赵。
這條指令就存在ROM(Read Only Memory)中,也就是說(shuō)甸赃,電腦通電后就會(huì)執(zhí)行ROM中存儲(chǔ)的代碼柿汛,這段代碼就是BIOS。
例程
計(jì)算機(jī)上豐富多彩的功能肯定不是BIOS來(lái)做的埠对,所以它的基本工作完成后络断,會(huì)繼續(xù)引導(dǎo)其它軟件繼續(xù)完成啟動(dòng)大業(yè)。但是它已經(jīng)完成的工作還是可以幫到后面的弟兄的鸠窗,這個(gè)幫助就是通過(guò)例程完成的妓羊。
一個(gè)BIOS例程很像是一個(gè)函數(shù),也有參數(shù)稍计、調(diào)用躁绸、返回值這些要素。
BIOS例程實(shí)例
參考一下grub2的boot.S里面對(duì)例程的使用臣嚣。
grub2是用來(lái)配置系統(tǒng)啟動(dòng)的净刮。在這個(gè)實(shí)例中,BIOS后面的兄弟就是grub2生的硅则。
BIOS會(huì)把硬盤(pán)一開(kāi)始的一些內(nèi)容加載到內(nèi)存淹父,然后執(zhí)行它,這些內(nèi)容就是boot.S編譯后的機(jī)器碼怎虫。boot.S中會(huì)使用一些BIOS例程暑认,所以用它來(lái)做例子很合適困介。
movb $0x41, %ah
movw $0x55aa, %bx
int $0x13
/*
* %dl may have been clobbered by INT 13, AH=41H.
* This happens, for example, with AST BIOS 1.04.
*/
popw %dx
pushw %dx
/* use CHS if fails */
jc LOCAL(chs_mode)
cmpw $0xaa55, %bx
jne LOCAL(chs_mode)
andw $1, %cx
jz LOCAL(chs_mode)
分析
參數(shù)寄存器
- ah
功能編號(hào)
告訴例程要做什么
0x41就是詢(xún)問(wèn)磁盤(pán)擴(kuò)展讀功能 - dl
磁盤(pán)編號(hào)
在更早的時(shí)間時(shí),在BIOS中被賦值 - bx
固定0x55aa
這是硬盤(pán)里面的扇區(qū)結(jié)束的固定字符
調(diào)用
int $0x13
以軟件中斷形式調(diào)用蘸际,由此看來(lái)座哩,BIOS中肯定有中斷向量表。
返回值寄存器
cf/ah/bx/cx粮彤,它們都有特定的含義根穷。