核心沒有什麼殿堂,也並不高大上。相反的, 我更多的時候看到的是搞核心的人視野很狹窄,技術很單調,跳出核心什麼都不懂。
偽核心高手的典型特徵是:
1 不懂使用者態。(是的, 不懂使用者態的人本質上也不懂核心)
2 只會C這種最基礎最初級的語言,拒絕學習其它OO語言。殊不知,核心雖然是C,但是也處處在採用OO 的寫法。學習下高階語言拓展思維非常必要。
3 認為Linux是優雅的設計和實現。其實並不是,Linux的糟粕跟所謂的精華一樣多。比如Linux的進執行緒設計是很模糊的,一點都不清晰。但其它平臺則劃分的更清晰更自然。再比如Windows的結構化異常處理,可以說是一大創舉,Linux黨沒幾個人懂。核心裡最複雜的部分, 早就不是什麼記憶體管理,程序排程了。其實GUI才是最複雜最有挑戰的,Linux在這個領域跟win和mac 完全沒有可比性。mac os 雖然開源,但是你看他捨得公開gui部分嗎?
4 從程式碼層面講,Linux的程式碼也很垃圾。我認為Linux核心連最起碼的命名都沒有做好。比如 local_irq_save , 真的是 save 嗎 ? 其實應該是 local_irq_disable_and_save 。get_cpu 單看這函式名,你能想到其實是個關閉搶佔? 同樣的函式名,到了kvm裡又是另一個含義。在使用者態,發訊號的函式起名叫 kill, 要殺人還是咋地? 整數除0 會報錯成 float point 異常。呵呵。
那麼想成為真正的Linux核心高手應該怎麼做呢 ?
1 學習體系結構。保護模式都幾十年了,很多人對基本的執行環境切換,頁表管理,記憶體分頁分段,系統呼叫都搞不清楚。Intel 手冊第三卷 system programming guide 不敢說通讀,至少關鍵問題需要完整看一遍。不然連個自旋鎖原理都搞不清楚。
2 學習編譯原理。我這裡說的編譯原理,不是常規的前端詞法分析,語法分析,語義分析,語法樹生成。其實更主要的是後端。後端才是銜接作業系統的部分。指令選擇,指令排程,暫存器分配跟前面說的體系結構關聯緊密,相輔相成,可以互相促進理解。另外,編譯跟裝載又是一起的,而程式的裝載又是跟進執行緒的初始化,記憶體管理緊密相關的。只有把這部分徹底融會貫通才算打通任督二脈。發明UNIX作業系統的兩位老先生,你當人家只會搞核心?Ritchie發明了C語言,還寫過編輯器。編譯器前端離不開的狀態機構造技術,Thompson構造法就是Thompson發明的,人家現在還在搞go 語言。從根本上講,軟體做的事情90%以上都是形式轉化,而編譯器融合了形式轉化的大部分精華。錯過編譯器技術的人都不知道自己錯過了什麼。
3 debug,解決難題。Linux核心的書遍地都是,程式碼觸手可得。不是說你看看書,讀讀程式碼就搞懂東西了。讀來的東西太淺,寫東西才會理解深刻。我對核心理解最深刻的部分,全都是在偵錯程式裡一行一行彙編跟蹤過的部分,多少年不搞了都忘不了。linux核心裡各種奇葩的條件編譯和巢狀的宏定義往往會隱藏真相,萬事不過debug。多debug 可以更好的理解系統的ABI, 瞭解編譯器對程式碼的處理,瞭解系統結構實現的細節。說到這裡,又跟前面提到的兩點結合起來了。
4 拓展知識面。只看Linux核心侷限還是很明顯。比如Linux的中斷可以巢狀,這是為了更大的IO吞吐。而Win的中斷有優先順序,高優先順序中斷不被低優先順序中斷打斷,這是為了更好的桌面體驗。那麼MAC 是什麼選擇呢? 比如Linux 對異常的處理就是發訊號,那Win是分層的結構化的異常回調機制,哪個更好呢?再比如,PC上的作業系統,硬體抽象層(HAL)都在核心裡,而Android卻把HAL做到了使用者層,這是為什麼呢?到了核心的各個子系統,可對比的就更多了。搞Linux核心的人完全可以看看windows research kernel 的程式碼。如果你們真的看明白了,你們就會明白微軟作為一個靠敲程式碼敲出來的帝國,不是白給的。
殿堂? 不存在的,只有苦行僧。
核心沒有什麼殿堂,也並不高大上。相反的, 我更多的時候看到的是搞核心的人視野很狹窄,技術很單調,跳出核心什麼都不懂。
偽核心高手的典型特徵是:
1 不懂使用者態。(是的, 不懂使用者態的人本質上也不懂核心)
2 只會C這種最基礎最初級的語言,拒絕學習其它OO語言。殊不知,核心雖然是C,但是也處處在採用OO 的寫法。學習下高階語言拓展思維非常必要。
3 認為Linux是優雅的設計和實現。其實並不是,Linux的糟粕跟所謂的精華一樣多。比如Linux的進執行緒設計是很模糊的,一點都不清晰。但其它平臺則劃分的更清晰更自然。再比如Windows的結構化異常處理,可以說是一大創舉,Linux黨沒幾個人懂。核心裡最複雜的部分, 早就不是什麼記憶體管理,程序排程了。其實GUI才是最複雜最有挑戰的,Linux在這個領域跟win和mac 完全沒有可比性。mac os 雖然開源,但是你看他捨得公開gui部分嗎?
4 從程式碼層面講,Linux的程式碼也很垃圾。我認為Linux核心連最起碼的命名都沒有做好。比如 local_irq_save , 真的是 save 嗎 ? 其實應該是 local_irq_disable_and_save 。get_cpu 單看這函式名,你能想到其實是個關閉搶佔? 同樣的函式名,到了kvm裡又是另一個含義。在使用者態,發訊號的函式起名叫 kill, 要殺人還是咋地? 整數除0 會報錯成 float point 異常。呵呵。
那麼想成為真正的Linux核心高手應該怎麼做呢 ?
1 學習體系結構。保護模式都幾十年了,很多人對基本的執行環境切換,頁表管理,記憶體分頁分段,系統呼叫都搞不清楚。Intel 手冊第三卷 system programming guide 不敢說通讀,至少關鍵問題需要完整看一遍。不然連個自旋鎖原理都搞不清楚。
2 學習編譯原理。我這裡說的編譯原理,不是常規的前端詞法分析,語法分析,語義分析,語法樹生成。其實更主要的是後端。後端才是銜接作業系統的部分。指令選擇,指令排程,暫存器分配跟前面說的體系結構關聯緊密,相輔相成,可以互相促進理解。另外,編譯跟裝載又是一起的,而程式的裝載又是跟進執行緒的初始化,記憶體管理緊密相關的。只有把這部分徹底融會貫通才算打通任督二脈。發明UNIX作業系統的兩位老先生,你當人家只會搞核心?Ritchie發明了C語言,還寫過編輯器。編譯器前端離不開的狀態機構造技術,Thompson構造法就是Thompson發明的,人家現在還在搞go 語言。從根本上講,軟體做的事情90%以上都是形式轉化,而編譯器融合了形式轉化的大部分精華。錯過編譯器技術的人都不知道自己錯過了什麼。
3 debug,解決難題。Linux核心的書遍地都是,程式碼觸手可得。不是說你看看書,讀讀程式碼就搞懂東西了。讀來的東西太淺,寫東西才會理解深刻。我對核心理解最深刻的部分,全都是在偵錯程式裡一行一行彙編跟蹤過的部分,多少年不搞了都忘不了。linux核心裡各種奇葩的條件編譯和巢狀的宏定義往往會隱藏真相,萬事不過debug。多debug 可以更好的理解系統的ABI, 瞭解編譯器對程式碼的處理,瞭解系統結構實現的細節。說到這裡,又跟前面提到的兩點結合起來了。
4 拓展知識面。只看Linux核心侷限還是很明顯。比如Linux的中斷可以巢狀,這是為了更大的IO吞吐。而Win的中斷有優先順序,高優先順序中斷不被低優先順序中斷打斷,這是為了更好的桌面體驗。那麼MAC 是什麼選擇呢? 比如Linux 對異常的處理就是發訊號,那Win是分層的結構化的異常回調機制,哪個更好呢?再比如,PC上的作業系統,硬體抽象層(HAL)都在核心裡,而Android卻把HAL做到了使用者層,這是為什麼呢?到了核心的各個子系統,可對比的就更多了。搞Linux核心的人完全可以看看windows research kernel 的程式碼。如果你們真的看明白了,你們就會明白微軟作為一個靠敲程式碼敲出來的帝國,不是白給的。
殿堂? 不存在的,只有苦行僧。