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