首先,cup在執行**的時候.是按照任務執行的
每個任務有乙個任務狀態段tss
用於保護任務的有關資訊.在任務內變換特權級和任務切換的時候.要用到這些資訊.
這個就是tss任務狀態段.
而在windows 80386中.有兩種系統段.一種就是tss,另一種就是ldt
系統段描述符格式:
這個系統段和儲存段相同.
當dt = 1 表示這是個儲存段
當dt = 0 則表示這個是系統段.
而如果是系統段.那麼type屬性就很重要了.
而tr暫存器,就是儲存了當前任務段的選擇子.
而且是存放在gdt表中的.
當屬性為c的是否.則是門描述符.
格式:
門描述符的作用就是描述某個子程式的入口. 用門內的選擇子.還有偏移.利用call或者jmp可以呼叫.
也就是說當我們三環呼叫api的是否,內部會使用門來進行特權級轉換.而且門描述符記錄了引數的個數. 還會儲存 ring0的棧,
從棧裡面獲取引數資訊.
當返回的是否,呼叫 retf彙編指令,從0環切換到3環.
檢視tss屬性段.
當輸入命令 dg 0 100 則會顯示100項gdt表的內容.
其中,作業系統在做api的時候,並沒有使用門描述符來做.
我們自己可以構建乙個門描述符 .這樣當我們的三環呼叫我們的api的時候.
就可以呼叫到這個我們自己構造的門描述符了.
首先,什麼是中斷?
在我們的8086的年代裡面. 呼叫api的是否是 int 21來進行呼叫的.
這就是乙個中斷.中斷是什麼? 其實中斷就是乙個電訊號.
比如使用者操作鍵盤,鍵當被按下就會產生乙個中斷. 但是cpu能接受到這個中斷.但是不能去處理. 這個要作業系統去處理.
所以當有中斷產生, cpu就會查表 . 表內容是固定的. 作業系統會填寫函式指標. 當我們按鍵,產生中斷了. 那麼就會查表進行操作.
中斷其實也是cpu和作業系統通訊的一種機制.
比如我們的 int 3指令. 就產生乙個異常.而在cpu接受到了,就會去查表.這樣就可以處理int 3的指令了.
中斷我們說過了,是電訊號. 而表則是cpu和作業系統的通訊機制.
那麼說下異常把. 其實異常也是中斷. 只不過,我們的軟體除錯的時候.當我們的程式用內聯彙編寫的int 3的時候,就會產生斷點功能.
其實軟體產生的中斷,就叫做異常. 而且int 3指令在ring3呼叫的時候.會產生特權級改變. cpu也會固定的去查表.
在80386裡面.有兩個銀腳,是專門接受中斷訊號的.
而且80386最多接受256種中斷或者異常.
引腳:intr 專門接受中斷或者異常, 當我們呼叫cli彙編指令的時候.其實遮蔽的就是intr.不讓其接受中斷訊號.
nmi 這個也是接受的.但是不能遮蔽的. 比如我們的系統在執行中,你把記憶體條拔了.那麼就會產生電訊號.有nmi引腳傳送.
我們上面說過,中斷是cpu和作業系統通訊的一種機制.
cpu接受中斷. 那麼就要查表.而作業系統要往這個表中填寫函式指標.讓cpu去執行.
比如我們的8086cpu,呼叫api的是否,其實就是 int 21h,其實21h就是在查表.查表中的第21項.可以把錶看作成陣列.
上面說的中斷表.其實就是idt表. idt表因為在80386下,最多處理256個,所以這個idt表只有256項.
而idt表和gdt一樣.只不過idt表中儲存的是門描述符.
比如:我們的int 3斷點產生了. 那麼就回去idt表中尋找第三項.進行操作.
windbg除錯檢視.
idt表的首位址會存放在idtr暫存器中. 然後每一項都是按照門描述符來管理. 所以當我們拆出來的位址拼接成乙個完整的位址,就可以檢視完整的處理int 3斷點的**了.
當我們hook了這個第三項.那麼你的程式將永運不會產生int 3斷點.
其中,idt表中每一項都是8個位元組,因為不光要描述函式位址,還要藐視額外的屬性資訊.
第十一講 過載
過載單目運算子 單目運算子只有乙個運算元 如 a,b,i,j 等 因此過載函式只有乙個引數,如果過載函式為成員函式,還可以省約此引數。例 將 過載成友元函式。單目運算子一般過載為成員函式 include class complex void show complex operator complex...
第十一講 資料清洗
資料採集完,要進行資料清洗工作,整個資料分析過程中,資料清洗工作幾乎要佔到80 的時間。資料清洗規則總結為四個關鍵點 完全合一 1 完整性 單條資料是否存在空值,統計的字段是否完善。2 全面性 觀察某一列的全部數值,比如平均值 最大值 最小值,根據常識判斷是否有問題。如 資料定義 單位標識 數值本身...
第十一講 if分支語句
1 if單分支 語法結構 if 條件 code.code.注 1,條件是表示式,不需要用括號括起來 2,條件的結束要有冒號 3,語句塊沒有花括號,而是由統一的縮進來實現 eg1 count 89 if count 80 條件是表示式,不需要用括號括起來 print larger then 80 eg...