計算機原理學習(序)
序言
又有兩年沒有寫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本了,雖然只是了解性的看了看。
計算機原理學習(6)-- x86-32 CPU和內存管理之分頁管理
計算機原理學習(7)-- x86-32 CPU和內存管理之分段管理
計算機原理學習(8)-- 進程的內存映射和內存共享
計算機原理學習(9)-- 可執行文件的編譯和結構
計算機原理學習(10)-- 可執行文件的加載和運行
計算機原理學習(11)-- 進程的內存布局
(TBD) 2014.4.26 Update