《軟體除錯》導讀之CPU篇

2022-02-28 06:46:01 字數 3059 閱讀 7985

介紹大多數軟體工程師需要補充的cpu基礎。

cpu對軟體除錯核心功能的支援。

cpu對軟體除錯擴充套件功能的支援。

cpu中用於除錯系統故障和自身問題的設施。

現代cpu和整合晶元所使用的硬體除錯方案。

針對以上目標,第2、3章是滿足目標1的,4~7章依次是滿足另外四個目標的。下面對各部分的重點內容分別略作介紹。

一、介紹乙個除錯高手應該掌握的cpu層的基礎知識。第2章和第3章是專門服務於這一目的的。除錯好比行醫看病,病人是計算機系統,要能看懂這個系統的毛病然後再對其施以**或者手術,那麼必須了解其五丈六腑的結構,血脈流通的路線,生息運轉的機理。要做到這一點,深刻理解計算機系統中硬體部分的核心——cpu——很重要。有人說,cpu是重要,但有什麼必要在一本《軟體除錯》的書中寫這個呢?除錯高手還需要數學基礎和語文基礎呢,怎麼不開兩章講講呢?這一拮問不是沒有道理,因此作者考慮到這一點,慎重選擇了要講的內容,並嚴格控制了篇幅。入選的內容要符合三個條件:一是夠重要,二是夠常用,三是與除錯密切相關。於是,《軟體除錯》最後選擇如下一些內容:

指令集的概念(2.1節):有幾次面試年輕的程式設計師時,我詢問:「你熟悉哪種cpu架構和指令集呢?」不止一次,有人不能理解這個問題。「cpu還有很多種(架構)嗎?」x86太成功了!指令是cpu的語言,理解指令集是為構築軟體知識大廈打下一塊不可少的基石。

ia-32處理器(2.2節):這也是乙個備受胡略和誤解的重要概念。有人說都進入64位時代了,還學ia-32幹嗎?殊不知,今天大多數pc使用的x64架構只是原有32位架構中的一種新的操作模式(e.g. ia-32e)。要理解x64,還需要先理解32位的情況。或者說,如果有紮實的32位基礎,那麼可以很容易理解64位,反方向則很難走通。因為長達三十多年的廣泛應用(從2023年80386的推出算起),ia-32架構對計算機的影響太深入了,甚至超出了cpu,影響到了系統匯流排和外設的設計。2.2節使用4頁半的篇幅全面瀏覽了已經推出的每一代ia-32 cpu,從386到今天的core 2系列。

cpu的操作模式(2.3節):經常遇到的重要概念,扼要介紹。

暫存器(2.4節):將ia cpu的所有暫存器分為五類做了介紹:通用暫存器、標誌暫存器、msr暫存器、控制暫存器和其它暫存器。除了介紹概念外,這一小節還有乙個目的是用作「除錯手冊」,我在除錯時,時常還翻到這幾頁內容,查暫存器的位定義。

保護模式(2.5-2.7節):這幾乎是我做面試時必問的乙個概念。深刻理解這個概念,才能深刻理解今天的計算機系統在如何求解計算機領域的乙個永恆課題——多工。保護資料是保護模式的乙個主要任務,虛擬記憶體是目前實現這一任務的主要方法。頁機制是今天所有的商業作業系統都依賴的一種機制。理解虛擬記憶體和頁機制對於軟體除錯也非常重要。因為如果搞不清楚這些概念,那麼就會被虛擬位址、線性位址、實體地址、io位址這些概念所搞暈。也不容易建立起計算機世界的空間概念——記憶體空間、程序空間等。

中斷和異常(第3章):這兩個概念有聯絡,又不同。有時又被混用,所以不少程式設計師對其模稜兩可。ia-32架構將異常分為三種,這更是很多人聞所未聞。記得有個陌生的青年寫email給我,對《軟體除錯》76頁的說法「當cpu產生異常時,其程式指標是指向導致異常的下一條指令的」提出質疑:

「cpu產生異常時,其程式指標不是指向原來那條指令嗎?」

我回信解釋說「因為異常不同,異常發生時程式指標的取值是不同的」,他更加困惑:

「我還是不能理解,難道異常還有兩種嗎?」

我知道了他迷惑的根本原因,把錶3-1「異常分類」發給了他,這下他徹底清楚了。是啊,如此重要的概念,我們的大學教育(包括電腦科學的研究生)裡根本沒有,也不能完全怪個人。

另外,3.4節的「中斷和異常優先順序」是寫給高水平讀者的較難內容。

二、cpu對軟體除錯核心功能的根本支援,即第4章。這是全書的核心內容之一,深入介紹了斷點指令、除錯暫存器和支援單步執行的陷阱標誌。這三大支援是構築今日除錯技術的三大基石,很多至關重要的除錯功能都是建立在這三個基礎之上的,包括設定斷點、變數監視、各種各樣的跟蹤執行、除錯資訊輸出、核心除錯等等。這一章共有32頁,讀者應該認真閱讀每一頁。4.4節的實模式偵錯程式例析也值得仔細讀,最好是把tim paterson先生所寫的彙編**列印出來對照閱讀(鏈結為:

),同時又可以學習彙編和欣賞大師的「手筆」。

三、cpu對軟體除錯擴充套件功能的硬體支援,即第5章。第4章介紹的根本支援是從80386開始就定形了的東西。軟體在不斷發展,除錯支援明顯跟不上速度。因此今天的除錯技術很多時候很乏力。第5章介紹的分支記錄和效能監視機制可以說是從奔騰開始的新一代處理器引入的最重要除錯支援。它是今天的大多數軟體分析(profiling)和效能調優(performance tune)工具所依賴的基礎設施。

五、硬體除錯方案(第7章)。軟體問題是千變萬化的,甚至可以說,很難找到兩個負責的軟體問題是一模一樣的。因此,不同的除錯工具和除錯技術都有它的適用範圍,不是無所不能的。比如有些問題,就適合用使用者態除錯會話來跟蹤,有些問題使用核心除錯比較合適,有些問題只使用單純的軟體偵錯程式可能根本不行。這時就要使用硬體除錯工具來幫忙。jtag是cpu和其它大規模整合晶元普遍使用的測試和除錯方案,廣泛用於除錯晶元自身、系統軟體、韌體和特殊複雜的軟體問題。從某種程度上講,基於jtag技術的硬體工具只是為偵錯程式訪問除錯目標提供了一種「硬體化」的通訊方法。在大多數情況下,還是要依賴軟體偵錯程式這樣的軟體工具來實現各種除錯。或者說,大多時候是把這種除錯方式統一到純軟體的除錯方案架構中,這樣除錯者就可以使用熟悉的除錯功能來實現除錯。比如,intel的itp工具就以com元件方式為windbg提供了服務,使windbg可以通過itp工具進行核心除錯,參見

最後想提一下2.8節——系統概貌。這一節用一頁的篇幅介紹了今天pc系統的硬體架構,也就是圖2-13。在腦海中能有這樣一幅圖對於理解計算機系統很有好處。這裡介紹了一系列常用的術語,比如南橋、北橋、匯流排、晶元組等。cpu、北橋和南橋是目前主機板上的三顆最重要晶元。即將推向市場的下一代晶元組將把北橋的功能整合到cpu和南橋中,即所謂的「雙晶元架構」,不過這仍不影響基本的概念,比如記憶體控制器(memory controller)依然存在,只不過是移到cpu內部。

筆記 設計模式之美 導讀篇

爛 的情況,比如命名不規範 類設計不合理 分層不清晰 沒有模組化概念 結構混亂 高度耦合等等 提高複雜 的設計和開發能力 讓讀原始碼 學框架事半功倍 為你的職場發展做鋪墊 如果你是乙個技術 leader,負責乙個專案整體的開發工作時,就需要為開發進度 開發效率和專案質量負責 當負責招聘時,如果你要考...

組裝電腦之CPU篇

今天記錄本黃用念力組裝電腦。主要是想細細搞懂內部,如果是想快速組裝的就不用讀下去了,本文不是裝逼篇,適用於想對計算機硬體知識有個大概了解的同學,請大家耐心閱讀,因為確實又臭又長。今天是 cpu 講解 cpu現在比較好的牌子有inter和amd,本人以及周圍同學都用的inter。inter的話牌子比較...

ios基礎之除錯篇

1.常用3種斷點 檔案行斷點 在某一行 處的斷點 符號斷點 可以定位到某些方法 異常斷點 可以在丟擲或者捕獲異常時呼叫,可以選擇不同的語言 c c object c swift斷點 捕捉swift中的錯誤 測試失敗的斷點 還未嘗試過.2.丟擲異常 使用斷言nsassert nsassert i 95...