亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 128794 | 回復(fù): 22
打印 上一主題 下一主題

【BIOS 探索之旅】 (4.21日更新) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-04-01 00:34 |只看該作者 |倒序?yàn)g覽
寫在之前
     想寫 BIOS 研究系列已久,今天開始以旅程的方式邊寫邊研究 BIOS,這是一個(gè)邊寫邊學(xué)習(xí)的過程,從基本為起點(diǎn)站,何時(shí)為終點(diǎn)站不清楚,希望能堅(jiān)持下去,期間難免會(huì)有錯(cuò)誤之處,敬請(qǐng)指正。
     研究 BIOS 是一項(xiàng)賦挑戰(zhàn)的工作,難度好比研究 kernel 代碼,BIOS 是極具吸引力的。讀懂它對(duì)計(jì)算機(jī)系統(tǒng)將有質(zhì)的飛越。
      為了便于瀏覽,每寫完一篇將會(huì)鎖貼,批評(píng)指正討論或建議請(qǐng)另起一貼
.


[ 本帖最后由 mik 于 2008-4-21 01:35 編輯 ]

評(píng)分

參與人數(shù) 1可用積分 +15 收起 理由
prolj + 15

查看全部評(píng)分

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-04-01 00:40 |只看該作者
預(yù)備

一、所需材料
1、主要BIOS ex38dq6.f2 :技嘉主板上Intel X38 MCH + ICH9 平臺(tái)。
   備用 BIOSma79xds4.f4 技嘉主板上AMD 790X 北橋 + SB600 南橋平臺(tái)。
2、cbrom:這是一個(gè)BIOS編輯工具,這里所用的是cbrom182版本
3、lha2.55LHA格式的解壓工具。
4、awdbeditaward bios 的圖形化編輯工具,方便簡(jiǎn)單。
5、hex workshop:一個(gè)十六進(jìn)制編輯工具,簡(jiǎn)單小巧。
6、IDA:一個(gè)反匯編工具,這里使用的是IDA 5.2版本

二、所需知識(shí)
1、匯編語言:這是必備的知識(shí),匯編掌握的程度和理解能力成正比。
2、機(jī)器語言:這個(gè)不是必需的,但推薦能夠讀懂機(jī)器語言,某些場(chǎng)合下當(dāng)匯編語言也陷入窘境時(shí),機(jī)器語言是唯一的解釋手段。
3、x86體系知識(shí):具體可以查看相關(guān)的Intel AMD 手冊(cè)
4、ISA/PCI 總線知識(shí):可以查看相應(yīng)的 ISA/PCI Specification
5、north/south bridge 知識(shí):Intel 現(xiàn)在以MCH代稱north bridgeICH代稱south bridge,可以查看相應(yīng)的 datasheet

[ 本帖最后由 mik 于 2008-4-1 00:41 編輯 ]

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-04-01 00:51 |只看該作者
起點(diǎn):幾個(gè)重要知識(shí)


一、地址空間解析

(1) 0 ~ 9_FFFF:屬于DOS的基本內(nèi)存,被MCH控制提交到DRAM

(2) A_0000 ~ B_FFFF:此區(qū)域能提交到Device 2(集成顯示設(shè)備)、Device 1PCI Express接口設(shè)備)以及提交到ICH進(jìn)行處理。按Dev2/Dev1/ICH優(yōu)先順序進(jìn)行映射。
當(dāng)處理器在SMM模式下,此區(qū)域供SMM 使用,此時(shí),此區(qū)域?qū)⒈?/font>MCH提交到DRAM相同的位置上。

(3) C_0000 ~ F_FFFF:共256KB的區(qū)域被稱為PAEProgramed Attribute Memory)區(qū)域,可定義4種類型屬性:Disable、Read/Write、Read-Only以及Write-Only。根據(jù)這些操作類型可以提交到DRAMICH處理。這些區(qū)域的初始狀態(tài)是Disable屬性,也就是說,缺省時(shí)將得交到ICH處理?捎BIOS BOOTLOCK進(jìn)行對(duì)類型的屬性設(shè)置,從而達(dá)到shadow memory效果。。

(4) E_0000 ~ E_FFFF:典型地被用作BIOS使用。俗稱E_Segment。

(5) F_0000 ~ F_FFFF:被提交到LPC總線上的BIOS,它是High BIOS的別名,初始屬性是disable,將被MCH控制直接提交到ICH處理。俗稱F_Segment

(6) F0_0000 ~ FF_FFFF:這1M的空間可以選擇保留給ISA使用,這段空間將不提交至DRAM,轉(zhuǎn)交ICH處理。

(7) TOLUDTop Of Low Usable DRAM)由Host Bridge Registers設(shè)置,在地址空間最低DRAM memory區(qū)域的頂端,在TOLUD下的TSEG區(qū)域可設(shè)置為1M、2M8MprocessorSMM模式下將被提交至DRAM相同地址上。

(8 ) IGD區(qū)域:可供MCH內(nèi)部集成的Graphics Device使用,MCH內(nèi)被定義為Device 2。大小由1M ~ 64M

(9) E000_0000 ~ EFFF_FFFF:這段空間典型地被用作為PCI Express 配置空間,由Host BridgeDev0)的PCIEXBAR寄存器設(shè)置。缺省的Pci Express Base Address設(shè)置為0_E000_0000,共256M大小。每個(gè)Device的每個(gè)Functon大小為4K(包括PCI256 BytePCI Express增強(qiáng)的空間共4K
PCI Express Bus 定義了256BusBus0 ~ Bus255,每條Bus下可掛32個(gè)設(shè)備:Device0 ~ Device 31,每個(gè)設(shè)備下又可執(zhí)行8個(gè)FunctionFunction 0 ~ Function 7
PCI Express空間大小可得:256 × 32 × 8 × 4096 = 256M

(10)  FEC0_0000 ~ FEC7_FFFF:這段區(qū)域固定分配IOAPIC中斷控制器使用,訪問這段區(qū)域?qū)⒈惶峤坏?/font>ICH處理。

(11) FEC8_0000 ~ FECF_FFFF:附加的APIC增加區(qū)域提交至 PCI Express 端口,當(dāng)不設(shè)此區(qū)域時(shí),整個(gè)APIC 配置區(qū)域(FEC0_0000 ~ FECF_FFFF)將提交至 ICH。

(12) FEDA_0000 ~ FEDB_FFFF:可選為HSEG區(qū)域以供SMM模式下使用。被重新映射至A_0000 ~ B_FFFF區(qū)域。

(13) FEE0_0000 ~ FEEF_FFFF:這段區(qū)域保留給FSB中斷信號(hào)使用。當(dāng)PCI Express ICH上的設(shè)備往這段區(qū)域?qū)憯?shù)據(jù)時(shí),將以中斷信號(hào)形式提交至FSB上,不會(huì)提交到DRAM。

(14) FFE0_0000 ~ FFFF_FFFF:此區(qū)域固定分配給BIOS 使用。共2M空間,將直接提交至ICH處理。







二、關(guān)于PCI Bus

1、PCI Bus是一種原生32位,通過Dual Address Cycle形式來實(shí)現(xiàn)64位尋址的數(shù)據(jù)總線。

2、PCI的配置寄存器集成在MCHNorth Bridge)內(nèi)部:CONFIG_ADDRESS寄存器和CONFING_DATA寄存器,通過端口 CF8H ~ CFBH 來實(shí)現(xiàn)32位數(shù)據(jù)訪問 CONFIG_ADDRESS寄存器;通過端口 CFCH ~ CFFH 來實(shí)現(xiàn)32位數(shù)據(jù)訪問 CONFIG_DATA 寄存器。

3、PCI 設(shè)備訪問地址如下:

31

30 ~ 24

23 ~ 16

15 ~ 11

10 ~ 8

7 ~ 0

1

保留

Bus

Device

Function

Offset


4、訪問的形式:
mov eax,80000090h
mov dx, CF8h
out dx, eax
mov dx, CFCh
in eax,dx
… …

address_map.jpg (94.91 KB, 下載次數(shù): 304)

address_map.jpg

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-04-02 01:14 |只看該作者
起點(diǎn):幾個(gè)重要知識(shí)(續(xù))
三、I/O 空間


1、系統(tǒng)提供的64K IO尋址空間(0 ~ FFFF)劃分幾種情況:
分為MCHhostbridge 使用和 ICH 使用,大部分供ICH外部設(shè)備使用。例如:CF8h ~ CFFh 這些端口固定分配供MCH用來訪問PCI Configuration Space。
分為系統(tǒng)固定分配及按情況進(jìn)行分配。如:0 ~ 1Fh 端口固定分配給ICHDMA 控制器使用。
一些端口被保留未用。

2、一般PCI設(shè)備都可選用memory空間和IO空間進(jìn)行設(shè)備訪問。在PCI設(shè)備的configuration Register可對(duì)PCICMD寄存器的IOSE位設(shè)為IO空間訪問,根據(jù)IOBASEIOLIMIT寄存器設(shè)置IO端口地址。
四、MCHhostbridge)提交到ICH后的轉(zhuǎn)發(fā)處理
       ICH包括PCI-to-PCI bridge 、PCI-to-ISA bridge、USB ControllerPCI Express Ports等等。ICH收到經(jīng)MCH提交來的地址,相當(dāng)多都分派到PCI-to-ISA bridgeLPC Controller)中的Firmware HubLPC bus。

MCH_ICH 映射圖.jpg (96.83 KB, 下載次數(shù): 225)

MCH_ICH 映射圖.jpg

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-04-03 02:17 |只看該作者
第一站:剖析First Instruction Executed



一、Processor 寄存器初始狀態(tài)



1、CR0.PE = 0,處理器處于實(shí)模式
2、RIP = FFF0h
3、CS.Base = FFFF_0000h
4、由于在實(shí)模式下,第一條指令的物理地址就在:CS.Base + RIP = FFFF_FFF0h。



二、MCHNorthBridge)的處理
       FFFF_FFF0h地址由Processor送到MCH進(jìn)行解析,這個(gè)地址落在MCH固定為High BIOS 分配的區(qū)域中,MCH直接通過DMI接口送到ICH進(jìn)行處理。

       MCH相當(dāng)于一個(gè)派發(fā)者角色,根據(jù)定義的地址映射分派到不同的接口。



三、ICHSouthBridge)的處理

1、ICH對(duì)MCH提交過來的地址進(jìn)行解碼。

2、ICH的地址映射機(jī)制中:FFFF_FFF0地址落 FFF8_0000 ~ FFFF_FFFFh這個(gè)范圍中,這個(gè)范圍的地址將直接分派到LPC接口的Frimware Hub進(jìn)行處理,LPC 接口相當(dāng)于一個(gè)PCI-to-ISA 橋,BIOS寄居在LPC bus上,從而訪問BIOS區(qū)域。

3、在物理器件上,ICH Firmware HubIDSEL選擇固定地址設(shè)為FFF8_0000 ~ FFFF_FFFF范圍,LPC接口寄存器(B#0, D#30,F#0)中的,Firmware Hub Decode Enable寄存器的bit15固定為1,允許FFF8_0000 ~ FFFF_FFFF地址提交到Firmware Hub。這樣確保FFFF_FFF0提交到LPC bus。

     ICH相當(dāng)于一個(gè)解碼器角色,解碼后分配任務(wù)給設(shè)備執(zhí)行。



四、第一條指令執(zhí)行

    經(jīng)典地在FFFF_FFF0絕大多數(shù)是一條far jmp指令:jmp far ptr 0F000h:0E05Bh,不同的BIOS跳轉(zhuǎn)的地址或許不同。這條指令跳轉(zhuǎn)到FE05B這個(gè)地址上執(zhí)行。同時(shí)刷新CS.SelectorCS.Base以及EIP寄存器。引一段 Intel 的話:



The first instruction that is fetched and executed following a hardware reset is

located at physical address FFFFFFF0H. This address is 16 bytes below the

processor’s uppermost physical address. The EPROM containing the software initialization

code must be located at this address.

The address FFFFFFF0H is beyond the 1-MByte addressable range of the processor

while in real-address mode. The processor is initialized to this starting address as

follows. The CS register has two parts: the visible segment selector part and the

hidden base address part. In real-address mode, the base address is normally

formed by shifting the 16-bit segment selector value 4 bits to the left to produce a

20-bit base address. However, during a hardware reset, the segment selector in the

CS register is loaded with F000H and the base address is loaded with FFFF0000H. The

starting address is thus formed by adding the base address to the value in the EIP

register (that is, FFFF0000 + FFF0H = FFFFFFF0H).


    以上這段文字表明,Intel從架構(gòu)上規(guī)定了,processor復(fù)位后,FFFFFFF0H地址上必須包含一些初始化程序,BIOS必須在定位在這段地址區(qū)域上。

MCHICH的配合從物理上通過地址映射機(jī)制保證了這一點(diǎn)的實(shí)施。




五、驗(yàn)證一下FFFF_FFF0地址上是否是一條far jmp指令,可以簡(jiǎn)單地打開cmd窗口執(zhí)行debug命令。
C:>debug
-d F000:FFF0
F000:FFF0 EA 5B E0 00 F0 30 32 2F 32 37 2F 30 38 00 FC

EA 5B E0 00 F0 就是 jmp far ptr F000:E05B 指令,這條指令跳轉(zhuǎn)到FE05B的物理地址上,這將是 BIOS BOOTBLOCK。



[ 本帖最后由 mik 于 2008-4-3 02:21 編輯 ]

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-04-04 00:51 |只看該作者
第一站:剖析First Instruction Executed(續(xù))




六、BIOS地址空間高端與低端的別名機(jī)制

1、在整個(gè)地址空間中 FFE0_0000 ~ FFFF_FFFF 這段2M 區(qū)域真正地被固定分配給 BIOS 使用,包括基本的 BIOS 區(qū)以及一些設(shè)備擴(kuò)展的 BIOS 區(qū)。這段空間是不能提交至 DRAM 的。

2、實(shí)際上,BIOS的低端地址C_0000 ~ F_FFFF 屬于PAM區(qū) (即:Programmed Attibute Memory ,這段區(qū)域可被賦為4個(gè)訪問屬性:disable,read-only,write-only 以及 read/write。根據(jù)訪問屬性的不同可被提交到ICH,也可以提交DRAM,但初始化的屬性是Disable,為DRAM不可用,初始狀態(tài)是通過DMI提交到ICH處理的,但是可以在 BIOS 代碼修改的,從而提交至DRAM。

3、C_0000 ~ F_FFFF FFFC_0000 ~ FFFF_FFFF 指向同一個(gè)區(qū)域,被冠以別名稱呼,即C_0000 ~ F_FFFF 被映射到 FFFC_0000 ~ FFFF_FFFF。


AMD 如是說:
Accesses to BIOS space in the low megabyte (between 000C_0000h and 000F_FFFFh) are mapped to the top megabyte (between FFFC_0000h and FFFF_FFFFh) on the LPC bus; the OAR locks for these apply to these accesses based on the remapped address at the top megabyte.


無論是C_0000 ~ F_FFFF,還是 FFFC_0000 ~ FFFF_FFFF 最終結(jié)果都將送到LPC bus上的FFFC_0000 ~ FFFF_FFFF 地址上。



類似地,Intel 如是說,這里列出一小部分:



AMD Intel 在物理上,確保了這一別名機(jī)制。


論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-04-06 17:46 |只看該作者
第二站:分解BIOS



注意:本站點(diǎn)討論的部分內(nèi)容不詳,還沒了解透,定義為:不清昕,可能有錯(cuò)誤的。

     這里主要以Intel平臺(tái)的BIOS文件討論,輔助參考AMD平臺(tái)的BIOS文件。要分解的BIOS文件選了當(dāng)下較新的X38芯片組平臺(tái)的ex38dq6.f2 這個(gè)BIOS文件,而BIOS的文件是ma79xds4.f4,這是AMD的最新的7系芯片組其中的790X芯片組平臺(tái)。
    好,下面開始進(jìn)行分解ex38dq6.f2這個(gè)BIOS文件。



一、工具的使用

1、Ex38dq6.f2Award Bios,有一個(gè)圖形化的BIOS編輯軟件awdbedit,可以很方便的將BIOS的組件分解出來。
2、通用的BIOS編輯軟件cbrom,這里使用的是cbrom182版本。下面是使用cbrom182顯示BIOS組件的清單,命令行下使用:Cbrom182 ex38dq6.f2 /D,結(jié)果如下(部分):


              ********   ex38dq6.f2 BIOS component ********
No. Item-Name         Original-Size   Compressed-Size Original-File-Name
================================================================================
  0. System BIOS       20000h(128.00K)15478h(85.12K)ex38dq6.BIN
  1. XGROUP CODE       0FC40h(63.06K)0B0ECh(44.23K)awardext.rom
  2. ACPI table        04E16h(19.52K)0193Ch(6.31K)ACPITBL.BIN
  3. EPA LOGO          0168Ch(5.64K)0030Dh(0.76K)AwardBmp.bmp
  4. GROUP ROM[18]     031D0h(12.45K)0225Ah(8.59K)ggroup.bin
  5. YGROUP ROM        0C180h(48.38K)066E4h(25.72K)awardeyt.rom
  6. GROUP ROM[ 0]     08210h(32.52K)0303Dh(12.06K)_EN_CODE.BIN
  7. PCI ROM[A]        10000h(64.00K)09DBEh(39.44K)ICH9RAID.BIN
  8. PCI ROM        03600h(13.50K)02553h(9.33K)ICH8AHCI.BIN
  9. PCI ROM[C]        07A00h(30.50K)04479h(17.12K)JMB59.BIN
10. MINIT             08220h(32.53K)0824Fh(32.58K)DDR2_MRC.X38
11. PCI ROM[D]        0C800h(50.00K)079FDh(30.50K)rtegrom.lom
12. LOGO1 ROM         00B64h(2.85K)00520h(1.28K)dbios.bmp
13. LOGO BitMap       4B30Ch(300.76K)07EEEh(31.73K)x48dq6.bmp
14. GV3                01EFDh(7.75K)00B66h(2.85K)PPMINIT.ROM
15. OEM0 CODE         028ABh(10.17K)01E1Bh(7.53K)SBF.BIN
(SP) NCPUCODE          1D000h(116.00K)1D000h(116.00K)NCPUCODE.BIN

  Total compress code space  = E5000h(916.00K)
  Total compressed code size = 75C8Dh(471.14K)
  Remain compress code space = 6F373h(444.86K)

           清單: 2.1


     整個(gè)ex38dq6.f2 文件1M大小,包含了16個(gè)組件,最后的NCPUCODE.BIN組件,是虛擬的或者說物理上不存在,用awdbedit軟件分解不包括這個(gè)組件,實(shí)際上只有15個(gè)真實(shí)組件,這些組件全都是經(jīng)過壓縮的。
     第2列是組件的名字,第3列是組件真實(shí)的大小,第4列是組件中部分壓縮的數(shù)據(jù)在ex38dq6.f2文件中的大小,最后1列是分解后組件存在磁盤上的物理文件名,以ex38dq6.bin為例,這個(gè)組件真實(shí)的大小為128K,其中85.12K是壓縮部分,其余的以純代碼形式分布在FE000 ~ FFFFF區(qū)域,典型地:第一條far jmp就分布在這個(gè)區(qū)域。

ex38dq6.BIN BIOS的主體組件。
awardext.rom、awardeyt.rom BIOS的擴(kuò)展部分。
ACPITBL.BIN 是供ACPI所使用的低級(jí)部件,可供操作系統(tǒng)使用。
PCI ROM PCI 設(shè)備的一些組件。
還有一些顯示的BMP圖片

其余組件不詳,有待了解



3、使用cbrom182來分解組件的方法:
Cbrom182 ex38dq6.f2 /XGROUP extract           分解出 awardext.rom
Cbrom182 ex38dq6.f2 /ACPI extract                 分解出 ACPITBL.BIN

    如此類推,可以逐步分解出各個(gè)組件,但是,SYSTEM BIOS組件,也即是 ex38dq6.bin 這個(gè)組件,我怎么試也沒分解出來,所以用以下推薦的方法分解。


4、推薦分解BIOS組件的方法
   使用圖形化的BIOS編輯軟件awdbedit可以很方便簡(jiǎn)單分解全部的組件。運(yùn)行awdbedit軟件,打開ex38dq6.f2,忽略掉一些警告信息,進(jìn)入后,選擇 [Actions] –> [Extract All] 就可以分解出全部的組件。





二、BIOS組件位置分析

1、ex38dq6.f2文件共1M大小,除了包含各個(gè)BIOS組件外,還充斥著大量的“填充碼”,這些“填充碼”是FF字節(jié)以及00字節(jié),主要用來分隔各個(gè)組件,以及填充文件。

2、壓縮組件是以LZH形式壓縮,每個(gè)壓縮組件以-lh5-開頭,十六進(jìn)制碼形式為 2D 6C 68 35 2D,這是壓縮組件的戳記,因此,在BIOS文件中只要尋找到這個(gè)戳記就可以區(qū)分開每個(gè)組件。


seg000:0000  24 F7 2D 6C 68 35 2D 50  54 01 00 00 00 02 00 00  $?lh5-PT.....
seg000:0010  00 00 50 20 01 0B 65 78  33 38 64 71 36 2E 42 49  ..P  ex38dq6.BI
seg000:0020  4E 24 D3 20 00 00 2D 20  8F 77 BF 74 89 29 BB AA  N$?..- 弚縯?華
seg000:0030  7F 33 33 37 37 4D 07 73  55 45 55 78 35 91 D5 66  3377MsUEUx5懻f
seg000:0040  85 B7 54 49 34 52 21 0E  9B A5 10 91 11 BC 1D 28  叿TI4R!洢??(
seg000:0050  B1 2A 66 A0 DD 5B BB BA  9C 0D 51 0C C5 17 AA F2  ?f犦[緩?Q ??
seg000:0060  FB DD BC AC AD 34 F1 55  DB 53 CC 03 DD A6 86 30  ?棘?馯跾?葒?
seg000:0070  2A CF 42 B5 DC 53 52 22  43 F0 75 84 66 40 00 77  *螧弟SR"C饀刦@.w
seg000:0080  7F FE 66 83 37 77 79 E7  9E BC F6 FF BD 7A FD EE  ??wy鐬薦

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2008-04-17 23:28 |只看該作者
途中小憩:了解幾個(gè)數(shù)據(jù)結(jié)構(gòu)



在繼續(xù)之前,先了解幾個(gè)知識(shí)點(diǎn)

一、BIOS的簡(jiǎn)短介紹。
1、IBM推出個(gè)人計(jì)算機(jī),簡(jiǎn)稱:IBM PC。定義了BIOS規(guī)范。最初的BIOS由IBM工程師獨(dú)立完成。后來為了普及IBM PC,IBM 公開了PC內(nèi)部結(jié)構(gòu)以及BIOS的編程規(guī)范,接口并鼓勵(lì)協(xié)助各廠商開發(fā)BIOS

2、各BIOS廠商迅速崛起,代表廠商有:AMI、Award、Phoenix等。逐漸發(fā)展成為一個(gè)小廠商被大廠商吞并的時(shí)代。

3、BIOS的基于工作任務(wù):
● POST:開機(jī)自檢
● 初始化階段:對(duì)DRAM、芯片組,外圍設(shè)備等設(shè)置
● 保存相應(yīng)數(shù)據(jù):在COMS RAM 及 BIOS 數(shù)據(jù)區(qū)保存相應(yīng)的數(shù)據(jù)
● 駐入服務(wù)例程:寫入中斷向量表及BIOS的中斷服務(wù)例程等



二、  中斷向量表

1、BIOS啟動(dòng)初期的一個(gè)重要工作就是在內(nèi)存最低端設(shè)置相應(yīng)的BIOS中斷向量表,若啟動(dòng)了DOS系統(tǒng),DOS的系統(tǒng)還負(fù)責(zé)設(shè)置相應(yīng)的DOS中斷向量表,典型的代表是INT 21h服務(wù)。

2、中斷服務(wù)程序獲取的算法:
● Interrupt Handler = IDTR.base + vector × vector size
● X86 支持 256(FF)中斷。
● 處理器RESET 后處于 16 位real mode,IDTR.base 初化為 0,
   因此:整個(gè)BIOS 及 DOS 系統(tǒng)的中斷向量表位于:0 + 0 × 4  ~  0 +  FF × 16,也就是 0 ~  3FFh 的物理地址。


3、BIOS及DOS的整個(gè)中斷向量表布局如下(0 ~ 3FF):

中斷號(hào)        地址        說明
00        0000        除0錯(cuò)
01        0004        單步執(zhí)行
02        0008        不可屏蔽中斷
03        000C        斷點(diǎn)調(diào)試
04        0010        溢出中斷
05        0014        BIOS打印屏幕中斷
06        0018        無效指令錯(cuò)
07        001C        無效浮點(diǎn)指令
08        0020        IRQ0 定時(shí)器中斷
09        0024        IRQ1 鍵盤中斷
0A        0028        IRQ2 串聯(lián)次中斷控制器
0B        002C        IRQ3 COM2
0C        0030        IRQ4 COM1
0D        0034        IRQ5 LPT2
0E        0038        IRQ6 軟盤控制器
0F        003C        IRQ7 LPT1
10        0040        BIOS 視頻服務(wù)例程
11        0044        BIOS 外圍設(shè)備檢查
12        0048        BIOS 檢測(cè)內(nèi)存大小
13        004C        BIOS 磁盤例程
14        0050        BIOS 通信服務(wù)例程
15        0054        BIOS 擴(kuò)展系統(tǒng)例程
16        0058        BIOS 鍵盤服務(wù)例程
17        005C        BIOS 打印服務(wù)例程
18        0060        ROM BASIC 例程
19        0064        引導(dǎo)系統(tǒng)
1A        0068        BIOS 時(shí)間/RTC
1B        006C        BIOS Ctrl-Break處理程序
1C        0070        Int 8h調(diào)用的計(jì)時(shí)子例程
1D        0074        視頻參數(shù)表
1E        0078        軟盤驅(qū)動(dòng)器參數(shù)表
1F        007C        字符點(diǎn)陣表
20        0080        DOS 程序終止
21        0084        DOS 系統(tǒng)服務(wù)例程
22        0088        DOS 程序結(jié)束地址
23        008C        DOS Ctrl-Break處理程序
24        0090        DOS 程序嚴(yán)重錯(cuò)誤處理
25        0094        DOS 讀磁盤例程
26        0098        DOS 寫磁盤例程
27        009C        DOS TSR
28        00A0        DOS 空閑中斷
29        00A4        DOS 字符輸出
2A        00A8        網(wǎng)絡(luò)接口
2B ~ 2D        00AC ~ 00B4        保留
2E        00B8        DOS Shell傳遞參數(shù)
2F        00BC        DOS 多重功能中斷
30        00C0        保留
31        00C4        DOS 保護(hù)模式接口
32        00C8        保留
33        00CC        鼠標(biāo)服務(wù)例程
34 ~ 3E        00D0 ~ 00F8        浮點(diǎn)仿真運(yùn)算攔截碼入口
3F        00FC        覆蓋管理
40        0100        軟盤中斷服務(wù)
41        0104        硬盤1參數(shù)表
42        0108        視頻中斷(用于EGA)
43        010C        EGA 參數(shù)表
44        0110        EGA 點(diǎn)陣字符表
45        0114        保留
46        0118        硬盤2參數(shù)表
47 ~ 49        011C ~ 0124        保留
4A        0128        CMOS/RTC 報(bào)警中斷
4B ~ 66        012C ~ 0198        保留
67        019C        擴(kuò)展內(nèi)存管理程序
68 ~ 6F        01A0 ~ 01BC        保留
70        01C0        IRQ8 CMOS/RTC 中斷
71        01C4        IRQ9 重定向到 Int 0A
72        01C8        IRQ10 PnP設(shè)備
73        01CC        IRQ11 PnP 設(shè)備
74        01D0        IRQ12  PS/2、USB 設(shè)備使用
75        01D4        IRQ13 數(shù)字協(xié)處理器
76        01D8        IRQ14 IDE設(shè)備
77        01DC        IRQ15 IDE 設(shè)備
78 ~ FF        01E0 ~ 03FC        保留




4、關(guān)于中斷向量表的后續(xù)話題

1)中斷向量表的重定位
     Interrupt Vector Table 的基地址存儲(chǔ)在 IDTR寄存器。Processor 復(fù)位后,IDTR.base = 0。也即中斷向量表在物理位置0地址上。中斷向量表的基地址可以通過 LIDT 指令更改。但實(shí)模式的DOS系統(tǒng)不作出任何改變。

2)中斷向量表的變遷
    保護(hù)模式的現(xiàn)代操作系統(tǒng)重新對(duì)中斷向量表進(jìn)行了定位。Interrupt Vector Table 被 Interrupt Descriptor Table 取代了。前者是存放真實(shí)的中斷服務(wù)程序的入口地址。后者是存放的稱為門符的描述符結(jié)構(gòu)。描述符定義了相應(yīng)的屬性及權(quán)限。真實(shí)的中斷服務(wù)程序被門符間接索引。

3)中斷向表的變遷
    時(shí)至今日,中斷體系的變遷,保護(hù)模式下的中斷向量的含義大部分發(fā)生了改變。如:13號(hào)向量是 #GP(General Protection)異常。發(fā)生了如系統(tǒng)數(shù)據(jù)結(jié)構(gòu)產(chǎn)生違例訪問或越權(quán)訪問等就產(chǎn)生保護(hù)異常。

4)舊的中斷向量表結(jié)構(gòu)
     舊的中斷向量表以及中斷服務(wù)程序依然位于內(nèi)存的低位。這份由BIOS維護(hù)的中斷向量表結(jié)構(gòu)只在系統(tǒng)啟動(dòng)初期產(chǎn)生一些作用。成功引導(dǎo)操作系統(tǒng)后,將被操作系統(tǒng)所拋棄,操作系統(tǒng)將建立屬于自己的一套中斷向量表以及中斷服務(wù)程序。典型的是Linux 系統(tǒng)定義了 80h 號(hào)向量作為system call 門符。




三、CMOS 數(shù)據(jù)區(qū)域
     CMOS 數(shù)據(jù)區(qū)存放一些基本系統(tǒng)數(shù)據(jù),如RTC(真實(shí)的時(shí)間戳),它是一個(gè)主板上的一個(gè)RAM,為了使CMOS RAM里面的數(shù)據(jù)不丟失,主板上提供了一個(gè)電池供電。


1、CMOS RAM 的訪問方式
     訪問 CMOS RAM 是過I/O 端口在IO Space進(jìn)行的,CMOS RAM 大小為128 字節(jié),地址范圍從0 ~ 7Fh。
● 70h 端口:這個(gè)端口是個(gè)索引地址端口,通過向這個(gè)端口輸送一個(gè)地址值,這個(gè)地址值位于 CMOS RAM里。
   地址索引值的結(jié)構(gòu)如下:
   Bit7:最高位為 NMI Disable 位。置1則 Disable NMI
   Bit6 ~ 0:CMOS RAM 地址索引,范圍從 0 ~ 7Fh
● 71h 端口:這個(gè)端口是數(shù)據(jù)端口。從這個(gè)端口獲取71h端口輸送索引地址的內(nèi)容。
● 72h 端口:這個(gè)端口如同71h端口一樣,但這個(gè)端口可以訪問整個(gè)256字節(jié)空間。也就是它的Bit7是有效索引值。
● 73h 端口:這個(gè)端口如同72h 端口一樣,獲取從72端口輸送索引地址的內(nèi)容。


錯(cuò)誤:此處有誤,謝謝 zx_wing 指出.
正確為:
● 72h 端口:這個(gè)端口如同70h端口一樣,但這個(gè)端口可以訪問整個(gè)256字節(jié)空間。也就是它的Bit7是有效索引值。
● 73h 端口:這個(gè)端口如同71h 端口一樣,獲取從72端口輸送索引地址的內(nèi)容。



2、CMOS RAM 數(shù)據(jù)內(nèi)容

地址索引        含義
00 ~ 09h     相應(yīng)的系統(tǒng)時(shí)間域

0A             Bit7:0-時(shí)間可讀 1-等待更新再讀
                Bit6 ~ 4:除法器頻率
                Bit3 ~ 0:時(shí)間中斷頻率

0B             Bit7:0-設(shè)定時(shí)間,但仍在計(jì)時(shí)狀態(tài) 1-設(shè)定時(shí)間,但在停止計(jì)時(shí)狀態(tài)
                Bit6:同期性中斷,0-Disable   1- Enable
                Bit5:時(shí)間警報(bào)中斷,0 – Disable   1-Enable
                Bit4:1-允許中斷在更新時(shí)間時(shí)  0-Disable
                Bit3:方波設(shè)定 0 – Disable  1-Enable
                Bit2:日期/時(shí)間格式  0 – BCD格式 1- Binary格式
                Bit1:時(shí)間制式  0- 12時(shí)制      1- 24時(shí)制
                Bit0:日光節(jié)約時(shí)間 0-Disable   1-Enable

0C            Bit7:IRQ標(biāo)志
                Bit6:周期性中斷標(biāo)志
                Bit5:警報(bào)中斷標(biāo)志
                Bit4:更新中斷標(biāo)志
                Bit3~0:保留

0D             Bit7:CMOS RAM內(nèi)容正常性,0正常     1-異常
                Bit6~0:保留,為0

0E             Bit7:CMOS/RTC 芯片電源,0正常   1異常
                Bit6:CMOS RAM CheckSum  0 正常  1 異常
                Bit5:CMOS RAM 配置狀態(tài),0配置與檢測(cè)的一致   1不一致
                Bit4:CMOS RAM 內(nèi)存狀態(tài),0記錄的內(nèi)存與檢測(cè)一致   1不一致
                Bit3:硬盤C啟動(dòng)狀態(tài)    0啟動(dòng)通過可Boot   1失敗,無法Boot
                Bit2:時(shí)間記錄  0 正常無誤    1記錄異常
                Bit1~0:保留,為0

0F            00: 軟件復(fù)位
                01:實(shí)模式/保護(hù)模式下發(fā)生RESET或?qū)嵞O滦酒M初始化時(shí)發(fā)生RESET
                02:實(shí)模式/保護(hù)模式下內(nèi)存檢查通過后RESET
                03:實(shí)模式/保護(hù)模式下內(nèi)存檢查失敗后RESET
                04:通過INT 19h 重新開機(jī)(Boot)
                05:清除鍵盤中斷(EOI),跳到40:67記錄的位置
                06:保護(hù)模式下測(cè)試成功后RESET跳到40:67記錄的位置
                07:保護(hù)模式下測(cè)試失敗后RESET
                08:由POST切到保護(hù)模式下進(jìn)行內(nèi)存檢測(cè)
                09:BIOS INT1使用
                0A:返回跳到40:67記錄的程序入口
                0B:IRET回到40:67 記錄的程序入口
                0C:RET回到40:67記錄的程序入口

0D~FF:     上電時(shí)初始復(fù)位

10h ~ 2Fh   ISA系統(tǒng)配置

30h ~ 3Fh    BIOS設(shè)置

40h ~ 7Fh   芯片組配置




四、BIOS 記錄數(shù)據(jù)區(qū)域

1、如下圖所示,緊接著中斷向量表結(jié)構(gòu)的是BIOS用來記錄數(shù)據(jù)的區(qū)域,地址范圍:400h ~ 600h 共 512 字節(jié)。這個(gè)區(qū)域被 BIOS 用來檢測(cè)系統(tǒng)狀態(tài)而記錄使用的區(qū)域,以及 BIOS 定義的某些數(shù)據(jù)結(jié)構(gòu)(例如:鍵盤緩沖區(qū))。


2、在 BIOS 執(zhí)行初期 BIOS 將檢測(cè) BIOS 數(shù)據(jù)區(qū)域的某些數(shù)據(jù)確定當(dāng)前機(jī)器狀態(tài)。例如:BIOS 通過檢查 [0472] 的內(nèi)容是否是 1234H 從而確定機(jī)器是熱啟動(dòng)還是冷啟動(dòng)。

3、BIOS 定義了鍵盤緩沖區(qū)在 01Eh 開始的 32 個(gè)字節(jié)的。







.

[ 本帖最后由 mik 于 2008-4-30 19:13 編輯 ]

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2008-04-21 01:33 |只看該作者
        第三站 跟著流程走(一):
                                    far jmp后發(fā)生什么?





接下來用IDA pro打開ex38dq6.BIN觀察,這個(gè)是BIOS的主體文件,跟著流程走,看看far jmpBIOS做什么工作。




一、下面是第一張流程圖:



1、第一條指令 jmp far ptr F000:E05B 經(jīng)過幾個(gè)跳轉(zhuǎn),跳到F000:F46C
2、以下是F000:F46C的代碼:

seg000:FF46C                 cli
seg000:FF46D                 cld
seg000:FF46E                 xchg    bx, bx
seg000:FF470                 smsw    ax
seg000:FF473                 test    al, 1
seg000:FF475                 jz      short near ptr 0F480h
seg000:FF477                 cli
seg000:FF478                 mov     al, 0FEh ; '?
seg000:FF47A                 out     64h, al         ; AT Keyboard controller 8042.
seg000:FF47A                                         ; Resend the last transmission
seg000:FF47C                 cli
seg000:FF47D                 hlt
--------------------------------------------------------------

   取機(jī)器狀態(tài)字,也就是CR0寄存器,測(cè)試CR0.PE是否為1,判斷CPU是否處于實(shí)模式狀態(tài),若不是則停機(jī)。
若處于實(shí)模式轉(zhuǎn)到F000:F480繼續(xù)處理。

3、轉(zhuǎn)到F000:F480又經(jīng)過一道跳轉(zhuǎn),來到F000:E043進(jìn)行處理

4、下面是F000:E043的代碼:

seg000:FE043                 mov     al, 8Fh ; '?   ; disable NMI# and get 0Fh offset register
seg000:FE045                 out     70h, al         ; CMOS Memory:
seg000:FE045                                         ;
seg000:FE047                 out     0EBh, al
seg000:FE049                 in      al, 71h         ; get OFh offset register data
seg000:FE04B                 out     0EBh, al
seg000:FE04D                 or      al, al          ; is RESET ?
seg000:FE04F                 jmp     near ptr 0F483h


在這里,取 CMOS RAM 中位于0F1個(gè)字節(jié)的數(shù)據(jù),通過測(cè)試這個(gè)字節(jié)是否為0,判斷是否屬正常啟動(dòng)。

5、正常啟動(dòng)的話,調(diào)用F000:54DE這個(gè)子過程進(jìn)行處理,否則跳到F000:3468。





二、下面看看F000:54DE的處理,以下是第二張流程圖:



下面proc_F54DE的代碼:

seg000:F54DE                 mov     ax, 0
seg000:F54E1                 mov     es, ax
seg000:F54E3                 cmp     word ptr es:472h, 1234h
seg000:F54EA                 jnz     short near ptr 54F8h
seg000:F54EC                 mov     al, 8Fh ; '?
seg000:F54EE                 out     70h, al         ; CMOS Memory:
seg000:F54EE                                         ;
seg000:F54F0                 out     0EBh, al
seg000:F54F2                 mov     al, 0AAh ; '?
seg000:F54F4                 out     71h, al         ; CMOS Memory:
seg000:F54F4                                         ;
seg000:F54F6                 out     0EBh, al
seg000:F54F8                 mov     dx, 3C4h
seg000:F54FB                 mov     al, 1
seg000:F54FD                 out     dx, al          ; EGA: sequencer address reg
seg000:F54FD                                         ; clocking mode. Data bits:
seg000:F54FD                                         ; 0: 1=8 dots/char; 0=9 dots/char
seg000:F54FD                                         ; 1: CRT bandwidth: 1=low; 0=high
seg000:F54FD                                         ; 2: 1=shift every char; 0=every 2nd char
seg000:F54FD                                         ; 3: dot clock: 1=halved
seg000:F54FE                 inc     dl
seg000:F5500                 in      al, dx          ; EGA port: sequencer data register
seg000:F5501                 or      al, 20h
seg000:F5503                 out     dx, al          ; EGA port: sequencer data register
seg000:F5504                 call    near ptr 76FBh
seg000:F5507                 retn



1、BIOS數(shù)據(jù)區(qū)的0472處存放著一個(gè)復(fù)位標(biāo)志:
       seg000:F54E3    cmp  word ptr es:472h,  1234h

    通過比較 [0472] 是否1234h,標(biāo)志1234h是一個(gè)熱啟動(dòng)標(biāo)志位,機(jī)器熱啟動(dòng)時(shí),例如:按下CTRL+ALT+DEL 三個(gè)鍵時(shí),由鍵盤中斷處理程序在[0472]處寫標(biāo)志1234h

2、是熱啟動(dòng)的話,將寫入AA標(biāo)志到CMOS RAM 0F處。
3、接著設(shè)置EGA相應(yīng)的工作狀態(tài)。
4、proc_F76FB過程里置定時(shí)器1的狀態(tài)。
5、最后調(diào)用過程proc_F2941進(jìn)行芯片組的初始化。





三、下面是本站節(jié)的重點(diǎn),初始化某部分芯片組,下面是流程圖:




1、下面重點(diǎn)理解 write_pci_byte這個(gè)BIOS提供的rontine,代碼如下:

seg000:FF798                 xchg    ax, cx          ; write_byte routine
seg000:FF799                 shl     ecx, 10h
seg000:FF79D                 xchg    ax, cx
seg000:FF79E                 mov     ax, 8000h       ; Bus 0
seg000:FF7A1                 shl     eax, 10h
seg000:FF7A5                 mov     ax, cx
seg000:FF7A7                 and     al, 0FCh
seg000:FF7A9                 mov     dx, 0CF8h       ; config_address register
seg000:FF7AC                 out     dx, eax
seg000:FF7AE                 add     dl, 4           ; config_data register
seg000:FF7B1                 mov     al, cl
seg000:FF7B3                 and     al, 3
seg000:FF7B5                 add     dl, al
seg000:FF7B7                 mov     eax, ecx
seg000:FF7BA                 shr     eax, 10h
seg000:FF7BE                 out     dx, al
seg000:FF7BF                 retn


將這個(gè)routine功能簡(jiǎn)化為C代碼形式來看比較直觀:

void wirte_pci_byte(int offset_number, int mask)
{
         if (number == -1)
              jmp_7666();

         do_wirte_pci_byte(offset_number, mask);
}


    這段routine固定寫PCIBus0,Device0,Function0,offset 值放在cx中,由調(diào)用者傳來,置什么值放在al寄存器,這是1個(gè)字節(jié)的值。
        Bus0,Dev0,Fun0hostbrige控制器(NorthBridge),也即是DRAM控制器的地址所在。這段代碼是典型的寫PCI設(shè)置的手法。PCI設(shè)置地址送入config_address_register中,然后往config_data_register里寫數(shù)據(jù),這個(gè)PCI設(shè)備地址將映射到PCI設(shè)備的寄存器,如前面介紹的地址空間圖所示,PCI設(shè)備地址范圍是E000_0000 ~ EFFF_FFFF,這段空間提交到相應(yīng)的PCI設(shè)備。

2、現(xiàn)在回過頭來看調(diào)用者,cx=95,al=33 這個(gè)參數(shù)傳給 write_pci_byte。Offset95,mask碼是33Offset 95write_pci_byte將被置為94,這將是DRAM控制器的PAM4寄存器,PAM4寄存器控制D_8000 ~ D_FFFF內(nèi)存空間的屬性。寫入33,結(jié)果是:將這段空間置為read/write屬性,這將是所有訪問這段空間的操作會(huì)提交到DRAM。而不再是ROM。

3、Offset 96的結(jié)果和offset 95一樣,在write_pci_byte的掩碼中被置為offset 94。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2011-04-18 16:03 |只看該作者
茅塞頓開,若有所得  拜讀了 謝謝!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP