X86結構的今生前世

總線:CPU和其他設備的高速通道;

CPU:

運算單元:負責運算、加法位移等

數據單元:CPU內部的緩存和寄存器組,存取速度快,存放數據和運算結果;

控制單元:通過獲取指令、執行指令;

 

進程切換:CPU裏有兩個寄存器,專門保存當前處理進程的代碼段的起始地址、以及數據段的起始地址。這裏面寫的都是進程A,說明當前執行的進程都是進程A的指令,等切換到進程B,就會執行B的指令,這叫做進程切換。

 

總線分爲

地址總線:傳輸地址數據;地址總線的位數決定訪問的地址範圍有多廣,位數越多,能夠訪問的位置就越多,能管理的內存的範圍也就越廣;

數據總線:傳輸數據;數據總線的位置決定一次能拿出幾個數據進來,位數越多,一次拿的數據就越多,訪問速度也就越快;

 

8086的原理

 

X86有8個16位的通用寄存器,即CPU內部的數據單元,分別是 AX、BX、CX、DX、SP、BP、SI、DI 這些數據在計算過程中暫存數據。

其中 AX、BX、CX、DX 可以分成兩個 8 位的寄存器來使用,分別是 AH、AL、BH、BL、CH、CL、DH、DL,其中 H 就是 High(高位),L 就是 Low(低位)的意思;

 

IP寄存器就是指令寄存器Instruction Pointer Register,指向代碼段中下一條指令的位置,CPU 會根據它來不斷地將指令從內存的代碼段中,加載到 CPU 的指令隊列中,然後交給運算單元去執行;

 

每個進程都分代碼段和數據段,爲了指向不同進程的地址空間,有四個 16 位的段寄存器,分別是 CS、DS、SS、ES。

CS :代碼段寄存器Code Segment Register

DS:數據段寄存器 Data Segment Register

SS:棧寄存器 Stack Register—— 數據的存取只能從一端進行,秉承後進先出的原則,push 就是入棧,pop 就是出棧

A調用B,B調用C——當A要執行B時,A相關的運行信息會被push到棧中,同樣B要執行C時,B相關的信息要被push到棧中;當C執行完,先pop出現的是B,當B執行完最後pop出來的是A。

運算中需要加載內存中的數據,需要通過 DS 找到內存中的數據,加載到通用寄存器中。對於每一個段都有一個起始地址,段內的具體位置,我們稱爲偏移量(Offset)。代碼段的偏移量在 IP 寄存器中,數據段的偏移量會放在通用寄存器中。

32位處理器

通用寄存器進行擴展,將8個16位的擴展到了8個32位的,保留了8位和16位的使用方式;

CS、SS、DS、ES 仍然是 16 位的,但是不再是段的起始地址。段的起始地址放在內存的某個地方。這個地方是一個表格,表格中的一項一項是段描述符(Segment Descriptor)。這裏面纔是真正的段的起始地址。而段寄存器裏面保存的是在這個表格中的哪一項,稱爲選擇子(Selector);將一個從段寄存器直接拿到的段起始地址,變成了先間接從段寄存器中找到表格中的一項,再從表格中的一項中拿到段起始地址。

 

- 16位爲實模式, 32位爲保護模式

- 剛開機爲實模式, 需要更多內存切換到保護模式

補充學習連接:http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

《深入理解操作系統》第三章

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章