不懂彙編可以學 Linux 內核嗎?
最近想學習linux內核,準備看《Linux 內核完全剖析——基於0.12內核》,看了看目錄,裡面有些硬體知識。但我是不會彙編,硬體也了解不多
了解LINUX C,了解計算機組成原理和OS,使用過兩年linux,
不知道還需要什麼知識做基礎?
對於某些人來說,比如我,是絕對完全不可以的。
我讀大一的時候,複習《大學物理》曾經企圖像中學一樣把所有結論都自己推導一遍。結果差點因為時間不夠沒及格,還連累了其它科目的複習。不過這也讓我認清了自己的學習方式。我不能容忍沒有銜接的知識斷鏈。
如果兩段代碼之間的部分我不知道它們做了些什麼,那我就不舒服。我可以因為當前的主要目標不是這個而不去了解,但是我不能容忍我不了解的原因是我居然不會那門語言。
我經常遇到這樣的情況,面試的對象知識有明顯的斷鏈。他們的眼神里充滿了『你問這個有用嗎』的神情。而我的頭腦里充滿了『你不懂這個怎麼看得下去第二章教材』的疑問。
不懂彙編,學到的東西註定是夾生的。
比如,kenel里到處都是的偏移量到底是什麼?讓它滑過去也能大概搞個一知半解。我的做法是看了ELF格式的說明,然後又都忘了。但是從此那些偏移量再也沒有什麼神秘感。
學會彙編,不在於你真的看懂每一句kernel里的彙編代碼,而在於你明白自己忽略的到底是什麼。出了問題你能意識到去什麼地方尋求答案。如果你只是研究linux內核,以後做基於linux內核的驅動程序開發,你讀懂那本書就可以了,不用太去理彙編的。
但是如果以後你要做基於硬體的開發,還是懂點彙編會比較容易理解一點。彙編其實很簡單,是很基礎的語言,多讀幾個程序就能懂了。
linux內核本身彙編的代碼相當的少,不懂彙編語言對於你理解內核代碼不會有太多影響。但是如果懂一點彙編,理解清楚你所選擇的CPU構架,那你閱讀代碼時會更加得心應手。
跳過彙編完全沒問題, 事實上當你越過體系結構相關的代碼之後, 需要彙編的地方很少. 而體系結構相關的代碼又沒啥學習的意義. 至少我不覺得初學者應該在那部分代碼上花費太多時間.
其實學習那部分體系結構相關的代碼的過程, 是在了解那個架構的cpu的設計.
當然了, 我完全不懂編程, 更不懂linux內核, 以上都是我胡扯的.
這本書我也在看,裡面涉及的彙編沒多少,但是個人覺得看內核的話,不正是要看懂機器是怎麼啟動(當然這只是初衷之一)的嗎?或者說之所以要看內核,某種意義上不正是為了明白更底層的機制是怎麼一回事嗎?如果不是這樣的話,看操作系統原理之類的書不就可以了嗎?具體的asm、C實現還看他做什麼呢?無非就是些函數的調用而已。所以在我看來彙編是要看懂的。
這本書里涉及的彙編沒那麼多,也沒那麼複雜,基本上,隨便找些資料(書上關於彙編基礎的,感覺有點少),做到自己能編幾個彙編程序就完全夠了。這時候再看當初linus寫的那些彙編,你會發現也不過如此,內核在載入時,內存的移動也不過如此。至於各種段啊、頁啊的實現就跟玩兒似的,也太隨意了,隨便映射到同一個地址就了事。。。
PS:畢竟不是幹這一行的,這本書還沒看完,到今天中間隔了也有三個月了,挺慚愧的,希望有所幫助。嗯,繼續看,看完它!
文件系統、網路 這些相對統一的部分幾乎么有彙編。
cpu調度、中斷處理、內存管理,總是跟彙編分不開。
可以的,Linux內核里大部分都是C語言。
建議先看《Linux內核設計與實現(Linux Kernel Development)》,Robert Love,也就是LKD。通過該書可以對Linux內核有個大體的把握。
Linux內核有很多方面,全弄懂不大現實。通過LKD有個大體印象,再深入學習感興趣的模塊,這樣比較實際。不會彙編、硬體完全可以跳過這些部分。
彙編不必完全懂,ATT寫法的x86彙編懂點最好了,我當初看ULK的時候,光第二章講頁表的,就看了兩遍,還要結合intel的手冊,才能徹底搞清楚頁表是怎麼映射的,段頁式管理是怎麼做的。當然,太細節的東西,現在都忘的差不多了。。。
彙編在內核代碼裡面的百分比很小,碰到的時候才去查下手冊或者網上搜一下,基本沒啥大問題。但是如果懂點彙編當然有助於你對Linux內核的學習。如果你真的想學習一下彙編,王爽的《彙編語言》很值得去看看,我最開始接觸彙編語言算是從這本開始的吧。
學習Linux內核開發,你的C語言功底越紮實越好,你倒是可以多花點時間在這個上面。當然如果你對計算機體系和組成結構也了解,那再好不過了。
還有,如果你有些代碼的編譯、鏈接、裝載知識,也是會給你加分的。
也不是說學習Linux內核一開始一定要抱一本分析內核源碼的書來看,如果你沒有足夠的基礎知識做支撐的話,反而會讓你更加迷茫。開始的時候,倒不如試試跟著《Linux Device Drivers》寫幾個小模塊,一點點的接觸Linux的常用API和術語,這樣循序漸進的過程效果應該會更好。
有空的時候,翻翻《Linux Kernel Development》,等有點積累了再看《Understanding The Linux Kernel》,最好看英文版吧。
我要對你說:
不可以!!!
誠然, 內核很多部分都不用到彙編. 用的地方只有兩種:
- 與體系相關的部分, 比如處理中斷.
- 與體系無關的部分, 但使用體系相關的方法可以有效提高速度.比如對一個頁清零. 可以用C的memset函數. 但某些架構的CPU如果提供了高效的清零的指令, 那應該用它.
但是,
如果想真正去學習內核. 不會彙編, 可以斷定你會處處卡殼. 最後要麼你放棄, 要麼你不得不去找本彙編的書去看.
另外, 一個真正的內核黑客, 當然不會是樣樣俱通. 但是, 需要的時候,他能很快地去學習,並儘快的運用這些知識來解決問題.
這種精神才是學內核真正需要的. 至於知識的問題, 這個可以學!最近在看一些linux內核的資料,也做了一些小東西。
自己的感受就是,
不會彙編能不能玩內核?
能!這是肯定的。試著寫一些基於linux內核的開發,像是中斷、鎖、內存等,都可以完成的。
不會彙編能不能深入了解內核?
肯定不能!首先很多內核的調試方式就是直接讓你看彙編的(當然也有源碼級別的調試),源碼你讀著讀著就會讀到彙編去了,根本沒辦法完整的將體系串起來。不理解彙編,真的搞懂內核,是不可能的。
所以我現在正在惡補彙編。
看你的需求,需求比較深入就得學習。
我覺得沒有必要,lkd,ulk,ldd這三本書我都讀過,彙編比例很小,內存管理,文件系統部分幾乎不會涉及到彙編的東西,進程管理切換部分會有所涉及,中斷,系統調用部分會有一些,但是個人感覺只要能看懂相關章節,知道代碼意思即可。學習內核源碼本來就是一個很耗費時間,精力,腦力的事情,要是學習之前,再要求自己學下彙編,龐大的學習曲線會把人心理上給壓垮,喪失學習的動力和樂趣,可能你學完彙編,對內核已經喪失了原有的興趣,HOHO.
至於如何入門,我覺得先看LKD了解全貌,再用LDD練習實踐,對內核大體有所了解了,再看ULK,會比較好些。記住,興趣最關鍵,一開始過高的目標磨蝕了興趣卻就不好了。
是不是回答可以的人自己就這樣做的?
當然不行了!沒有彙編,好多事情你都沒辦法理解的好不好,只能停留想像階段,沒辦法看到實際的彙編代碼驗證這件事情。
學linux內核,至少要懂一種CPU的構架吧?學某CPU構架彙編也是需要的。
認同張雲豐的說法,學了彙編後看C語言的感覺是不一樣的。
linux內核就是管硬體的. 彙編就是用來管硬體的介面. 上面2個不懂雖然可以看, 但是會遇到很多問題. 還是先去弄懂點吧. 不算太複雜.
不可能的,彙編是基礎,而且光彙編不夠還有計算機結構原理也要懂,很多C語言也是內嵌彙編的,如果你不知道偏移、中斷、跳轉這些基本概念,那你啟動代碼都看不懂啊
這要看你的目標而定,不同的目標有不同的起點要求
也不太用彙編,但如果連看都看不懂有點挫了,要加油呀
每個人都有適合自己的學習方式,你可能需要找到適合自己的那一種,也許初期會比較痛苦,效果也不太好,但我覺得這也是必經的一個過程吧,過去了,知道自己適合的方式了就好了,就像高票答主那樣。
很多回答提到了彙編很重要,學習內核目的就是看懂底層機制,也有回答內核中彙編比例很低,可以忽略,我覺得彙編很重要,但重要的不是彙編本身,而是彙編背後的計算機基本組成和基本體系結構的知識。
如果你對各種定址方式很熟,如果你對DRAM原理門清,如果你對RISC/CISC的區別和優缺點爛熟於心,對中斷理解的很透徹,對cache基本原理也非常熟悉...,那麼彙編對你來說也就是需要記憶的幾個助記符而已。反過來,你彙編也學不好,內核也看不下去
通常一個操作系統有這麼幾部分:內存管理,文件系統,進程調度,設備管理,只有設備管理和硬體緊密相關,但一般也不用彙編,都是用C操作寄存器。內核用彙編主要是如下幾種情況:
1. 體系結構嚴重相關
2. 性能優化
啟動的話,bootloader做了很多工作,到kernel已經沒多少需要用彙編處理的地方了。從我個人經驗來看,彙編紮實與否,最有用的是調試一些kernel級別的bug(主要是driver了),能看懂dump,對debug很有幫助。
綜上所述,會不會彙編對你看內核影響不大,倒是操作系統原理和計算機組成原理這兩本要好好讀一讀。
如果也想學習一下彙編的話,你倒是要仔細考慮選擇哪個平台,是x86還是arm還是其他,但建議太小眾的不要選了,資源太少太痛苦。
linux kernel developer
不懂彙編完全可以學習linux 內核
首先搞清楚操作系統的幾個核心組件
1、內存管理
2、文件管理
3、進程管理
4、設備管理
okay。看了一下上面的答案,有一些說啟動的,啟動的地方確實用了一些彙編,但是這部分非常之少。
內核3大核心組件,內存管理,文件系統,任務調度,都是C寫的。
所以,不懂彙編學習內核完全沒有問題。
只是後面在學習,工作過程中,用dump什麼的,看著看著就懂了推薦閱讀: