天天看點

通過CS和IP如何計算實體記憶體位址(OS)

最近在學習作業系統,回顧一下cs和ip的知識點

cs和ip是8086cup中兩個最關鍵的寄存器。它們用來訓示cpu目前要讀取的位址。在8086cpu中,任意時刻,cpu将從 (cs) x 16 + (ip) 單元開始讀取一條指令并執行。也就是說:cpu 将 cs:ip 指向的内容當作指令執行。

一般來說,cpu在通路記憶體的時候要由相關部件提供記憶體單元的段位址和偏移位址,送入位址加法器合成實體位址。段寄存器提供段位址。8086cpu有4個段寄存器:cs、ds、es、ss。典型的提供段位址和偏移位址的寄存器為cs和ip寄存器。也就是說,cpu會将cs:ip合成的實體位址指向的内容當作指令執行。

段位址 x 16 等于 左移四位

一個資料(16進制)左移1位,相當于乘以16。

一個資料 (十進制)左移1位,相當于乘以10。

一個資料(n進制) 左移1位 ,相當于乘以n。

通過CS和IP如何計算實體記憶體位址(OS)

8086cpu工作的過程可以描述如下:

1:從cs:ip指向的記憶體單元讀取指令,讀取的指令進入指令緩沖器

2:ip=ip+所讀取指令的長度,進而讀取下一條指令

3:執行指令,轉到步驟1,重複這個過程

右邊記憶體 20000h - 20009h 單元存放着可執行的機器碼。右邊是彙編代碼

舉例:前三個(第一個括号括起來的部分),内容是b8 23 01 長度是 3byte 對應的彙編代碼 mov ax,0123h

圖的執行邏輯:

1.cs ip中的内容送到位址加法器(段位址x16+偏移位址=實體位址)

(就是老師上課說的方法,cs左移加上一位+ip)

2.位址加法器将實體位址送入到輸入輸出控制電路

3.輸入輸出控制電路将實體位址20000h送上位址總線

4.從20000h開始存放的機器指令 b8 23 01通過資料總線送入cpu

5.輸入輸出控制電路将機器指令b8 23 01送入指令緩沖器

6.讀取一條指令後,ip中的值自動增加,cpu讀取下一條指令。因為目前指令的長度是3個位元組,是以ip中的值加3。此時,cs:ip指向記憶體單元2000:0003

q2的拓展:

1、請大家仔細看圖,當我看到這個圖的時候,我想到了一個問題:當cpu去記憶體去取指令的時候,如何知道取多少長度的記憶體呢?因為在圖中,取 mov ax,0123h 和 mov ax,bx 的長度是不一樣的。cpu是怎麼知道要取多少長度的呢?在我查詢資料之後,終于得到答案:

指令譯碼一般有幾個過程(部件):指令預取、指令預分析(預解碼)、解碼。預取是從cache或者記憶體取一系列的位元組(大小可以保證至少包含一條指令),并設定一個待分析的位置,預分析從此位置逐位元組分析,如果是字首就設定分析狀态(因為字首可能改變預設位址尺寸和操作數的大小,影響後續指令長度),直到不是字首,就認為是操作碼,x86的op code長度一般為1位元組,某些2位元組,查表就可以直接找出指令長度了。

2、修改cs、ip的指令不同于修改通用的寄存器值的指令,修改通用寄存器的值可以用mov 指令(mav ax,123),mov指令被稱為傳送指令。修改cs、ip的指令是jmp指令。jmp指令被稱為轉移指令。

(1)同時修改代碼段寄存器(cs)和指令指針寄存器(ip),形如jmp 段位址:偏移位址。

jmp2ae3:3,執行後:cs=2ae3h,ip=0003h,cpu将在2ae33h處讀取指令

(2)僅想修改ip的内容,形如“jmp 某一合法寄存器”,功能是用某一合法寄存器中的值修改ip的内容

jmpax,指令執行前:ax=1000h,cs=2000h,ip=0003h

指令執行後:ax=1000h,cs=2000h,ip=1000h。

3、在程式設計時,可以根據需要将一組記憶體單元定義為一個段。我們可以将長度為n(n<=64kb,因為偏移位址長度為16位,最大為64kb)的一組代碼存在一組連續、起始位址為16的倍數的記憶體單元中。這樣,這段記憶體就可以看成是代碼段,用來存放代碼的。

1、時分複用技術:多個使用者分時使用計算機的軟、硬體資源。例如:對cpu的使用,采用時間片輪的方法,同時為許多終端使用者服務,對每個使用者能保證足夠快的響應時間,并提供互動會話的功能。作業系統以時間片為機關,輪流為每個終端使用者服務。(時間片:将cpu時間劃分為多個片段。)

2、空分複用技術:存儲器的資源可以被多使用者使用。例如虛拟存儲器技術、虛拟磁盤技術。

IP