計算機原理學習(序)
序言
又有兩年沒有寫Blog了, 這2年從做windows phone 到 Android C++, 慢慢的很多觀念也有所改變了。以前一心想做C#相關的工作,現在卻感覺,什麼語言都無所謂了。公司專案挺忙,加班比較多,不忙的時候又想休息休息。 所以blog又荒廢了好久。也很少有時間早學習, 加上年紀越來越大,學習動力和熱情也越來越小了。最近一個月不是特別忙,抽空看了看《深入理解計算機系統》、《程式設計師的自我修養》、《現代作業系統》三本書,然後順帶看了看編譯,彙編相關的知識, 也在網上查了不少資料。突然發現好多東西其實是大學裡都學過,這也算是工作6年對以前知識的一個總體的複習吧。在不同時期看相同的書,總會有不同的收穫。
對於一個應用層的開發者來說,不瞭解CPU是如何工作的,記憶體是如何佈局的,多程序是怎麼實現的並不會影響他寫出好的應用程式。就好像一個武術演員,不懂九陽神功一樣可以拍出很好的動作電影。但是看了那麼多武俠劇,那些路人甲,宋兵乙為什麼總是被大俠們狂虐?原因很簡單,他們木有內功。套路只是一方面,拼的還是內功啊。大俠們內功那裡來的?不是武二代就是出師名門,說白了還是看背景而不是背影。這種東西不是隨便教的,當然也不是誰都能學會的。恩,有點扯遠了。對於我們來說,這些知識就是我們要學習的計算機內功的一部分。雖然這些知識並不能交我們怎麼寫一個Android APP,也不能幫我們學習Web開發,就好像虛竹有了內功不會招式也是沒用的,所以要內外兼修。對於我們這些已經掌握了招式的宋兵乙來說,在沒有乾爹的情況下,就只能靠自己來修煉內功了。不奢求稱為大俠,只求3招內不被打倒。
對於計算機專業畢業的人來說,後面大部分都是學校都學過,從純硬體的類比電路,數位電路,到軟硬體相關的計算機組成原理,計算機體系結構,再就是最底層的作業系統,編譯原理,彙編,C語言,到上層存軟體的開發語言。但是很多人都覺得是枯燥的理論知識,實際這真是挺有用的東西。但是工作後基本不會接觸,所以都忘記的差不多了,看下書一段時間又忘記了,所以這次決定寫下來,算是學習筆記,也算是為一些朋友提供一個參考。
但是對於這些知識,我也純粹是一個現學現賣的理論派,我可以給你介紹一些基本的彙編命令。你就不要為難我要我用匯編寫個完整程式;我可以說說Linux裝置驅動結構,你克別要我給你的自行車也寫個驅動。 所謂術業有專攻,我們不是為了能去做硬體,寫彙編,寫驅動,所以也不要奇怪為什麼我有時還會看看Linux驅動開發的書,我可能也就是隨便翻翻,找想了解的重點看,可能1天就看完了。我們學習這個只是為了瞭解相關的知識和原理,幫助我們更好的做開發。有一層的九陽神功足以保命了,練得太多小心走火入魔。
問題
作為一個IT工程師,用現在流行的話來說,這也是個高階大氣上檔次的工作。但是你是否真的瞭解你每天都在用的計算機,你又是否真的瞭解你自己寫的程式呢?當一個人問你計算機是怎麼工作的時候,你會不會一臉茫然的想,我怎麼從來沒想過這個問題?
- 我們的程式碼是如何被編譯成可執行檔案的?
- 程式是如何被CPU執行的?
- 程序和執行緒到底是什麼東西?
- CPU的指令和組合語言和程式庫和開發語言有什麼關係?
- 為什麼系統可以同時執行多個程式,是如何做到的?
- .NET的編譯出來的是託管程式碼,和C++的Native程式碼執行有區別嗎?
- 為什麼我new了1G的記憶體空間,實際記憶體卻沒變化?
如果你能很確定的回答這些問題,那麼我有不懂的問題就應該可以向你請教了。那也麻煩你幫我找找文章中的錯誤。如果你不太清楚甚至是完全說不清,那我們就一起來學習學習。
大綱
這個系列是介紹計算機的原理,主要涉及的是軟體方面的,硬體原理只會簡單的從體系結構方面進行介紹。每一個點都不會特別深入,一方面是沒這個能力,另一方面是沒必要,因為每一個點可能都是厚厚的一本書。而且對於我這種基本和應用程式打交道的碼農來說,這個程度的瞭解也是比較合適的。整個學習過程也就是看書,查資料,再重新看書,再查資料,最後總結。裡面也會結合自己有點一點點經驗,把比較零散的點結合起來方便理解。 文章裡肯定會存在很多錯誤,希望可以指出來。
另外我把有讀到相關的書列出來:
- 《深入理解計算機系統》-- 這是外國大學的教材,可以多花點時間看,總體理解計算機體系結構和原理
- 《現代作業系統》 -- 挺不錯,幫助理解作業系統運作方式
- 《Linux核心設計與實現》--《linux kernel development》簡稱lkd ,先大概看一遍,很多地方不懂,學習了其他在重新看
- 《程式設計師的自我修養》 -- 相當好的一本書,主要介紹程式編譯和載入,瞭解程式到底怎麼開始執行
- 《Windows核心程式設計》 -- 《Windows Programming》 以前看過2遍了,看過了lkd,準備再看一邊進行對比
- 《80x86組合語言程式設計教程》 -- 回一下定址方式,暫存器的作用
- 《Linux裝置驅動開發詳解》 -- 大概瀏覽了幾章,還不錯,雖然沒做個 ,但是比較容易懂
- 《Android核心剖析》 -- 最近剛開始看,和這裡寫的東西可能沒太大關係,而且偏Framework層
- 網上搜索的文章,論壇,部落格等等....
還有一些沒讀的
- 《計算機程式的構造與解釋》-- 看了下目錄,有空再隨便翻翻
- 《深入理解Linux核心》 --《understading the linux kernel》簡稱utlk ,很經典的一本書,相對於lkd更加深入
- 《Linux裝置驅動程式》--《linux device drivers》簡稱ldd ,驅動開發,可以大概瞭解下
- 《深入分析linux核心原始碼》 -- 需要結合原始碼比較好吧,不一定會去看了
- 《深入解析Windows作業系統》 -- 《Microsoft Windows Internals》和Linux的對照著看看
- 《ARM體系結構與程式設計》-- X86弄完後瞭解下ARM架構,估計不太看得懂
主要是Linux相關的書比較多,但是後續文章中一些內容都是比較通用的,有些地方會寫出Windows和Linux的差異。其中ldd,lkd,utk三本經常看到論壇大神回答問題是說你看那看utk那裡那裡就知道了,我後來搜尋發現我也看了2本了,雖然只是瞭解性的看了看。
計算機原理學習(8)-- 程序的記憶體對映和記憶體共享
計算機原理學習(9)-- 可執行檔案的編譯和結構
計算機原理學習(10)-- 可執行檔案的載入和執行
計算機原理學習(11)-- 程序的記憶體佈局
(TBD) 2014.4.26 Update