不懂彙編可以學 Linux 內核嗎? | 知乎問答精選

 

A-A+

不懂彙編可以學 Linux 內核嗎?

2017年08月13日 知乎問答精選 暫無評論 閱讀 3 ℃ 次

最近想學習linux內核,準備看《Linux?內核完全剖析——基於0.12內核》,看了看目錄,裡面有些硬件知識。但我是不會彙編,硬件也瞭解不多

瞭解LINUX C,瞭解計算機組成原理和OS,使用過兩年linux,

不知道還需要什麼知識做基礎?

【馮東的回答(27票)】:

對於某些人來說,比如我,是絕對完全不可以的。

我讀大一的時候,複習《大學物理》曾經企圖像中學一樣把所有結論都自己推導一遍。結果差點因為時間不夠沒及格,還連累了其它科目的複習。不過這也讓我認清了自己的學習方式。我不能容忍沒有銜接的知識斷鏈。

如果兩段代碼之間的部分我不知道它們做了些什麼,那我就不舒服。我可以因為當前的主要目標不是這個而不去瞭解,但是我不能容忍我不瞭解的原因是我居然不會那門語言。

我經常遇到這樣的情況,面試的對象知識有明顯的斷鏈。他們的眼神裡充滿了『你問這個有用嗎』的神情。而我的頭腦裡充滿了『你不懂這個怎麼看得下去第二章教材』的疑問。

不懂彙編,學到的東西注定是夾生的。

比如,kenel裡到處都是的偏移量到底是什麼?讓它滑過去也能大概搞個一知半解。我的做法是看了ELF格式的說明,然後又都忘了。但是從此那些偏移量再也沒有什麼神秘感。

學會彙編,不在於你真的看懂每一句kernel裡的彙編代碼,而在於你明白自己忽略的到底是什麼。出了問題你能意識到去什麼地方尋求答案。

【甄志堅的回答(2票)】:

可以的,Linux內核裡大部分都是C語言。

建議先看《Linux內核設計與實現(Linux Kernel Development)》,Robert Love,也就是LKD。通過該書可以對Linux內核有個大體的把握。

Linux內核有很多方面,全弄懂不大現實。通過LKD有個大體印象,再深入學習感興趣的模塊,這樣比較實際。不會彙編、硬件完全可以跳過這些部分。

【謝立超的回答(1票)】:

彙編不必完全懂,AT&T寫法的x86彙編懂點最好了,我當初看ULK的時候,光第二章講頁表的,就看了兩遍,還要結合intel的手冊,才能徹底搞清楚頁表是怎麼映射的,段頁式管理是怎麼做的。當然,太細節的東西,現在都忘的差不多了。。。

【曹婷婷的回答(1票)】:

如果你只是研究linux內核,以後做基於linux內核的驅動程序開發,你讀懂那本書就可以了,不用太去理彙編的。

但是如果以後你要做基於硬件的開發,還是懂點彙編會比較容易理解一點。彙編其實很簡單,是很基礎的語言,多讀幾個程序就能懂了。

【沈偉的回答(1票)】:

linux內核本身彙編的代碼相當的少,不懂彙編語言對於你理解內核代碼不會有太多影響。但是如果懂一點彙編,理解清楚你所選擇的CPU構架,那你閱讀代碼時會更加得心應手。

【王瓏瓏的回答(0票)】:

Linux內核中有一些彙編實現的內容,不懂彙編的話這個部分可能會不容易看懂,進而影響你深入理解其他部分。

如果你只是想對內核有個大體瞭解和初步印象,就可以選擇忽略這些內容,或者直接看《Linux?內核完全剖析——基於0.12內核》關於這部分的解釋。實際上我覺得看內核源碼如果不是要做底層開發就不必要看太多細節的東西,有個宏觀把握就可以了。

因為0.12內核的代碼很少,如果想完全搞明白這些代碼,還是建議你看下彙編知識,學起來不是很難,而且你有組成原理的基礎,學習彙編完全沒有障礙,內核源碼都看了,應該也不會在乎學習彙編花的那點時間了吧。

【機械唯物主義的回答(0票)】:

linux內核就是管硬件的. 彙編就是用來管硬件的接口. 上面2個不懂雖然可以看, 但是會遇到很多問題. 還是先去弄懂點吧. 不算太複雜.

【李慕凡的回答(0票)】:

這本書我也在看,裡面涉及的彙編沒多少,但是個人覺得看內核的話,不正是要看懂機器是怎麼啟動(當然這只是初衷之一)的嗎?或者說之所以要看內核,某種意義上不正是為了明白更底層的機制是怎麼一回事嗎?如果不是這樣的話,看操作系統原理之類的書不就可以了嗎?具體的asm、C實現還看他做什麼呢?無非就是些函數的調用而已。所以在我看來彙編是要看懂的。

這本書裡涉及的彙編沒那麼多,也沒那麼複雜,基本上,隨便找些資料(書上關於彙編基礎的,感覺有點少),做到自己能編幾個彙編程序就完全夠了。這時候再看當初linus寫的那些彙編,你會發現也不過如此,內核在加載時,內存的移動也不過如此。至於各種段啊、頁啊的實現就跟玩兒似的,也太隨意了,隨便映射到同一個地址就了事。。。

PS:畢竟不是幹這一行的,這本書還沒看完,到今天中間隔了也有三個月了,挺慚愧的,希望有所幫助。嗯,繼續看,看完它!

【張雲豐的回答(0票)】:

Unix/Linux源碼有%5是彙編代碼,而95%的代碼都是C,所以你完全不用擔心學習Linux內核,另外Linux源碼雖然是用的C語言寫的,但是代碼寫得都非常精煉,沒有紮實(我說的是紮實,而不是一般的瞭解或會使用之類的,至少如果功底不夠深的話理解無法理解它的精髓)的C語言功底是無法深刻理解的。

【Koori的回答(0票)】:

這要看要求,如果不把要求放到比較高的程度,肯定是沒有問題的。

【Li Haifeng的回答(0票)】:

當然可以咯。

標籤:-學習 -馮東 -Linux -Ubuntu -mindfulness


相關資源:





給我留言