Re: [問題] 書籍評價詢問

看板LinuxDev作者 (提拉米蘇好好吃喔)時間9年前 (2014/07/15 22:14), 9年前編輯推噓22(2202)
留言24則, 23人參與, 最新討論串3/4 (看更多)
昨天回應了文章以後,有些朋友私下請教我一些問題。這邊我再多分享一些心得。 其實在台灣做真正的kernel研發沒幾間公司有。就我所知就Qnap, MTK, Marvell,再來就 是一些ic design house會寫自己的driver,像是Realtek之類的。Driver需求其實很高。 所以長期來看想做純kernel的研發,在台灣機會很少。扯遠了。來談談怎麼增進自己的 Kernel/Driver能力。 1) C語言要弄熟,就K&R。 2) 訂閱Linux kernel mailing list,如:Linux-kernel, Linux-usb, Linux-arm...閱讀 mailing list你可以知道最新的發展,還有send patch的rule是什麼。往後遇到問題,也 可以直接用gmail查詢,不用再到網路上查。重要的人物像是Linus或者是某個subsystem的 maintainer你也可以直接對他的mail做filter,之後就可以到label底下watch他的動態。 還有就是對岸的Chinaunix的內核版也是不錯的。 可以閱讀kernel source底下的: Documentation/SubmittingPatches 查詢怎麼用:scripts/checkpatch.pl How to send patches: http://www.tuxradar.com/content/newbies-guide-hacking-linux-kernel 3) 訂閱LWN, 包含Daily news, bi-weekly news。如果沒有花錢不會有weekly,但至少兩 個禮拜看一次不會lag太多。也會知道最新的版本和大家討論的問題。對了,如果要知道 最新的version可以訂閱 linux-kernel-announce@vger.kernel.org ,這個會比Linus本 人的announce還要快,估計Linus是把announce commit放到git repositories以後 script自動就會送出mail announcement。 4) 要了解distribution Kernel怎麼build或者怎麼build uptream kernel之後安裝到自 己的PC上面。比方說我自己是用Ubuntu當作工作機,所以有時候會測試Ubuntu Kernel和 Upstream Kernel做bisect找bug。 怎麼build mainline kernel的debian packages:(build好以後可以直接裝deb檔,deb檔 的優點是可以用dpkg -P xxx or apt-get purge 反安裝,不像傳統的make install管理 上不方便) https://wiki.ubuntu.com/KernelTeam/GitKernelBuild 怎麼build Ubuntu kernel: https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel 個人是認為至少要會兩種arch的流程比方說x86(pc) & arm。x86是平常自己使用的架構, arm也許是工作上或者是興趣自己研究。但唯有真正的使用自己build的kernel才會有感覺 Kernel改進什麼,什麼地方有bug。 什麼?閒太慢?! 你可以使用ccache or distcc加快build code的速度尤其是ccache非常實用。 用apt-get install ccache,之後修改Makefile --HOSTCC = gcc ++HOSTCC = ccache gcc >8---------------------------------8< --CC = $(CROSS_COMPILE)gcc ++CC = ccache $(CROSS_COMPILE)gcc 什麼?還是太慢?!! cd kernel/source/code copy /boot/config-xxxx .config make olddefconfig make localmodconfig -j`getconf _NPROCESSORS_ONLN` 千萬別傻傻的照著Ubuntu default config照單全build。 如果是測試的機器上面沒有kernel source code,可以先用sshfs遠端mount。但最好要 區網,否則慢到不行,不然倒不如git clone下來。 這個做出來的config就會小很多,因為Ubuntu的config會多build很多modules。經過試驗 ,debian package從6xxMB降到60MB。 如果你要做nfsroot可以改用make localyesconfig。只是要記得下之前先把要用的東西都 叫起來,比方說,usb pen先插一下,否則會沒有vfat。 你問我怎麼知道這些config?? 無聊就make help一下,把覺得有用的都背下來 XDDD 隨便google一下,找到的ccache教學: http://www.vflare.org/2009/03/ccache-to-speed-up-linux-kernel-compile.html 怎麼寫hello world module (網路上一堆範例,隨便google一個參考看看): http://www.thegeekstuff.com/2013/07/write-linux-kernel-module/ 5) 學會用git,參考書之類像是pro git,連接一堆免費的,可以去amazon看評價,之後 抓電子書看。進階以後可以直接訂閱git mailing list看最新的開發status,和新的功能 。光是看Junio C Hamano的mail就可以學到超多觀念,他圖畫的超好。非常推薦訂閱!! (git真的非常非常非常重要) http://it-ebooks-search.info/search?q=git 6) 找一個editor把他弄熟,之後不要換來換去,因為同樣就是editor,有的人用就可以 用的出神入化。但通常在Linux上面是用VIM,比較常用的就是trinity, ctags, cscope, easymotion之類的。可以在kernel source root底下下 make tags cscope -j`getconf _NPROCESSORS_ONLN` 這樣就只會build x86。如果想只 build ARM的可以加上ARCH=arm。想要全部都build可以用ctags -R && cscope -Rbq &。 推薦:http://vimawesome.com/ 7) 增強OS,Architecture。怎麼說呢?在學校裡面如果沒有碰kernel只讀os & arch會 比較沒有感覺。但真正在做kernel以後你如果有看過arch底下的code,比方說開機的時候 arch/arm(x86)/kernel/head.S會填page table做一個temporary的mapping,這時候就會 感覺到arch學的page table, tlb和os恐龍本page table是怎麼協同合作。當然像是要 看懂scheduler, context switch, interrupt, virtual memory, page fault,基本的 恐龍本和hennessy算盤本最好都要很熟悉。如果想深入柱子本也可以看一下。有些人可能 會覺得做driver幹嘛懂那麼多,做kernel幹嘛要懂那麼多?只能說有機會做到DMA的傳輸 使用了non-cacheable的cache attribute的時候,你誤用了cacheable。或者是在看 memory management的時候看到code裡面有alignment由於false sharing(?!)的原因。這 時候就會知道arch的重要性。 在看x86 .s的時候要參考底下IA spec, system programming那本: http://ppt.cc/Z5MG 以前剛開始學kernel的時候,曾經寫過一個x86簡單os是參考楊文博的自己動手寫操作系 統: http://ppt.cc/oNbR arm的spec可以到info center去註冊就可以下載: http://ppt.cc/Xp2X 再來分享一下,個人是利用進修Ph.D.的方法,強迫自己考資格考。(os, arch, compiler , algo) 強迫自己再加強一下基本技能。 8) 熟悉administrator的基本技能。比方說基本的htop, top。有人會覺得不是專門做 administrator的工作為何要熟悉?因為熟悉user space的tool才能知道怎麼上層怎麼使用 kernel。 推薦兩本: The Linux commandline: http://it-ebooks.info/search/?q=linux&type=title&page=5 Unix and Linux administration handbook: http://ppt.cc/uvlK 推薦一個網站: Commandlinefu:(建議把前幾頁常用的都背下來) http://www.commandlinefu.com/commands/browse/sort-by-votes 9) 熟悉Shell script。因為很多上層的initializing process都是用shell scripts。比 方說你可以把initramfs解開upstart的init就是用shell script。熟悉script有助於你 簡化日常工作。簡化build code,安裝deb檔的麻煩程序。當然最後awk, sed都是跑不掉。 10) 熟悉debug,像之前提到的debug hacks,這邊再提一下還有kernel底下的 /sys/kernel/debug/tracing內容都可以好好研究一下。像是ftrace可以動態filter想要 知道的function call path,以及每個function的執行時間。kprobe可以動態的插入 code去取出變數印出值或者改變code執行的path。並不需要重新編譯。在x86底下trace code很方便。像是最近suse丟出的kgraft and redhat的kpatch可以動態修改kernel code,有興趣也可以研究看看。再來coredump一定要看的懂,要知道怎麼用addr2line 還原到原本的執行c code。還有gdb, strace, systemtap, crash, sysrq...太多了, 可以看debug hacks。很多都有寫到。可以用qemu或者是vmware開gdb server,做遠端 single step debug。就可以從開機一步步看過來。 Ftrace: Debugging the kernel using Ftrace - part 1 [LWN.net] http://lwn.net/Articles/365835/ Debugging the kernel using Ftrace - part 2 [LWN.net] http://lwn.net/Articles/366796/ Secrets of the Ftrace function tracer [LWN.net] http://lwn.net/Articles/370423/ Kernel source下面的: Documentation/trace/ftrace.txt Kprobe: Documentation/trace/kprobetrace.txt 這裡面一堆sample,可以直接拿來用: samples/kprobes/ dynamic debug也不錯用,如果有使用dev_dbg() or pr_debug()就可以動態打開debug messages: Documentation/dynamic-debug-howto.txt 這篇可以快速入門一下(The dynamic debugging interface): http://lwn.net/Articles/434833/ Kgraft V.S. Kpatch http://ppt.cc/Terq vmware remote gdb debug http://ppt.cc/cj0O 10) 熟悉system call,理由就像是上面說的,因為不只要熟悉kernel怎麼運作,也要知 道上層怎麼用,不然會有見樹不見林的感覺。打個比方,在user space使用malloc(), 在glibc那裡有個簡單的memory allocator最後會call sbrk()/brk(),進入到kernel裡面 用mmap的方式調大size。一開始並沒有相對的mapping,等到page fault發生才使用 anonymous fault的方式把page接上去。<---這樣整體看才會有感覺 推薦TLPI, The Linux Programming Interface (man的maintainer, Michael Kerrisk寫的 ): http://ppt.cc/g~IL 11) 最後就是針對特定的sub-system去研究,記住,沒有人懂所有的東西。kernel兩千 多萬行 http://www.ohloh.net/p/linux 。沒有什麼人是kernel的全面專家,你看mailing list上面maintainer有時候也會說他不熟悉這塊,要請這個專家出來解釋。像是在PCI mailing list上面我就遇到acpiphp的接口maintainer Bjorn也說他不熟。 "I'm not familiar with that path, so either you'll have to narrow it down, or we can hope that Yinghai or Rafael has some insight." http://www.spinics.net/lists/linux-pci/msg31467.html 所以引用已故steve jobs的話:Stay hungry, Stay foolish!! 洋洋灑灑打了一大堆,感覺其實也沒什麼東西,只是整理資料給剛入門的人參考,希望對 大家有幫助。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.35.245.81 ※ 文章網址: http://www.ptt.cc/bbs/LinuxDev/M.1405433684.A.BBD.html

07/15 22:43, , 1F
太神了吧......大感謝!
07/15 22:43, 1F

07/15 23:13, , 2F
Wow~~~
07/15 23:13, 2F

07/15 23:33, , 3F
太猛了~~
07/15 23:33, 3F

07/15 23:43, , 4F
有神!我拜~
07/15 23:43, 4F

07/15 23:44, , 5F
M起來啦!!!
07/15 23:44, 5F
※ 編輯: mimi0213 (114.35.245.81), 07/16/2014 00:51:57

07/16 01:35, , 6F
還有晶心(沒進mainline,據說申請中?)和已故Sunplus
07/16 01:35, 6F

07/16 10:53, , 7F
對吼,還有晶心,怎麼忘了前東家XD。toolchain已經進了
07/16 10:53, 7F

07/16 13:44, , 8F
靠...這篇有點神阿...>"<
07/16 13:44, 8F

07/16 16:59, , 9F
太有幫助了 推~
07/16 16:59, 9F

07/16 18:19, , 10F
有神啊!!!
07/16 18:19, 10F

07/17 10:27, , 11F
推!
07/17 10:27, 11F

07/18 01:44, , 12F
推,這篇真的很棒!!
07/18 01:44, 12F

07/18 12:06, , 13F
大推~~
07/18 12:06, 13F

07/18 13:00, , 14F
跪拜
07/18 13:00, 14F

07/18 15:18, , 15F
太強了 讓我拜一下!
07/18 15:18, 15F

07/19 00:12, , 16F
有看有推A_A
07/19 00:12, 16F

07/19 22:54, , 17F
已跪 <(_ _)>
07/19 22:54, 17F

07/20 14:21, , 18F
推!! 感謝
07/20 14:21, 18F

07/23 10:32, , 19F
只能推了
07/23 10:32, 19F

07/25 14:43, , 20F
太強大了!
07/25 14:43, 20F

07/27 09:28, , 21F
感謝推
07/27 09:28, 21F

08/02 23:31, , 22F
推!!
08/02 23:31, 22F

09/21 01:05, , 23F
09/21 01:05, 23F

06/02 11:07, , 24F
剛想學看到這篇給跪了!!!
06/02 11:07, 24F
文章代碼(AID): #1JnJTKkz (LinuxDev)
文章代碼(AID): #1JnJTKkz (LinuxDev)