不远复和蒙以养正
我非常喜愛《易經》,買了很多關于《易經》的書。為什么學習《易經》呢?目的不是為了要學如何算卦,而是想通過它了解古人的觀點?;蛘哒f,我是把《易經》當作哲學和歷史來讀的,“好易而不占”。
《易經》里有很多富有內涵的話,比如大家熟悉的厚德載物,自強不息,等等。今日標題中的兩個詞“不遠復”和“蒙以養正”也都出自《易經》這個文化寶庫。
“不遠復”出自《易經》的復卦,基本的意思就是,“沒走多遠就要回頭看看”,經常回顧走過的路,思考反省,看看是否偏離了方向。
理學家朱熹很喜歡這句話,把它寫成大字,掛在自己的書堂中,目的是提醒自己要經常反省,糾正錯誤,不要背離根本。
其實,“不遠復”對于治學和做軟件也是很有價值的。
經過幾十年的快速發展,關于軟件的知識庫已經非常巨大,而且幾乎每一分鐘都還在增加新內容。
回想我剛畢業的90年代,流行的編程語言就那么一兩種,操作系統方面也主要是Windows一種(少量Unix),芯片方面主流的就是x86。而今天,形勢已經大不相同,每個層面都“多頭化”,而且層次的數量還在增多。
這意味著,對于今天的新手來說,可以選擇的方向更多了,要學習的內容也更多了。方向多是好事,但是要學的東西多就未必好了。一則可能導致不知道要學什么,茫然不知何從下手。另外也可能學的內容不合適,花了很多時間,但是收益不大。也有可能辛辛苦苦學的東西沒過多久就過時了。
這幾年與一些大學生和年輕同行做過一些交流,發現的一個普遍問題是“根基薄弱”,對計算機系統的底層原理知之甚少。比如,很多人對進程空間、虛擬內存、頁錯誤這樣的基本概念都模糊不清,對cache機制、中斷管理和硬件結構就更知之甚少了。
對于《易經》的64卦,我比較熟悉的另一卦是“蒙”卦。
上面的三爻代表山,下面的三爻代表水,山水朦朧,比喻事物的初生狀態,卦辭則闡述先哲們的教育觀?!胺俏仪笸?#xff0c;童蒙求我”,意思是學習這件事,學生要掌握主動權。“蒙以養正,圣功也”是對老師的鼓勵,意思是“教育這件事可以培養正氣,也很有功德的”。或許是受了這句話的鼓舞,這些年我一直很熱心于知識傳播,把自己對軟件的一些理解和認識分享給同行們。廬山研習班便是一種形式。
《論語》的為政篇有句名言,叫“君子不器”。意思是人不要像器皿那樣只有一個用途,不要把自己局限在一個作用上。更進一步的說,是鼓勵知識分子不要只讀書本,只顧自己,要為社會,為他人做些貢獻。
上面這些想法在我腦海中很久了,時不時就浮現出來。2020年太特別了,微小的病毒搞亂了這個世界,也觸發我們重新思考一些基本的問題。在這樣的背景下,大約三周前的一個晚上,我的腦海中突然冒出一個方案,這個方案把積蓄許久的空想夯實,成為一個計劃,這個計劃便是把我對計算機系統的理解和認識打造成一個講座,這個講座每年更新一個版本,堅持下去,不斷提煉,不斷改進,讓它既“營養豐富”,又容易 “消化吸收”。有了想法后,立刻落筆,便有了下面這個提綱。
基礎篇
?
第一講:萬法歸一:圖靈機和指令引擎
要點:圖靈和圖靈機,一條長長的紙帶,PC,寄存器,X86的通用寄存器,X86的常用指令,有趣的x86指令,斷點指令,滑板指令,特權指令,控制寄存器,工作模式,實模式,保護模式,SMM,MSR寄存器,讀取CPU的體溫,rdtsc
?
實驗1:在調試器下認識常用指令和重要寄存器
?
第二講:從跑到飛:中斷和陷阱
要點:不是一開始就會飛,外設和速度差異,理解飛的強需求,中斷過程,IDT表,陷阱,控制軟件,操作系統的雛形
?
實驗2:在調試器中觀察IDT表和理解中斷機制
?
第三講:離不開的棧
要點:函數,從函數返回,棧在中斷和異常時的作用,內核態棧,Linux內核中的多個特殊棧,用戶態棧,棧到底有多大,使用棧的好處,棧的安全問題,棧溢出攻擊,DEP
?
實驗3:在調試器中理解棧的自動增長和溢出攻擊
?
第四講:內存錐鑒
要點:ENIAC,馮·諾依曼架構,內存與外存,內存的速度,帶寬和通道,DDR3,DDR4和DDR5,考驗內存,有趣的memset試驗,虛擬內存與物理內存,頁表結構,頁的屬性,重要的標志位,頁錯誤,大錯誤,小錯誤,如何“玩爆”Linux的內存管理器
?
實驗4:在調試器中觀察頁表和理解頁錯誤
?
第五講:系統脊梁:PCI總線
要點:理解總線,PCI簡史,PCI標準的精髓內容,詳解PCI的配置空間,廠商ID,產品ID,設備類型,基地址(BAR),設備寄存器,訪問設備寄存器,手工控制U盤,USB控制器舉例
?
實驗5:在調試器中理解PCI總線
提高篇
?
第六講:產業格局:固件和ACPI
要點:固件的必要性,多角度理解ACPI標準,ASL,EFI和ACPI,TianoCore,ACPI的表,E820表,ACPI的標準設備,電池舉例
?
實驗6:在調試器中理解ACPI設備
?
第七講:多層接力:Cache
要點:馮·諾伊曼的偉大語言,速度之差,多層結構,代碼Cache和數據Cache,Cache的結構,局部性,如何編寫Cache友好的代碼
?
實驗7:觀察Cache的數量和結構
?
第八講:中斷控制器
要點:PIC的必要性,PIC,APIC,IOAPIC,本地APIC,APIC的重要寄存器,中斷優先級,Windows內核中的IRQL,Linux的做法,NMI,多處理器的挑戰,IPI,IPI有關的死鎖
?
實驗8:在調試器中理解APIC
?
第九講:芯片組
要點:經典的三芯片架構,神秘的主機控制器,DMI,內存控制器,MCH北移,ICH,ICH的消失和重生,PCH中的常用設備,訪問PCH中的設備,DMA,內存映射和經典IO空間,SOC
?
實驗9:在調試器下理解芯片組
?
第十講:藍丸和VMM
要點:再分層,機器層面并行,VTx,VM的Entry和Exit,VMCS詳解,虛擬機狀態(Guest-state)區,主機狀態(Host-state)區,虛擬機執行控制字段,VM-exit控制字段,VM-entry控制字段,VM-exit信息字段,XEN,Hyper-V,KVM
?
實驗10:在調試器下理解VMM
為了能讓更多人參加,講座采用線上直播和錄像的形式,內容長度為上下兩篇,十次講座,十個動手試驗,加課后問答與討論。
大綱發出后,參加過廬山研習班的格友很快理解了我的思路。
對于這個提綱,雖然只有十講,但是分量真的不輕,對于聽眾,如果能堅持下來,聽不懂的地方就提問,用心動手試驗,那么必定是有收獲的。對于我,也剛好是把多年積累的東西整理一下,系統化,條理化,并以一種新穎的方式呈現出來。
知行合一,今天動工準備講義,一天時間基本完成了第一講,主題是計算機系統的靈魂:CPU。
分成如下六個小節:
?X86基礎:常用寄存器和指令
?X86進階:特殊寄存器和特權指令
?X86進階:工作模式和SMM揭秘
?X86進階:有趣的指令
?理一分殊:擴展到ARM
?萬法歸一:圖靈和圖靈機
有些同行擔心這個課太難,聽不懂,詢問要什么基礎,我說唯一的要求是聽不懂的地方就提問。其實最重要的是誠心,真誠求知的心。
為了盡可能把一些概念說的淺顯易懂,在講義中使用了很多比喻,“用已知描述未知”。
侯捷老師在他的《深入淺出MFC》一書中有句名言:勿在浮沙筑高臺。對于每個程序員來說,深刻理解計算機系統的重要性是再強調也不過分的。夯實這個基礎,可以終生受益。
?
***********************************************************
正心誠意,格物致知,以人文情懷審視軟件,以軟件技術改變人生
歡迎關注格友公眾號
總結
- 上一篇: 在UTU-2440上移植Qtopia4与
- 下一篇: 我的一次华为虚拟化搭建记录:(一)、关于